Java—从文件读取输入。java.io.FilterInputStream.available(未知源)?
我已经好几年没有写过Java了,我回去用一个简单的“从文件读取”的例子来刷新我的记忆。这是我的密码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
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)嘿,我甚至没有注意到这个。更好的变量名在这里肯定会有帮助。我必须一大早就停止编写代码。谢谢