【问题标题】:Input Stream Reader with multi-line text file具有多行文本文件的输入流阅读器
【发布时间】:2015-08-18 13:17:39
【问题描述】:

我的程序无法读取多行格式的 txt 文件。文本文件的内容应该打印在 textArea 中,但是当涉及到多行文件时,什么也不会发生。另外我想提示一条消息:文件存在时提示“文件已存在”,文件不存在时提示“文件未找到”。

这是我的代码:

BufferedReader br = null;
try {
    String sCurrentLine;

    br = new BufferedReader(new FileReader("C:\\Users\\theBeard\\workspace\\LeapYear\\"+textField.getText()));

    while ((sCurrentLine = br.readLine()) != null) {
        textArea.setText(sCurrentLine);
    }
        br.close();
} catch (IOException ex) {
    ex.printStackTrace();
} finally {
    try {
        if (br != null)br.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

另外,这种方法检查文件是否存在正确吗?

try {

                String sCurrentLine;

                br = new BufferedReader(new FileReader("C:\\Users\\theBeard\\workspace\\LeapYear\\"+textField.getText()));
                textArea.read(br, textArea);//this was a suggestion     by     someone below


                while ((sCurrentLine = br.readLine()) != null) {



                     textArea.append(sCurrentLine);
                     textArea.append(System.lineSeparator());
                }

            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                try {
                    if (br != null)
                    {

                        br.close();
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }

【问题讨论】:

  • 谢谢大家。一切都一清二楚。 :)
  • 还有一个小东西,如果我想提示一条消息说找不到文件,我应该把它放在哪里?谢谢!
  • 如果您有新问题,请在新问题中发布。至少有两个原因:(1)没有多少人会阅读您的评论,而现在这个附加问题(2)与您当前遇到的问题无关。
  • 哦,好的。但是页面上说,我应该再等2天再问。但是感谢您的帮助先生,以及其他回答的人。非常感谢!
  • 这很奇怪。您是否问过后来被否决/关闭和删除的问题?

标签: java eclipse swing file-io jtextarea


【解决方案1】:

textArea.setText(sCurrentLine); 不会添加文本到区域,而是用新文本替换它。因此,您的代码会将文本设置为文本文件的最后一行。所以如果你的最后一行是空的,你什么也看不到。

您可能想要使用的是append 方法。

你也没有在正确的地方关闭你的资源,因为它应该只在 finally 块中完成。考虑使用 try-with-resources 它将为您处理它。

所以试试类似的东西

try (BufferedReader br = new BufferedReader(
        new FileReader("C:\\Users\\theBeard\\workspace\\LeapYear\\"+ textField.getText()))) {
    String sCurrentLine;
    while ((sCurrentLine = br.readLine()) != null) {
        textArea.append(sCurrentLine);
        textArea.append(System.lineSeparator());
    }
} catch (IOException ex) {
    ex.printStackTrace();
}

【讨论】:

  • 呃,还有一件事,我想提示一条消息说:“找不到文件。”,我应该把它放在哪里?谢谢!
  • 您可以通过多种方式处理它。您可以先尝试为该文件创建Path,然后测试该路径是否指向正确的文件,例如通过Files.exist(path)。如果文件存在,则继续代码,如果不要求正确的文件位置。我们也可以处理NoSuchFileException,但这通常是一个错误的决定,因为异常不应该是标准逻辑的一部分,但它们应该处理我们无法阻止的异常情况。
  • @mKorbel 这是非常好的方法。您应该将其发布为答案。
【解决方案2】:

追加文本而不是为每次迭代设置文本

textArea.append(sCurrentLine + System.getProperty("line.separator"));

【讨论】:

  • @mKorbel 是的,那会更简单或当然:)
【解决方案3】:
public void setText(String t)

将此 TextComponent 的文本设置为指定的文本。如果文字 为 null 或为空,具有简单删除旧文本的效果。

textArea.setText(sCurrentLine) 覆盖每一行文本区域的整个文本。如果文件中的最后一行是空行,则文本区域将为空。

【讨论】:

    【解决方案4】:

    好吧,如果你的最后一行是空的,那么唯一需要设置的就是这个空行,因为你总是会覆盖文本区域中的文本。我建议使用 StringBuilder 将整个文件读入...

    StringBuilder sb = new StringBuilder();
    ... read via BufferedReader
    sb.append( sCurrentLine );
    
    ...set whole text...
    textArea.setText(sb.toString());
    

    【讨论】:

      【解决方案5】:
      while ((sCurrentLine = br.readLine()) != null) {
          textArea.setText(sCurrentLine);
      }
      

      这每次都会覆盖现有值,因此您最终只会获得最后一行的值。

      获取前一个值,然后追加到它。

      while ((sCurrentLine = br.readLine()) != null) {
          String x = textArea.getText().toString();
          textArea.setText(x + sCurrentLine);
      }
      

      【讨论】:

        猜你喜欢
        • 2013-03-13
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        • 2015-11-11
        • 1970-01-01
        相关资源
        最近更新 更多