我正在尝试编写类似文本文件解释器的东西。我决定从基础开始,写一些解剖字符串的东西:
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!” writen。
代码输出“Hello”,没有别的。当我把它输出到else中的currentChar变量时,它只是继续阅读整个句子。因此,所有证据都会导致ArrayList orderLine出现问题。
答案 0 :(得分:3)
只有在看到|时,您的代码才会将数据附加到数组列表中输入数据中的字符。您的输入数据只包含一个|字符。因此,您只在输出ArrayList中获得一行。
答案 1 :(得分:0)
正如@yole在另一个回答中已经说过的那样,当您看到fileThings.add()
时,您只能致电|
,并且该行的末尾没有|
。
但是,您的代码存在一些性能问题,最糟糕的是String += String
构造。鉴于编译器将其转换为:
endResult = new StringBuilder().append(endResult).append(singleChar).toString();
这发生在一个循环中。糟糕!
此外,为什么在您真正想要String currentChar = line.substring(character, character+1)
时使用char currentChar = line.charAt(character)
?
对于你正在做的事情,只需分开|
。由于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);
}
}
}