我做了2个测试,
1个是用socket方式,readline如果没有得到数据会一直阻塞.得到数据也一定要读到回车才能继续,否则还是阻塞。另外一个是读取本地文件的方式,本地文件在另外一个进程中在缓慢的不停的写入数据,也就是一直没有close.
readline所在进程则在readline时候发现到了文件的最后了,返回的是null,根本不阻塞.
while(true)
{
                System.out.println("begin");
                str = in.readLine();           //此处在文件中没有数据时候得到的是null,并不阻塞
                System.out.println(str);
                System.out.println("end");
}
结果就是打出了文件前面生成的所有内容,然后一堆null,然后另外一个进程写入了新数据后,继续打印新数据内容.
请问为什么从文件读和从socket读一个不阻塞,一个则会阻塞呢?
我希望读文件时候也一直阻塞,该怎么弄?谢谢啦

解决方案 »

  1.   

    in是这样的对象:
    BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("C:/1.log")));
      

  2.   

    这个..看看InputStreampublic int read(byte[] b)
             throws IOException    从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。  Stream读文件不就是阻塞的吗?我用BufferedReader 是因为它有readline函数.Stream的话,就要自己弄一个buffer接收,自己处理换行.
      

  3.   

    这应该取决于输入流通道的处理方式,与BufferedReader无关吧
    可能缺省的文件输入流通道是无堵塞模式的,而标准输入流或者socket的输入流是堵塞模式的。
    javadoc里对Socket的getInputStream的一段说明
    If this socket has an associated channel then the resulting input stream delegates all of its operations to the channel. If the channel is in non-blocking mode then the input stream's read operations will throw an IllegalBlockingModeException. 
    最后一句就是说如果Socket的输入流通道是无堵塞式的话就会抛出异常。所以,如果文件也想做堵塞式的,可以参考一下java.nio.channels包下的FileChannel和SocketChannel
    具体我也没研究过,以后有空再看看了。
      

  4.   

    nio好像是提供非阻塞(non-blocking)IO操作的.
    JDK 1.4以前的这些IO包倒是针对阻塞式的。
    例子1.4之前的针对socket是阻塞式,1.4的nio倒开始支持非阻塞了难道针对一个文件的读,就无法用阻塞的方式吗?
      

  5.   


    请问为什么从文件读和从socket读一个不阻塞,一个则会阻塞呢? 
    ---
    因为文件可以准确的判断到流的结束(下面没有了)
    socket无法判断到底后面还有没有内容,但是如果服务器那边write东西后再调用socket.close则会令bufferReader同样的返回了,而不会必须等待回车。
    我希望读文件时候也一直阻塞,该怎么弄?谢谢啦
    ---
    你还阻塞着做什么?后面都没有内容了!
      

  6.   

    readLine本身就是以换行作为结束的,读不到换行肯定要阻塞的
      

  7.   

    后面只是暂时没有内容,因为另外一个进程中在缓慢的不停的对着这个文件写入数据,也就是一直没有close.我感觉这种方式在暂时没有内容时,也是被当作文件结束处理了。(因为我就算从来没有写入换行符号,readLine也会返回-1,而不是阻塞)
    我要阻塞,就是因为我后面还有很多内容需要处理啊,而且一旦有内容,必须非常及时地处理,不能sleep,过一会儿再去readLine试试看的。
      

  8.   

    看你的源流是否阻塞,与BufferedReader无关
      

  9.   

    你的程序设计有问题,可以使用缓冲区,第二是如果非要使用文件,建议每次覆盖原文件后NOTIFYALL,每次处理文件内容后WAIT