重复追加到字符串时无法添加换行符

时间:2015-07-31 12:14:11

标签: java multithreading io

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

    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语句在循环内部之前我使用它之前意味着它一次只写一行。我想这样做,因为我将有多个线程写入此文件,这样任何线程都不会持有锁定。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

为了提高效率而缓存ir。

答案 2 :(得分:1)

首先不要使用

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);

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

答案 3 :(得分:-1)

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