我正在从一个文件(这是名称及其联系方式的列表)中读取内容,并将其显示在GUI的文本区域中。文件读取良好,并显示文本。但是我希望文件中的每一行都在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);

    }

最佳答案

您实际上不需要逐行阅读它。这样的事情会做:

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或类似的东西,那么您的方式可能还可以,除了:


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

07-24 09:51
查看更多