2011-01-06 3 views
68

Я хотел бы добавить новую строку в существующий файл, не удаляя текущую информацию этого файла. Короче говоря, здесь методика, которую я использую текущее время:Как добавить новую строку текста в существующий файл на Java?

import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.Writer; 

Writer output; 
output = new BufferedWriter(new FileWriter(my_file_name)); //clears file every time 
output.append("New Line!"); 
output.close(); 

Проблема с указанными выше линии просто они стирая все содержимое моего существующего файла, то добавив новый текст строки.

Я хочу добавить текст в конце содержимого файла без стирания или замены чего-либо.

+0

@ ripper234 действительно! Он должен быть отмечен как дубликат. – rahulserver

ответ

104

вы должны открыть файл в режиме добавления, который может быть достигнут с помощью конструктора FileWriter(String fileName, boolean append).

output = new BufferedWriter(new FileWriter(my_file_name, true)); 

должен сделать трюк

+2

Большое спасибо! Пожалуйста, есть способ добавить ("\ n") в конце после каждого выхода? Как вы знаете, это добавляет все в одну строку, игнорируя мои «\ n» escape-последовательности! – CompilingCyborg

+8

'BufferedWriter' имеет метод' newLine() '. Вы можете использовать это или использовать вместо этого 'PrintWriter', который предоставляет метод' println() ' –

+2

Спасибо! но по какой-то причудливой причине, когда я пытаюсь использовать: output.newLine() | не существует в списке методов. Я использую NetBeans 6.9. Там есть все другие методы. Вы знаете, что может быть причиной этого? – CompilingCyborg

1

В строке 2 изменения new FileWriter(my_file_name) в new FileWriter(my_file_name, true) так что вы добавления к файлу, а не перезаписывать.

2

Вы можете использовать конструктор FileWriter(String fileName, boolean append), если хотите добавить данные в файл.

Изменить код для этого:

output = new BufferedWriter(new FileWriter(my_file_name, true)); 

От FileWriter Javadoc:

конструирует объект FileWriter присваивается имя файла . Если второй аргумент равен true, то байты будут записаны в в конец файла, а не в начало .

20

не решение с FileWriter работает, однако у вас нет возможности определить выходную кодировку затем, в этом случае будет использоваться кодировка по умолчанию для машины, и это, как правило, не UTF-8!

Так, в лучшем случае использовать FileOutputStream:

Writer writer = new BufferedWriter(new OutputStreamWriter(
     new FileOutputStream(file, true), "UTF-8")); 
+1

Не забудьте закрыть 'FileOutputStream' – yegor256

+0

Это решение разрешает проблему для добавления существующего файла utf-8. – glider

+0

Должен быть отмечен как лучший ответ :-) –

7

Try: "\ г \ п"

Java 7 Пример:

// append = true 
try(PrintWriter output = new PrintWriter(new FileWriter("log.txt",true))) 
{ 
    output.printf("%s\r\n", "NEWLINE"); 
} 
catch (Exception e) {} 
+4

\ r \ n предназначен для окон. Лучше использовать свойство «line.separator» – rpax

3

В случае, если вы ищете метод вырезания и вставки, который создает и записывает в файл, вот что я написал, что просто берет строку вход. Удалите 'true' из PrintWriter, если вы хотите каждый раз перезаписывать файл.

private static final String newLine = System.getProperty("line.separator"); 

private synchronized void writeToFile(String msg) { 
    String fileName = "c:\\TEMP\\runOutput.txt"; 
    PrintWriter printWriter = null; 
    File file = new File(fileName); 
    try { 
     if (!file.exists()) file.createNewFile(); 
     printWriter = new PrintWriter(new FileOutputStream(fileName, true)); 
     printWriter.write(newLine + msg); 
    } catch (IOException ioex) { 
     ioex.printStackTrace(); 
    } finally { 
     if (printWriter != null) { 
      printWriter.flush(); 
      printWriter.close(); 
     } 
    } 
} 
8

Начиная с Java 7:

Определите путь и строку, содержащую разделитель строки в начале:

Path p = Paths.get("C:\\Users\\first.last\\test.txt"); 
String s = System.lineSeparator() + "New Line!"; 

, а затем вы можете использовать один из следующих подходов:

  1. Использование Files.write (небольшие файлы):

    try { 
        Files.write(p, s.getBytes(), StandardOpenOption.APPEND); 
    } catch (IOException e) { 
        System.err.println(e); 
    } 
    
  2. Использование Files.newBufferedWriter (текстовые файлы):

    try (BufferedWriter writer = Files.newBufferedWriter(p, StandardOpenOption.APPEND)) { 
        writer.write(s); 
    } catch (IOException ioe) { 
        System.err.format("IOException: %s%n", ioe); 
    } 
    
  3. Использование Files.newOutputStream (совместимую с java.io API):

    try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(p, StandardOpenOption.APPEND))) { 
        out.write(s.getBytes()); 
    } catch (IOException e) { 
        System.err.println(e); 
    } 
    
  4. Использование Files.newByteChannel (случайные файлы доступа):

    try (SeekableByteChannel sbc = Files.newByteChannel(p, StandardOpenOption.APPEND)) { 
        sbc.write(ByteBuffer.wrap(s.getBytes())); 
    } catch (IOException e) { 
        System.err.println(e); 
    } 
    
  5. Использование (файлов произвольного доступа) FileChannel.open:

    try (FileChannel sbc = FileChannel.open(p, StandardOpenOption.APPEND)) { 
        sbc.write(ByteBuffer.wrap(s.getBytes())); 
    } catch (IOException e) { 
        System.err.println(e); 
    } 
    

Подробности об этих методах можно найти в Oracle's tutorial.

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