所以我正在制作一个txt文件阅读器,并且该文件有一堆“长”行,因为它是一个素数查找器程序,它将数字写入txt。当我停止程序,然后重新启动它,我希望它从它停止的地方开始。这意味着我必须检查每一行并确保它正在读取内容,并且缓冲的阅读器列出的时间很长。这是代码:
try{
FileReader fileReader = new FileReader(fileLocation);
BufferedReader bufferedReader = new BufferedReader(fileReader);
long stringRead = bufferedReader.read();
while (stringRead != null)
{
stringRead = bufferedReader.read();
currentNum = stringRead;
}
bufferedReader.close();
}
catch(FileNotFoundException filenotfoundexxeption){
System.out.print("file does not exist");
}
catch(IOException ioexception){
ioexception.printStackTrace();
}
}
所以问题是它不喜欢stringRead != null
,我不知道该怎么做。我是一个菜鸟,所以请使用已经列出的代码回答。谢谢!
答案 0 :(得分:3)
你可能应该这样做
String line;
while ((line = bufferedReader.readLine()) != null)
{
currentNum = Long.parseLong(line);
}
当到达文件末尾时,readLine()
将返回null。
答案 1 :(得分:2)
long
是基本类型,因此它不能是null
。另一方面,Long
是引用类型,因此可以为null
。
无论哪种方式,BufferedReader#read()
都会返回代表单个字符的int
,而不是整行。您应该使用#readLine()
结合Long#parseLong()
,
考虑使用Scanner
代替,这将显着简化您的代码。
Scanner scanner = new Scanner(new File(fileLocation));
while (scanner.hasNextLong())
{
currentNum = scanner.nextLong();
}
答案 2 :(得分:0)
long不能为null,它是0(未初始化,或者已分配0)或不是。您可能希望使用readLine
方法并使用Long.parseLong()
将结果解析为较长,而不是使用read
读取每个字符。
答案 3 :(得分:0)
long
是primitive datatype,不能为空。如果它没有初始化它的0
。但是,您可以使用Long
包装类。例如Long stringRead = new Long(bufferedReader.read());
。在你的情况下,情况永远不会是这种情况,因为read()
永远不会返回null
,如果它是文件的末尾,则只返回-1
。因此,您的支票应为while(stringRead!=-1)
答案 4 :(得分:0)
每行有一个号码?你必须阅读readLine
,这将给你一个字符串行。然后用Long.parseLong
解析。您可以检查从readLine
获得的字符串是否为空。
答案 5 :(得分:0)
根据the official documentation BufferedReader #read返回int。
字符读取,为0到65535范围内的整数 (0x00-0xffff),如果已到达流的末尾,则返回-1
这意味着您可以检查返回的值是否等于-1。
答案 6 :(得分:0)
long是一个原语,因此它不能为null,并且BufferedReader.read返回int,因此您可以通过更改此行简单地使其工作
long stringRead = bufferedReader.read();
到
Integer stringRead = bufferedReader.read();
或
Long stringRead = new Long(bufferedReader.read());
Java 1.5及更高版本自动将int包装到Integer。