我要去上BufferedReader课了。这是我的测试。我用1024行创建了一个简单的txt文件:"test.txt“。每一行包含行号和文件名(例如:“1-test.txt”):
测试文件创建:
$ for i in {0..1023}; do echo "$i - test.txt" >> test.txt; done
$ ls -la test.txt
-rw-r--r-- 1 osb osb 12288 Oct 26 12:01 test.txt用于我的测试的Java类(f是File类的变量):
...
while (f.exists())
{
BufferedReader br = null;
try
{
br = new BufferedReader( new FileReader( f ), 10);
while ((line = br.readLine())!=null)
{
System.out.println (line);
Thread.sleep(1000);
}
}
...
catch excepion
...
finally
{
try
{
br.close();
}
catch (IOException e)
{
System.out.println ("\nError closing Buffer reader!");
e.printStackTrace();
}
br = null;
line = null;
}
}
...当应用程序开始编写行时,我执行以下unix命令:
gzip test.txt我期望出现异常,因为缓冲区大小比un行小( 10字节),但是应用程序读取所有1024行,并且只有在到达文件末尾时才会引发异常(文件不存在!)。BufferedReader是否有大于10的缓冲区大小?有最小缓冲区大小吗?
谢谢
发布于 2016-10-26 12:22:52
你的问题基本上是你的假设根本不符合现实。
您认为Java代码直接“与某个驱动器上的某个文件”交互。
但实际上,在“java代码”和“事物”之间有几个层。首先也是最重要的: Linux内核。即使在使用BufferedReader时,程序一开始运行,Linux内核也很可能已经读取了小文本文件的全部内容。因此,您的“读取”代码根本没有注意到底层文件在此期间被重命名了!
最后,当您关闭缓冲区时,JVM会注意到事情是不正常的。
https://stackoverflow.com/questions/40262079
复制相似问题