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);
}
}
}
我正在尝试编写类似于文本文件解释器的东西。我决定从基础开始,写一些剖析字符串的东西:
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);
}
}
}