【问题标题】:Java - Reading input from a file. java.io.FilterInputStream.available(Unknown Source)?Java - 从文件中读取输入。 java.io.FilterInputStream.available(未知来源)?
【发布时间】:2010-01-11 16:10:33
【问题描述】:

我已经很多年没有写过任何 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(未知 来源)在 filereading.main(filereading.java:21)

什么给了?

【问题讨论】:

  • 另外请注意.available() 可能不知道你认为它做了什么。
  • 不在问题中,但您应该在 finally 块中关闭资源 (FileInputStream)。为了帮助这个从try 块中提取分配(并使变量final)。
  • @Tom Hawtin。 +1。并且只在派生最多的资源句柄上执行一次,在本例中为 DataInputStream ds

标签: java file-io


【解决方案1】:

你犯了一个简单的错字:

ds = new DataInputStream(ds);

应该是

ds = new DataInputStream(bs);

您的代码正在使用 null 源初始化 DataInputStream,因为尚未创建 ds

话虽如此,Jon Skeet 的回答提供了一种编写文件读取程序的更好方法(在处理文本时,您应该始终使用 Readers/Writers 而不是 Streams)。

【讨论】:

  • 解决方案:使用更好的变量名!
  • 上面那一行也不正确——应该是 BufferedInputStream(fs) 而不是 BufferedInputStream(bs)
  • 嘿,我什至没有注意到那个。更好的变量名在这里肯定会有所帮助。
  • 一大早我得停止写代码了。谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多