2013-11-14 1 views
5

По какой-то причине моя строка написана частично с помощью PrintWriter. В результате я получаю частичный текст в своем файле. Вот метод:PrintWriter пишет только частичный текст

public void new_file_with_text(String text, String fname) { 
     File f = null; 
     try { 
      f = new File(fname); 
      f.createNewFile(); 
      System.out.println(text);   
      PrintWriter out = new PrintWriter(f, "UTF-8"); 
      out.print(text); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Где напечатать текст в консоли, я могу видеть, что данные все есть, ничего не потеряно, но, видимо, часть текста теряется, когда PrintWriter делает свою работу ... Я невежественный ..

ответ

5

Вы должны всегда Writer#close ваших потоков перед тем, как отбросить открытые потоки. Это избавит вас от некоторых довольно дорогостоящих системных ресурсов, которые должна запрашивать ваша JVM при открытии файла в файловой системе. Если вы не хотите закрыть свой поток, вы можете использовать Writer#flush. Это сделает ваши изменения видимыми в файловой системе, не закрывая поток. При закрытии потока все данные скрываются неявно.

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

В целом, убедитесь, что вы всегда тесные потоки, так как они используют довольно некоторые системные ресурсы. Java имеет некоторые механизмы для закрытия потоков в сборке мусора, но эти механизмы следует рассматривать только как последнее средство, поскольку потоки могут жить довольно долго, прежде чем они будут фактически собраны мусором. Поэтому всегда используйте try {} finally {}, чтобы убедиться, что потоки закрыты даже на исключениях после открытия потока. Если вы не обратили на это внимание, вы получите сообщение IOException о том, что вы открыли слишком много файлов.

Вы хотите изменить свой код так:

public void new_file_with_text(String text, String fname) { 
    File f = null; 
    try { 
     f = new File(fname); 
     f.createNewFile(); 
     System.out.println(text);   
     PrintWriter out = new PrintWriter(f, "UTF-8"); 
     try { 
      out.print(text); 
     } finally { 
      out.close(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
2

Попробуйте использовать out.flush(); сразу после линии out.print(text);

Вот правильный способ написать в файле:

public void new_file_with_text(String text, String fname) { 
    try (FileWriter f = new FileWriter(fname)) { 
     f.write(text); 
     f.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+1

... или в блоке 'finally', а также' out.close() '! –

0

Вы должны закрыть файл:

PrintWriter out = new PrintWriter(f, "UTF-8"); 
try 
{ 
     out.print(text); 
} 
finally 
{ 
    try 
    { 
     out.close(); 
    } 
    catch(Throwable t) 
    { 
     t.printStackTrace(); 
    } 
} 
0

Вы должны всегда закрывать потоки (которые также смоет их), в конце концов блок, или с помощью Java 7 примерочных с-ресурсами объекта:

PrintWriter out = null; 
try { 
    ... 
} 
finally { 
    if (out != null) { 
     out.close(); 
    } 
} 

или

try (PrintWriter out = new PrintWriter(...)) { 
    ... 
} 

Если вы не закрываете свои потоки, не только все будет очищено от файла, но в какой-то момент ваша ОС будет недоступна для дескрипторов файлов.

1

Я проверил вас код. Вы забыли закрыть объект PrintWriter i.e out.close

try { 
     f = new File(fname); 
     f.createNewFile(); 
     System.out.println(text);   
     PrintWriter out = new PrintWriter(f, "UTF-8"); 
     out.print(text); 
     out.close(); // <-------------- 
    } catch (IOException e) { 
     System.out.println(e); 
    }