【问题标题】:Java BufferedReader blocks on unix pipeunix 管道上的 Java BufferedReader 块
【发布时间】:2015-03-11 17:16:35
【问题描述】:

我目前在使用 BufferedReader 获取 unix 管道句柄时遇到问题。我的 java 应用程序首先创建管道,然后通过这个 java 应用程序执行的外部 perl 脚本写入这个管道,最后一个 Java 应用程序线程从这个 unix 管道连续读取。

我正在使用以下代码从 Java 中读取 unix 管道。但是我看到第四条语句阻塞并且永远不会返回。我正在使用 JDK 1.8 -

File f = new File("/tmp/abc_c");  
System.out.println(f.exists) ;  
if (f.exists())  
    BufferedReader reader = new BufferedReader(new FileReader("/tmp/abc_c"));

我还看到 sysout 打印为 true。我想知道使用BufferedReader读取Unix管道是否正确?

【问题讨论】:

  • 什么时候阻塞?甚至在阅读任何内容之前或以后?
  • 在阅读任何内容之前。就在打开的时候。
  • 好的,还有,你为什么直接打开阅读器?回想一下,阅读器会尝试将字节流解码为字符。这是您遇到的一个问题(并且您也没有指定要使用的字符编码)
  • 这是我正在尝试调试的现有代码。那么这是否意味着我需要将docs.oracle.com/javase/7/docs/api/java/io/… 与二进制编码一起使用,因为文件字符集是二进制的?
  • InputStreamReader 可能是一个解决方案,是的;另外,由于您使用 Java 7+,请考虑使用 Files.newInputStream() 而不是 FileInputStream

标签: java io pipe


【解决方案1】:

问题与错误代码有关。文件读取发生在一个 while 循环内,它给出了太多文件打开消息。这已通过将文件打开代码移到循环外来解决。

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多