Czy jest to najlepszy sposób na przepisanie zawartości pliku w Javie?

Chcę przepisać zawartość pliku.

Do tej pory myślałem o tym:

  1. Zapisz nazwę pliku
  2. Usuń istniejący plik
  3. Utwórz nowy pusty plik o tej samej nazwie
  4. zapis żądanej zawartości do pustego pliku

Czy to najlepszy sposób? A może jest bardziej bezpośredni sposób, to znaczy, że nie trzeba usuwać i tworzyć plików, ale po prostu zmienić zawartość?

Author: Peter Mortensen, 2009-06-19

7 answers

Aby nadpisać plik foo.log with FileOutputStream:

File myFoo = new File("foo.log");
FileOutputStream fooStream = new FileOutputStream(myFoo, false); // true to append
                                                                 // false to overwrite.
byte[] myBytes = "New Contents\n".getBytes(); 
fooStream.write(myBytes);
fooStream.close();

Lub z FileWriter :

File myFoo = new File("foo.log");
FileWriter fooWriter = new FileWriter(myFoo, false); // true to append
                                                     // false to overwrite.
fooWriter.write("New Contents\n");
fooWriter.close();
 78
Author: Stobor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-07 14:41:31

Gorąco polecam używanie w tym celu FileUtil Apache Common. Uważam, że ta paczka jest bezcenna. Jest łatwy w użyciu i równie ważne jest, że jest łatwy do odczytania/zrozumienia, gdy wrócisz chwilę później.

//Create some files here
File sourceFile = new File("pathToYourFile");
File fileToCopy = new File("copyPath");

//Sample content
org.apache.commons.io.FileUtils.writeStringToFile(sourceFile, "Sample content");

//Now copy from source to copy, the delete source.
org.apache.commons.io.FileUtils.copyFile(sourceFile, fileToCopy);
org.apache.commons.io.FileUtils.deleteQuietly(sourceFile);

Więcej informacji można znaleźć na stronie: http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html

 11
Author: jnt30,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 04:34:38

Zobacz: java. io. RandomAccessFile

Będziesz chciał otworzyć plik do odczytu i zapisu, więc:

RandomAccessFile raf = new RandomAccessFile("filename.txt", "rw");
String tmp;
while (tmp = raf.readLine() != null) {
    // Store String data
}
// do some string conversion
raf.seek(0);
raf.writeChars("newString");
 5
Author: drfloob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 04:05:35

O ile nie dodajesz treści na końcu, rozsądnie jest to zrobić w ten sposób. Jeśli dodajesz, spróbuj FileWriter z konstruktorem append.

Nieco lepszym porządkiem byłoby:

  1. Wygeneruj nową nazwę pliku (np. foo.txt.Nowy)
  2. Zapisz zaktualizowaną zawartość do nowego pliku.
  3. Do Atomic rename from foo.txt.nowy w foo.txt

Niestety, renameTo nie jest gwarantowane aby zrobić atomic rename.

 2
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 03:59:04

W poniższym przykładzie "false" powoduje nadpisanie pliku, true spowoduje odwrotnie.

File file=new File("C:\Path\to\file.txt");
DataOutputStream outstream= new DataOutputStream(new FileOutputStream(file,false));
String body = "new content";
outstream.write(body.getBytes());
outstream.close(); 
 1
Author: Sev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-19 04:00:06

Są chwile, kiedy można chcieć zachować ogromny pusty plik, aby uniknąć dodatkowych kosztów systemu operacyjnego przydzielającego miejsce w zależności od potrzeb. Zwykle odbywa się to za pomocą baz danych, maszyn wirtualnych, a także w programach wsadowych, które przetwarzają i zapisują dane zbiorcze. Poprawiłoby to znacznie wydajność aplikacji. W takich przypadkach napisanie nowego pliku i zmiana jego nazwy nie pomogłoby. Zamiast tego pusty plik będzie musiał zostać wypełniony. Wtedy trzeba przejść do trybu nadpisywania.

 1
Author: Lakshmi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-20 13:53:06

Guajawa Plik.zapis "nadpisuje Plik z zawartością tablicy bajtów":

Files.write(bytes, new File(path));
 1
Author: Vadzim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 14:22:05