2014-01-17 20 views
1

Когда я запускаю код, все работает нормально, но содержимое не записывается в файл target.txt.Скажите, пожалуйста, почему приведенный ниже код не работает?

public class SrtExtractor { 
     public static void main(String[] args) throws IOException { 
      Path source = Paths.get("files/loremipsum.txt"); 
      Path target = Paths.get("files/target.txt"); 
      Charset charSet = Charset.forName("US-ASCII"); 
      BufferedReader reader = Files.newBufferedReader(source, charSet); 
      BufferedWriter writer = Files.newBufferedWriter(target, charSet); 
      String temp; 
      ArrayList<String> list = new ArrayList<>(); 
      while((temp = reader.readLine())!=null){ 
       list.add(temp); 
       System.out.println(temp); 
      } 
      for(int i = 0; i<list.size(); i++) 
      { 
       writer.append(list.get(i));//why this line is not working??? 
      } 
     } 
    } 
+1

try writer.flush() и writer.close() – Gus

+1

Вы оставили 'writer.close()'. – PeterMmm

+0

Вы потрудились пройти код в отладчике? – OldProgrammer

ответ

1
for(int i = 0; i<list.size(); i++) { 
    writer.append(list.get(i)); 
} 
writer.close(); //Add this 
reader.close(); //Add this 

Вы не указали, что вы сделали записи в файл. Пока вы не скажете close(), файл на самом деле не написан, текст просто находится в BufferedWriter.

0

Как все говорят, вы должны добавить writer.close().

С другой стороны, я думаю, что лучший способ писать в текстовом файле это (он всегда работает для меня):

File file = new File(path); 
FileOutputStream fout = new FileOutputStream(file); 
OutputStreamWriter osw = new OutputStreamWriter(fout); 
Writer w = new BufferedWriter(osw); 
for(...){ 
    w.write(...); 
} 
3

Вы используете BufferedWriter класс - В этом случае, содержимое вашей записи все еще находится в буфере. writer.flush(); необходимо вызвать, чтобы очистить содержимое буфера и записать их в базовый поток.

flush() также называется автоматически, когда вызывается close(). close() следует вызывать, когда ваша программа выполняется с ее ресурсами, чтобы избежать утечек памяти. Правильное закрытие ресурсов может быть сложно сделать правильно, но Java 7 добавила новый try-with-resources construct, чтобы помочь программистам правильно закрыть свои ресурсы.

Вот ваш пример, переписанный для использования конструкции try-with-resources. Это обеспечит правильное закрытие обоих ваших потоков, даже если во время обработки файла возникает исключение. Это по сути то же самое, что звонить close() на ваш читатель и писатель, но он безопаснее и использует меньше кода.

public class SRTExtractor { 
    public static void main(String[] args) throws IOException { 
     Path source = Paths.get("files/loremipsum.txt"); 
     Path target = Paths.get("files/target.txt"); 
     Charset charSet = Charset.forName("US-ASCII"); 
     try (
      BufferedReader reader = Files.newBufferedReader(source, charSet); 
      BufferedWriter writer = Files.newBufferedWriter(target, charSet); 
     ) { 
      String temp; 
      ArrayList<String> list = new ArrayList<>(); 
      while ((temp = reader.readLine()) != null) { 
       list.add(temp); 
       System.out.println(temp); 
      } 
      for (int i = 0; i < list.size(); i++) { 
       writer.append(list.get(i)); 
      } 
     } 
    } 
} 
+0

+1 Не видел новую попытку, которая автоматически закрывает ресурсы раньше, хорошо! – Fredrik

Смежные вопросы