这是我的代码:
public static void main(String[] args) {
String in = "";
InputStreamReader reader = new InputStreamReader(System.in);
int ch;
StringBuilder sb = new StringBuilder();
System.out.println("paste text below:");
try {
while ((ch = reader.read()) != -1 && ch != 0) {
sb.append((char)ch);
}
}catch (IOException e) {
System.err.println(e.toString());
}
}
in = sb.toString();
System.out.println(in);
}我已经调试过了,它会遍历所有内容,并在换行符上打印每个字符,但是在读完最后一个字符之后,它就会停止运行。我输入了简单的asdfasdf,并复制了独立宣言并粘贴了它。它一直跑到最后,然后停下来。
它甚至不像一个无限循环,因为我在代码的每个部分都放置了一个System.out.print("!@#$%"),它只是停止了.在我的代码中没有无限循环。我很确定InputStreamReader -- reader --被困在它自己的无限循环中,因为它永远不会返回-1。事实上,当它到达末尾时,它永远不会返回任何东西(尽管它返回循环中正确的ints/chars )。
有没有人知道发生了什么事,或者有没有人遇到过类似的问题?有没有办法解决这个问题(不要说BufferedReader,因为我需要读取多个换行符的文本,BufferedReader搜索第一个\n,所以我不能使用它)?
编辑:
我试过读到字符缓冲区,然后使用字符串生成器.没什么。
答:
您必须提供一个将中断循环的字符(否则请参阅@default的回答)。
下面是我的代码演变成的内容:
public static void main(String[] args) {
InputStreamReader reader = new InputStreamReader(System.in);
StringBuilder sb = new StringBuilder();
int ch;
System.out.println("Paste text below (enter or append to text \"ALT + 1\" to exit):");
try {
while ((ch = reader.read()) != (char)63 /*(char)63 could just be ☺*/) {
sb.append(ch);
}
reader.close();
}catch (IOException e) {
System.err.println(e.toString());
}
String in = sb.toString();
System.out.println(in);
}Alt + 1返回(至少在Windows上)返回笑脸图标,但是您可以做任何您想做的组合键,您所要做的就是找出java中的char和do while ((ch = reader.read()) != (char)charNumber。
发布于 2014-07-30 16:33:57
基本上,reader.read()内部调用InputStream.read。以下是引用文档的一段话:
从输入流读取下一个字节的数据。在0到255范围内,值字节作为int返回。如果由于到达流的末尾而没有可用的字节,则返回值-1。此方法将阻塞,直到输入数据可用、流的末尾被检测到或抛出异常为止。
换句话说,这个方法将阻止程序的执行,并永远等待您的输入。
现在您可以看到,处于当前状态的程序将永远不会停止执行:
//wait for user input forever
while ((ch = reader.read()) != -1 && ch != 0) {
//no matter what the input is just print it
System.out.println((char)ch);
} //continue waiting...可能的解决办法:
Ω时,或者当用户连续输入三次“杀死我”时,或者在200个第一个字符之后,中断循环。System.in.这种方法通常涉及到一些特定于OS/终端的攻击。看看这个问题:如何通过Windows终端发送EOF。以前也曾对Stackoverflow提出过类似的问题:
发布于 2014-07-30 16:26:27
System.in是一个BufferedInputStream,尝试如下:
System.err.println(System.in.getClass());因此,您可能会看到这种停滞的行为,因为缓冲区会等待更多的数据,有时会被刷新,有时不会。
如果System.in是用户通过键盘输入,它将停止在Ctrl(视窗)或Ctrl (*nix)。
如果要从键盘读取用户输入,则应使用控制台。
https://stackoverflow.com/questions/25040921
复制相似问题