Нужна помощь в записи в файл

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

Вот класс:

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Writer {

 private static PrintWriter  outputStream = null;

 public Writer(String algorithmName){
  try {
   outputStream = new PrintWriter(new FileWriter(algorithmName+".txt"));
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
     public  void write(String str){
        try {
                outputStream.append(str);
        }catch(Exception exc){

        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }
}

пример кода:

Writer w = new Writer("filename");
for(int = i; i < 10; i++){
w.write(i);
}

В этом случае я получаю результаты:

9

вместо

0
1
2
3
...
9

Что я делаю не так?

Благодарность


person Kap    schedule 31.10.2010    source источник
comment
Вероятно, вам следует назвать свой класс чем-то другим, кроме Writer, поскольку уже существует java.io.Writer. Просто чтобы избежать ненужной двусмысленности.   -  person Emil H    schedule 31.10.2010


Ответы (4)


Вы закрываете поток вывода после каждой операции записи. Вы должны вызвать его один раз после того, как все написали.

person thejh    schedule 31.10.2010
comment
Спасибо за ваш ответ. Как сделать, чтобы каждая строка отображалась на отдельной строке? Я пытался добавить \n после каждой строки, но не работает. - person Kap; 31.10.2010
comment
Если это система Windows, попробуйте "\r\n". - person thejh; 01.11.2010

каждый раз, когда вы пишете, вы закрываете поток, который затем заставляет создавать новый файл, поэтому все, что есть в файле, равно 9.

Writer output = new BufferedWriter(new FileWriter(algorithmName+".txt"));
try {
  for(int = i; i < 10; i++){
      output.write( i );
  }
}
finally {
  output.close();
}
person Aaron Saunders    schedule 31.10.2010
comment
Спасибо. я хочу, чтобы каждая строка отображалась на отдельной строке. как это сделать? - person Kap; 31.10.2010
comment
Закрытие потока не приводит к созданию нового файла. При записи вызывает исключение, которое проглатывается пустым блоком catch. - person user207421; 01.11.2010

Я немного отойду от темы и порекомендую вам библиотеку Google Guava, так как он содержит множество полезных повседневных функций.

Используя его, решение вашей проблемы становится почти однострочным:

for(int i = 0; i < 10; ++i) {
    Files.append(String.valueOf(i) + "\n", new File("filename"), Charsets.UTF_8);
}

Изменить: вы не должны использовать это в больших циклах, потому что библиотека, вероятно, каждый раз эффективно открывает и закрывает файл. Совсем не эффективно.

person darioo    schedule 31.10.2010
comment
Спасибо, но нет ли способа сделать это с библиотеками Java? - person Kap; 01.11.2010
comment
Боюсь, вы не сможете сделать это намного короче, чем то, что вы сделали, используя только стандартные библиотеки Java. Чтобы сократить такой шаблонный код, были созданы такие библиотеки, как Google Guava и Apache Commons. - person darioo; 01.11.2010

У вас здесь несколько грубых ошибок. Вы использовали стандартное имя класса в качестве собственного имени класса; вы закрываете поток после каждой записи, как отмечали другие; поток является статическим членом, когда он должен быть членом-экземпляром; и у вас есть пустой блок catch, который не позволяет вам увидеть какие-либо ошибки. Никогда не делай этого.

person user207421    schedule 01.11.2010