我做了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个是用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读一个不阻塞,一个则会阻塞呢?
我希望读文件时候也一直阻塞,该怎么弄?谢谢啦
解决方案 »
- 怎样用io操作把二进制文件转换成文本文当?
- 请教一个volatile 问题
- 如何安装JBuilder2008
- 提两个问题:1.什么是线程安全?线程安全是怎么完成的(原理)?2.为什么继承接口Runnable会产生脏读现象,继承类Thread,就不会产生脏读现象?
- 好烦啊,jdk老提示类定义错误,哪位大哥帮忙看看!
- 从网上下的Jbuilder8装上之后,一敲入关键字象public、void输入光标就错位,怎么回事,各位大虾帮忙??????
- 一个学习目标的疑虑
- 求教:Java程序为何突然全部无法运行
- 请教一个问题.
- 求解一超级疑难硬盘丢失问题,急啊!!你想不急我能跑这问吗
- 十万火急啊
- 请问,关于时间周期执行问题,谢谢各位!
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("C:/1.log")));
throws IOException 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。 Stream读文件不就是阻塞的吗?我用BufferedReader 是因为它有readline函数.Stream的话,就要自己弄一个buffer接收,自己处理换行.
可能缺省的文件输入流通道是无堵塞模式的,而标准输入流或者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
具体我也没研究过,以后有空再看看了。
JDK 1.4以前的这些IO包倒是针对阻塞式的。
例子1.4之前的针对socket是阻塞式,1.4的nio倒开始支持非阻塞了难道针对一个文件的读,就无法用阻塞的方式吗?
请问为什么从文件读和从socket读一个不阻塞,一个则会阻塞呢?
---
因为文件可以准确的判断到流的结束(下面没有了)
socket无法判断到底后面还有没有内容,但是如果服务器那边write东西后再调用socket.close则会令bufferReader同样的返回了,而不会必须等待回车。
我希望读文件时候也一直阻塞,该怎么弄?谢谢啦
---
你还阻塞着做什么?后面都没有内容了!
我要阻塞,就是因为我后面还有很多内容需要处理啊,而且一旦有内容,必须非常及时地处理,不能sleep,过一会儿再去readLine试试看的。