我读到一个关于BufferedReader遇到麻烦的人:读者根本不读第一行。相反,我有相反的问题。例如,在一个具有300行的文本文件中,它到达200行,将其读取一半,然后将以下字符串设为null,因此它将停止。
private void readerMethod(File fileList) throws IOException {
BigInteger steps = BigInteger.ZERO;
BufferedReader br = new BufferedReader(new FileReader(fileList));
String st;
//reading file line by line
try{
while (true){
st = br.readLine();
if(st == null){
System.out.println("Null string at line " + steps);
break;
}
System.out.println(steps + " - " + st);
steps = steps.add(BigInteger.ONE);
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try{
br.close();
}catch(Exception e){}
}
}
之前的代码片段的输出与预期的一样,直到到达第199行(从0开始)为止。考虑一个300行的文件。
...
198 - 3B02D5D572B66A82F9D21EE809320DB3E250C6C9
199 - 6E2C69795CB712C27C4097119CE2C5765
Null string at line 200
请注意,所有行都具有相同的长度,因此在此输出行199中甚至都不完整。我检查了文件文本,它是正确的:它包含所有300行,并且它们的长度都相同。另外,如您所见,文本中只有大写字母和数字。
我的问题是:我该如何解决?我需要BufferedReader
阅读 all 文本,而不仅仅是一部分。
根据某人的要求,我在此处添加了代码的其余部分。请注意,所有大写字母名称都是各种类型(int,string等)的常量。 这是主线程调用的方法:
public void init(){
BufferedWriter bw = null;
List<String> allLines = createRandomStringLines(LINES);
try{
String fileName = "SHA1_encode_text.txt";
File logFile = new File(fileName);
System.out.println(logFile.getCanonicalPath());
bw = new BufferedWriter(new FileWriter(logFile));
for(int i = 0; i < allLines.size(); i++){
//write file
String o = sha1FromString(allLines.get(i));
//sha1FromString is a method that change the aspect of the string,
//replacing char by char. Is not important at the moment.
bw.write(o + "\n");
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
bw.close();
}catch(Exception e){}
}
}
创建随机字符串列表的方法如下。 “ SYMBOLS”只是一个包含所有可用字符的字符串。
private List<String> createRandomStringLines(int i) {
List<String> list = new ArrayList<String>();
while(i!=0){
StringBuilder builder = new StringBuilder();
int count = 64;
while (count-- != 0) {
int character = (int)(Math.random()*SYMBOLS.length());
builder.append(SYMBOLS.charAt(character));
}
String generatedString = builder.toString();
list.add(generatedString);
i--;
}
return list;
}
请注意,写入的文件是完全正确的。
答案 0 :(得分:1)
好吧,感谢ygor用户,我设法解决了这个问题。问题在于,当BufferWriter尚未关闭时,BufferReader会开始工作。在bufferWriter.close()
命令之后,移动需要读者工作的命令行就足够了。