【问题标题】:Making bufferedreader from loop, to next line?使缓冲阅读器从循环到下一行?
【发布时间】:2015-01-07 14:42:51
【问题描述】:

对不起,标题很差,不知道该怎么称呼它! 基本上我做了下面的循环来显示文件的前六行,得到了排序。但是,在显示六行时,我不确定如何让它们每次出现在不同的行上。我得到的最接近的是将 joptionpane 包含在循环中,显示一行,然后在下一个等的下一个 joptionpane 上。底部的第二个 joptionpane 显示所有行,但在同一行而不是下一行等。我应该如何使它每次都出现在下一行? \n 似乎不起作用。

private static void doOptionTwo(int balance) throws IOException {

    JOptionPane.showMessageDialog(null, "Option two selected ");
    String sum = null;
    BufferedReader br = null;
    br = new BufferedReader(new FileReader("file1.txt"));
    for (int i = 1; i <= 6; i++){
    String line1 = br.readLine();
    //JOptionPane.showMessageDialog(null, line1);
            sum = sum + line1;

    }

    if (br != null)br.close();
    String log = sum;
    JOptionPane.showMessageDialog(null, log);

}

【问题讨论】:

  • 您使用与普通字符串中相同的转义字符来休息:\n

标签: java string loops bufferedreader joptionpane


【解决方案1】:

使用 StringBuilder 代替初始化为 null 的 String。您可以使用以下代码做任何您想做的事情:

 StringBuilder stringBuilder = new StringBuilder();
 String newLineCharacter = System.getProperty("line.separator");
 for (int i = 1; i <= 6; i++){
     stringBuilder.append(br.readLine());
     stringBuilder.append(newLineCharacter);//note: will add new line at end as well..
}

【讨论】:

  • 从 Java 8 开始甚至更好,我们可以使用 StringJoinerSystem.getProperty("line.separator") 作为分隔符(或 System.lineSeparator(),它的代码比 System.getProperty("line.separator") 短一点)。
【解决方案2】:

每次在你的字符串中插入 break :

for (int i = 1; i <= 6; i++) {
    String line1 = br.readLine(); 
    sum += line1 + "\n";
}

【讨论】:

    【解决方案3】:

    您可以在两行之间添加"\n"

    String sum = "";
    for (int i = 1; i <= 6; i++){
        String line1 = br.readLine();
        sum += line1 + "\n";
    }
    

    或者更恰当地说,使用StringBuilder

    StringBuilder sb = new StringBuilder();
    for (int i = 1; i <= 6; i++){
        String line1 = br.readLine();
        if (sb.length() > 0) {
            sb.append('\n');
        }
        sb.append(line1);
    }
    String sum = sb.toString();
    

    【讨论】:

      【解决方案4】:

      这样更有效率:

          JOptionPane.showMessageDialog(null, "Option two selected ");
          StringBuilder build = new StringBuilder();
          BufferedReader br = null;
          br = new BufferedReader(new FileReader("file1.txt"));
          for (int i = 1; i <= 6; i++){
          String line1 = br.readLine();
          //JOptionPane.showMessageDialog(null, line1);
                   build.append(sum).append("\n");
          }
      
          if (br != null)br.close();
          System.out.println(build.toString());
      

      【讨论】:

      • 使用build.append(sum+"\n");,您使用StringBuilder 是一种杀戮目的。请改用build.append(sum).append("\n");
      • 不,这不是杀戮,你可以使用像 apend().apend().apend() 这样的东西链它的原因是它返回与 Initialize 相同的类。默认情况下,指针“this”返回到方法。
      • 我的意思是 build.append(sum+"\n") 将被编译成类似 build.append(new StringBuilder(sum).append("\n").toString()) 的东西,所以在每次迭代中,您都在创建新的 StringBuilder 而不是使用已经存在的 StringBuilder(它将由 append 返回,因为您似乎已经知道了)。
      • 其实不是,我实际上看到了使用 Decompiler hack 的 StringBuilder 的真实代码。 StringBuilder 是解决不可变问题的方法。
      • 标准“反编译器”(javap -c ClassName) 表明sum+"\n";(假设sum 不是像这种情况下的编译时间常数)被编译成StringBuilder(sum).append("\n").toString()。使用你的反编译器来检查这段代码将被编译成build.append(sum+"\n")
      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2019-07-08
      • 2018-06-14
      • 2021-06-30
      • 2023-03-20
      • 2017-05-27
      相关资源
      最近更新 更多