2009-10-29 3 views
0

Я с проблемой записи в файл:Проблемы запись в файл

FileInputStream fin;    
try 
{ 
    fin = new FileInputStream ("c:/text.txt");  
    PrintStream p = new PrintStream(fin); 
    p.println ("test"); 
    fin.close();    
} 
catch (IOException ioe) 
{ 
    System.err.println (ioe.getMessage); 
} 

Есть ли проблема с этим кодом?

+0

Вы пытались скомпилировать его? ;) вам следует использовать IDE (например, Eclipse, Netbeans, ...). Таким образом, вы можете напрямую видеть ошибки компилятора. –

+0

Какая у вас конкретная проблема? Скомпилирует ли он, бросает ли он неожиданные исключения или программа ничего не печатает? – wheleph

ответ

6

Вам необходимо использовать FileOutputStream.

+1

Ему также необходимо закрыть «PrintStream». – McDowell

+1

Или, по крайней мере, для его очистки. –

5

Привыкание к следующей структуре. Вы будете использовать его много в Java.

PrintStream out = null; 
try { 
    out = new PrintStream(new FileOutputStream("c:/text.txt")); 
    out.println ("test"); 
} catch (IOException e) { 
    System.err.println (e.getMessage); 
} finally { 
    if (out != null) { 
    try { out.close(): } catch (Exception e) { } 
    } 
    out = null; // safe but not strictly necessary unless you reuse fin in the same scope 
} 

По крайней мере до тех пор, ARM blocks надеюсь, не случаться в Java 7.

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

+0

Возможно, вы захотите выполнить контракт и закрыть PrintStream – McDowell

+0

Хорошо, эта ссылка на ARM Blocks сделала мой день. Upvote! –

0

Класс: FileInputStream Используется для чтения ввода из файла. Если вы хотите записать в файл, вы можете использовать: FileOutputStream. Если вы хотите сделать свою жизнь очень легкой, вы также можете использовать BufferedOutputStream.

Как указано, вы должны закрыть свои потоки в блоке finally. Причина, по которой вы хотите сделать это, говорит, что ваша программа не очень маленькая, и это более широкое приложение. Если вы забудете закрыть потоки файлов, например, приложение будет удерживать его, и если вы попытаетесь что-то сделать с ним в файловой системе (прочитайте: по крайней мере, в Windows), вы не сможете этого сделать. Мы все видели, что «Файл не может быть удален, потому что он все еще используется».

Вот пример использования FileOutputStream + BufferedOutputStream: http://www.javadb.com/write-to-file-using-bufferedoutputstream.

3

Проблема с этим кодом, который немедленно ударяет меня:

  • Нестандартное форматирование.
  • Неверные имена переменных.
  • Обработка исключений не очень хорошая.
  • Невозможность закрыть файл в случае исключений. (Используйте acquire(); try { use(); } finally { release(); }.
  • Скрытое использование кодировки символов по умолчанию.
  • PrintStream ласточки исключения. BufferedOutputStream лучше.
  • Failure промывать декоратора. Он может до сих пор данные в буфер. Хотя на самом деле в этом случае вы покинули PrintStream в автоматическом режиме смыва, который может быть проблема с производительностью.
  • Использование / для разделителей пути Windows. Вы можете быть в состоянии уйти с ним, но это не очень хорошо.

Итак:

FileOutputStream fileOut = new FileOutputStream(
    "c:\\text.txt" 
); 
try { 
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
     fileOut, 
     "UTF-8" // Or, say, Charset.defaultCharset() 
    )); 
    out.write("test"); 
    out.newLine() 
    out.flush(); 
} finally { 
    fileOut.close(); 
} 
Смежные вопросы