Java 突然停止写入 ArrayList

Java suddenly stops writing to ArrayList

我正在尝试编写类似于文本文件解释器的东西。我决定从基础开始,写一些剖析字符串的东西:

public static void dataImport() throws IOException {

BufferedReader dataReader = new BufferedReader(new FileReader("C:\Users\(my name)\Desktop\javaWrite.txt"));
ArrayList<String> orderLine = new ArrayList<>();

String line = null;
String endResult = "";
String currentChar = null;

while((line = dataReader.readLine()) != null) {        
        for(int character = 0; character < line.length(); character++) {                
            currentChar = line.substring(character, character+1);                                
            if(currentChar.equals("|")) {                    
                for(String singleChar : orderLine) {                        
                    endResult += singleChar;
                }                    
                fileThings.add(endResult);                    
                endResult = "";
                orderLine.clear();                    
            }else{                    
                orderLine.add(currentChar);
            }                
        }            
}                
dataReader.close();
}

它正在读取的文本文件有 "Hello|world!" 写入。

代码输出 "Hello",没有别的。当我让它在 else 中输出 currentChar 变量时,它只是继续阅读整个句子。所以所有证据都表明 ArrayList orderLine 是问题所在。

您的代码仅在看到 | 时才将数据附加到数组列表中输入数据中的字符。您的输入数据仅包含一个 |特点。因此,您在输出 ArrayList 中只有一行。

正如@yole 在另一个答案中已经说过的那样,只有在看到 | 时才调用 fileThings.add(),并且行尾没有 |

但是,您的代码存在一些性能问题,最糟糕的是 String += String 构造。考虑到编译器将其转换为:

,对性能非常不利
endResult = new StringBuilder().append(endResult).append(singleChar).toString();

这发生在一个循环中。哎呀!

此外,当您真正想要 char currentChar = line.charAt(character) 时,为什么要使用 String currentChar = line.substring(character, character+1)

对于您正在做的事情,只需拆分 |。由于split()方法采用的是正则表达式,而|有特殊含义,所以要进行转义,应该使用try-with-resources:

try (BufferedReader dataReader = new BufferedReader(new FileReader("C:\Users\(my name)\Desktop\javaWrite.txt"))) {
    for (String line; (line = dataReader.readLine()) != null; ) {
        for (String endResult : line.split("\|") {
            fileThings.add(endResult);
        }
    }
}