【问题标题】:Java suddenly stops writing to ArrayListJava 突然停止写入 ArrayList
【发布时间】:2016-01-06 22:48:42
【问题描述】:

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

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 是问题所在。

【问题讨论】:

  • 实际上,我很惊讶输出不是world!,因为一旦遇到|ArrayList 就会被清除。
  • @MattCremeens 但是它被添加到了fileThings(不管是什么),并且那里缺少world!
  • @Andreas,啊,我现在明白了。我在想 OP 正在打印orderLine 的内容。
  • 你试过javascript吗?你可以在 jQuery 中轻松做到这一点
  • @Andreas 哎呀,复制时遗漏了一些东西。 fileThings 只是另一个字符串变量的 ArrayList

标签: java arraylist filereader


【解决方案1】:

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

【讨论】:

  • 我很困惑。在我看来,orderLine 仅在没有遇到 | 时才被添加,就像在 else 子句中一样。也许我错了。
  • OP 没有显示显示输出的代码部分,我假设代码输出了 fileThings 列表的内容。
  • 我现在明白了。是的,你是对的:OP 没有说他们在输出什么,这让我更加困惑。
  • @yole 啊,我的错。它只是在 main 中使用一个 for-each 循环来输出 filleThings
【解决方案2】:

正如@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);
        }
    }
}

【讨论】:

  • 好吧,我应该知道我的代码并不完美(主要是因为我才刚开始使用 Java,而且还没有尝试过任何太高级的东西)。 NetBeans 告诉我也可以使用 try-with-resources,但我还不知道它是如何工作的。实际上,逐行读取文件的代码是我从互联网上复制的代码。但分裂之类的事情,我会调查
猜你喜欢
  • 2012-03-11
  • 2012-05-17
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多