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

Java—从文件读取输入。java.io.FilterInputStream.available(未知源)?,java,file-io,Java,File Io,我已经好几年没有写过Java了,我回去用一个简单的“从文件读取”的例子来刷新我的记忆。这是我的密码 import java.io.*; public class filereading { public static void main(String[] args) { File file = new File("C:\\file.txt"); FileInputStream fs = null; BufferedInputStream

我已经好几年没有写过Java了,我回去用一个简单的“从文件读取”的例子来刷新我的记忆。这是我的密码

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 java.io.FilterInputStream.available(未知 来源)在 main(filereading.java:21)


给出了什么?

要读取文本文件,请使用
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);
}

您输入了一个简单的输入错误:

ds = new DataInputStream(ds);
应该是

ds = new DataInputStream(bs);
您的代码正在使用空源初始化
DataInputStream
,因为尚未创建
ds


话虽如此,Jon Skeet的答案为编写文件读取程序提供了一种更好的方法(在处理文本时,你应该始终使用
读卡器
/
写卡器
,而不是

还请注意,
.available()
可能不知道你认为它有什么功能,但是您应该在finally块中关闭资源(
FileInputStream
)。要帮助将赋值从
块中拉出,请尝试
块(并将变量
设为final
)。@Tom Hawtin+1.并且只在最派生的资源句柄上执行一次,在本例中是
DataInputStream ds
。解决方案:使用更好的变量名!上面的那行也不正确-它应该是BufferedInputStream(fs)而不是BufferedInputStream(bs)嘿,我甚至没有注意到这个。更好的变量名在这里肯定会有帮助。我必须一大早就停止编写代码。谢谢