Java - 从文件中读取输入。 java.io.FilterInputStream.available(未知来源)?

时间:2010-01-11 16:10:33

标签: java file-io

我多年没有写过任何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)

是什么给出了?

2 个答案:

答案 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);
}