为了账号安全,请及时绑定邮箱和手机立即绑定

关于DOS 下用JAVA来接收输入的话可以中断吗????

关于DOS 下用JAVA来接收输入的话可以中断吗????

慕姐4208626 2023-03-18 14:10:59
用Java语言实现在dos环境下接受用户输入密码,用*号来显示.记住了,一定要用*号显示,不可以不显示!如果实在不行,可否可点其它解决方案.DOS下可以监听键盘吗!!!!!!????????还有就是希望用具体代码来说话.DOS 下用JAVA来接收输入的话可以中断吗????如何控制输入一个字符时,显示*号.String str=null;//定义个接受输入标准输入 BufferedReader stdIn=new BufferedReader(new InputStreamReader(System.in)); //这里接收输入,可以中断??try {str=stdIn.readLine();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

dos的控制台程序没试过有没有密码的
可以给你一个方案 你输入的时候print("*")
按一个键print("*")一次
然后接收输入的时候你不打印出来 而是保存成一个string 
等你调用密码的时候就调用这个string就可以了...
-------------------------------------
仔细研究了下 是没这么简单,要用线程来监听 查了些资料 给你代码
//InputMasking.java  
import java.io.*;  

public class InputMasking  
{  
String getPassword(String initial) throws IOException  
{  
MaskingThread listeningthread = new MaskingThread(initial);  
Thread thread_instance = new Thread(listeningthread);  
String password = "";  
thread_instance.start();  
while (true)  
{  
char input = (char)System.in.read();  
listeningthread.stopMasking();  
if (input == '\r')  
{  
input = (char)System.in.read();  
if (input == '\n')  
break;  
else  
continue;  
}  
else if(input == '\n')  
break;  
else  
password += input;  
}  
return password;  
}  
}  

//MaskingThread.java  
import java.io.*;  

class MaskingThread extends Thread  
{  
private boolean stop = false;  
private int index;  
private String initial;  

public MaskingThread(String initial)  
{  
this.initial = initial;  
}  
public void run()  
{  
while(!stop)  
{  
try  
{  
this.sleep(1);  
}  
catch (InterruptedException ex)  
{  
ex.printStackTrace();  
}  
if (!stop)  
{  
System.out.print("\r" + initial + " \r" + initial);  
}  
System.out.flush();  
}  
}  
public void stopMasking()  
{  
this.stop = true;  
}  
}  

//CmdLineUtility.java  
import java.io.*;  

public class CmdLineUtility  
{  
public static void main(String argv[])  
{  
InputMasking masking = new InputMasking();  
String password = null;  
try  
{  
password = masking.getPassword("请输入登录密码: ");  
}  
catch(IOException ex)  
{  
ex.printStackTrace();  
}  
System.out.println("您输入的密码为: " + password);  
}  
}  

这三个JAVA文件依次编译,运行最后一个就是


查看完整回答
反对 回复 2023-03-21
?
暮色呼如

TA贡献1853条经验 获得超9个赞

System.out.print("*");
System.in //接受键盘输入
//接受一个按键 打印 一个 * 只是接受 按键 
像Oracle 输入密码一样!!
监听 键盘就可以了
不过 你必须到 dos下面 编译 java文件
如果你是用编程工具的话 他会把 dos 环境改为
自己的环境

补充: 没有awt 或者 swing 等空间
是没有 监听 键盘的功能
方法 编译文件的时候生成控件 再隐藏进行监听
不过这样 可能被认为是毒
所以建议
JAVA里调用了C语言的getch()方法
就能实现 得到键盘值的功能

再次补充:
要实现你所说的功能就必须有一个从标准输入读取数据时不做任何缓存的方法, 
即读取一个字节后马上返回的方法(比如视窗平台上 C/C++ 头文件 conio.h 里声明的 getch( ) )。 

可惜的是,到目前为止,Java 里没有这种方法。 
就连返回一个字节的 System.in.read( ) 也要等到碰上回车才返回(行缓存,即 line-buffered)。 

所以现在你唯一的选择就是通过本机接口(JNI)调用本机方法(native method)。 
步骤有 6 个。以下是装有 VC6 的视窗平台上的实现范例: 

1)编写我们的 Java 程序。在程序里,以 native 这个关键字为将被调用的本机方法做本机声明, 
并且加载我们将在第 5 步里创建的动态连接库: 

public class PressAnyKeyToContinue { 

static native void pause( ); // 本机声明 

public static void main( String[ ] args ) { 

System.loadLibrary( "PressAnyKeyToContinue" ); // 加载我们的动态连接库 

pause( ); // 调用本机方法跟调用一般的方法没两样 



2)编译我们的 Java 程序,以便生成类文件。 

3)用 javah.exe 生成对应的 C/C++ 头文件(PressAnyKeyToContinue.h):命令是 javah PressAnyKeyToContinue 。 

4)实现头文件里声明的所有方法 / 函数(这例子用 C,所以以下的代码是在 PressAnyKeyToContinue.c 里): 

#include "PressAnyKeyToContinue.h" 

JNIEXPORT void JNICALL Java_PressAnyKeyToContinue_pause( JNIEnv * jenv, jclass jc ) { 
system( "pause" ); 


5)用编译器生成动态连接库: 
命令是 cl -Ic:\jdk2\include -Ic:\jdk2\include\win32 -LD PressAnyKeyToContinue.c 。 
(当然,假设了 c:\jdk2\ 是 JDK 的路径。) 

6)运行我们的 Java 程序。

 


查看完整回答
反对 回复 2023-03-21
  • 2 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号