2015-07-31 2 views
1

Я пытаюсь записать текстовый документ в определенном формате. Вот что я имею прямо сейчас.Невозможно добавить новую строку при многократном добавлении в строку

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

Я тоже пробовал это с символом новой строки. До того, как он работал, когда оператор печати находился внутри цикла, это означало, что он написал только одну строку за раз. Я хочу сделать это так, потому что у меня будет несколько потоков, пишущих в этот файл, и таким образом любой поток не будет удерживать блокировку так долго.

+0

Почему вы используете 'printf' вместо' println'? – Pshemo

+0

Я посмотрел учебник о том, как писать в файл, и он сказал, что мне нужно использовать printf. Я предположил, что printf - это то, что было использовано. Можете ли вы использовать println с файловым/печатающим устройством? – bphand95

+0

Да, вы должны иметь возможность использовать его без проблем с PrintWriter (который может обернуть FileWriter). – Pshemo

ответ

2

При использовании Java 7 или более поздней версии вы можете использовать System.lineSeparator()

+0

ДА! Большое спасибо. Знаете ли вы, почему я не могу использовать escape-символы при использовании файлового/графического редактора? – bphand95

1

Использование System.getProperty ("line.separator") вместо "\ г"

Cache ир для повышения эффективности, хотя.

+0

Это не сработало. Окончательный результат закончился с «нулевым» типом, где должно было быть «\ n». – bphand95

+0

Возможно, вы ошиблись «line.separator»? System.lineSeparator() сработал для вас и возвращает начальное значение свойства system.separator; согласно документации System.lineSeparator(). –

-1

Вы также можете попробовать использовать \n\r в комбинации. Это помогло в одном из моих проектов.

+0

Нет. Не работает. – bphand95

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

, который автоматически добавляет разделитель строк на основе ОС.

+0

Спасибо. Я постараюсь получить это, как только у меня будет работа другой. – bphand95