【问题标题】:Can't add a newline when repeatedly appending onto a string重复附加到字符串时无法添加换行符
【发布时间】:2015-07-31 12:14:11
【问题描述】:

我正在尝试写入具有特定格式的文本文档。这是我现在拥有的。

    String line = "";
    double totalCost = 0;

    Node curr = summary.head.next;
    while(curr!=summary.tail)
    {
        line += [an assortment of strings and variables] +"\r";
        totalCost += PRICELIST.get(curr.itemName)*curr.count;
        curr = curr.next;
    }

        write.printf("%s" + "%n", line);

这就是添加到线上的部分的实际样子。

"Item's name: " + curr.itemName + ", Cost per item: " +  NumberFormat.getCurrencyInstance().format(PRICELIST.get(curr.itemName)) +
                ", Quantity: " + curr.count + ", Cost: " +  NumberFormat.getCurrencyInstance().format(PRICELIST.get(curr.itemName)*curr.count) + "\r";

我也试过换行符。在我让它工作之前,当 print 语句在循环内意味着它一次只写一行。我想这样做是因为我将有多个线程写入这个文件,这样任何线程都不会长时间持有锁。

【问题讨论】:

  • 你为什么用printf而不是println?
  • 我看了一个关于如何写入文件的教程,它说我必须使用 printf。我认为 printf 只是使用的东西。您可以将 println 与文件写入器/打印写入器一起使用吗?
  • 是的,您应该可以毫无问题地使用 PrintWriter(可以包装 FileWriter)。

标签: java multithreading io


【解决方案1】:

如果使用 Java 7 或更高版本,您可以使用 System.lineSeparator()

【讨论】:

  • 是的!非常感谢。你知道为什么我在使用文件写入器/打印机时不能使用转义字符吗?
【解决方案2】:

使用 System.getProperty("line.separator") 代替 "\r"

缓存 ir 以提高效率。

【讨论】:

  • 这不起作用。最终结果最终在应该有“\n”的地方打印了“null”。
  • 也许你打错了“line.separator”? System.lineSeparator() 为您工作,它返回系统属性 line.separator 的初始值;根据 System.lineSeparator() 的文档。
【解决方案3】:

首先不要使用

while(..){
    result += newString
    ..
}

内循环。这是非常低效的,尤其是对于长文本,因为每次调用

result += newString

您正在创建需要复制result 的内容并附加到newStrint 的新字符串。因此,到目前为止,您处理的文本越多,它必须复制的越多,因此它变得越慢。

改为使用

StringBuilder sb = new StringBuilder();
while(..){
     sb.append(newString);
}
result = sb.toString.

在你的情况下应该更像

sb.append("Item's name: ").append(curr.itemName)
  .append(", Cost per item: ").append(NumberFormat.getCurrencyInstance().format(PRICELIST.get(curr.itemName)))
  .append(", Quantity: ").append(curr.count )
  .append(", Cost: ").append(NumberFormat.getCurrencyInstance().format(PRICELIST.get(curr.itemName) * curr.count))
  .append(System.lineSeparator());

也代替

write.printf("%s" + "%n", line);

你应该使用更简单的版本,即

write.println(line);

根据操作系统自动添加行分隔符。

【讨论】:

  • 谢谢。一旦我的其他东西工作正常,我会试着把它放进去。
【解决方案4】:

您也可以尝试结合使用\n\r。这有助于我的一个项目。

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 2015-10-22
    • 2013-05-12
    • 2015-07-25
    • 2013-02-02
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多