我多年没有写过任何Java了,我回过头来用一个简单的'read-from-file'示例来刷新我的记忆。这是我的代码..
import java.io.*;
public class filereading {
public static void main(String[] args) {
File file = new File("C:\\file.txt");
FileInputStream fs = null;
BufferedInputStream bs = null;
DataInputStream ds = null;
try
{
fs = new FileInputStream(file);
bs = new BufferedInputStream(bs);
ds = new DataInputStream(ds);
while(ds.available()!= 0)
{
String readLine = ds.readLine();
System.out.println(readLine);
}
ds.close();
bs.close();
fs.close();
}
catch(FileNotFoundException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
这编译很好(虽然显然ds.readLine()被删除),但在运行时,这给了我
线程“main”中的异常 java.lang.NullPointerException at java.io.FilterInputStream.available(未知 来源)at filereading.main(filereading.java:21)
是什么给出了?
答案 0 :(得分:6)
你写了一个简单的拼写错误:
ds = new DataInputStream(ds);
应该是
ds = new DataInputStream(bs);
您的代码正在使用空来源初始化DataInputStream
,因为尚未创建ds
。
话虽如此,Jon Skeet的回答提供了一种更好的方式来编写文件阅读程序(在处理文本时,你应该总是使用Readers
/ Writers
而不是Streams
答案 1 :(得分:3)
要阅读文本文件,请使用BufferedReader
- 在这种情况下,围绕InputStreamReader
包裹,围绕FileInputStream
。 (这允许你明确地设置编码 - 你绝对应该这样做。)你当然也应该关闭finally块中的资源。
然后您应该读取行,直到readLine()
返回null,而不是依赖于available()
IMO。我怀疑您会发现readLine()
正在为文件的最后一行返回null
,即使available()
返回2表示最终\r\n
。只是预感。
String line;
while ((line = reader.readLine()) != null)
{
System.out.println(line);
}