如何逐行读取文件到JTextArea(GUI)?

时间:2016-07-21 18:12:10

标签: java string user-interface jtextarea filereader

我正在从一个文件(名单及其联系号码列表)中读取并在GUI中的textarea中显示它。该文件读取正常,并显示文本。但我希望文件中的每一行都在GUI上的新行上。所以每个名称和地址都在一个新的行上。我该怎么做呢? 到目前为止,这是我的代码,但它不会在GUI上的新行上显示文件中的每一行。

public void books() throws IOException {
        String result = " ";
        String line;
        LineNumberReader lnr = new LineNumberReader(new FileReader(newFile("books2.txt")));
        while ((line = lnr.readLine()) != null) {
            result += line;`
        }


        area1 = new JTextArea(" label 1 ");
        area1.setText(result);
        area1.setBounds(50, 50, 900, 300);
        area1.setForeground(Color.black);
        panelMain.add(area1);

    }

1 个答案:

答案 0 :(得分:1)

你真的不需要逐行阅读。这样的事情会做:

String result = new String(Files.readAllBytes(Paths.get("books2.txt")),
                           StandardCharsets.UTF_8);

当然,这需要更多内存:首先读取字节,然后创建字符串。但是如果记忆是一个问题,那么一次读取整个文件可能是一个坏主意,更不用说在JTextArea显示了它!

它可能无法正确处理不同的行结尾。使用readLine()时,它会删除所有结尾的行,无论是CR LF,LF还是CR。上面的方法将按原样读取字符串。因此,也许逐行阅读并不是一个坏主意。但我刚检查过 - JTextArea似乎可以处理CR LF。但是,它可能会导致其他问题。

使用逐行方法,我会做类似

的事情
String result = String.join("\n",
        Files.readAllLines(Paths.get("books2.txt"),
            StandardCharsets.UTF_8));

这仍然会删除EOL的最后行。如果这很重要(例如,你希望能够将文本光标放在最后一行之后的行上),那就再做一次+ "\n"

以上所有内容都需要Java 7/8。

如果您正在使用Java 6或其他东西,那么您的方式可能没问题,除了:

  1. LineNumberReader替换为BufferedReader - 您不需要行号,是吗?
  2. String result替换为StringBuilder result = new StringBuilder(),将+=替换为result.append(line).append('\n')
  3. 最后,使用result.toString()获取字符串。