首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java InputStreamReader不变档位

Java InputStreamReader不变档位
EN

Stack Overflow用户
提问于 2014-07-30 15:32:25
回答 2查看 351关注 0票数 0

这是我的代码:

代码语言:javascript
复制
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的回答)。

下面是我的代码演变成的内容:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-30 16:33:57

基本上,reader.read()内部调用InputStream.read。以下是引用文档的一段话:

从输入流读取下一个字节的数据。在0到255范围内,值字节作为int返回。如果由于到达流的末尾而没有可用的字节,则返回值-1。此方法将阻塞,直到输入数据可用、流的末尾被检测到或抛出异常为止。

换句话说,这个方法将阻止程序的执行,并永远等待您的输入。

现在您可以看到,处于当前状态的程序将永远不会停止执行:

代码语言:javascript
复制
//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
  • 实现非阻塞读取机制.查看以下问题:是否可以通过超时从InputStream中读取?

以前也曾对Stackoverflow提出过类似的问题:

票数 1
EN

Stack Overflow用户

发布于 2014-07-30 16:26:27

System.in是一个BufferedInputStream,尝试如下:

代码语言:javascript
复制
System.err.println(System.in.getClass());

因此,您可能会看到这种停滞的行为,因为缓冲区会等待更多的数据,有时会被刷新,有时不会。

如果System.in是用户通过键盘输入,它将停止在Ctrl(视窗)或Ctrl (*nix)。

如果要从键盘读取用户输入,则应使用控制台

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25040921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档