Это лучший способ переписать содержимое файла в Java?

StackOverflow https://stackoverflow.com/questions/1016278

  •  06-07-2019
  •  | 
  •  

Вопрос

Я хочу переписать содержимое файла.

До сих пор я думал о следующем:

<Ол>
  • Сохранить имя файла
  • Удалить существующий файл
  • Создать новый пустой файл с тем же именем
  • Запишите нужный контент в пустой файл
  • Это лучший способ? Или есть более прямой путь, то есть не нужно удалять и создавать файлы, а просто изменять содержимое?

    Это было полезно?

    Решение

    Перезаписать файл foo.log с помощью 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();
    

    или с 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();
    

    Другие советы

    Я бы настоятельно рекомендовал для этого использовать FileUtil от Apache Common. Я нашел этот пакет бесценным. Он прост в использовании и, что не менее важно, его легко читать / понимать, когда вы вернетесь позже.

    //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);
    

    Дополнительную информацию можно найти по адресу: http://commons.apache.org/io /api-release/org/apache/commons/io/FileUtils.html

    Если вы просто не добавляете контент в конце, разумно сделать это таким образом. Если вы добавляете сообщение, попробуйте FileWriter с конструктор дополнения.

    Немного лучший порядок будет:

    <Ол>
  • Создать новое имя файла (например, foo.txt.new)
  • Запишите обновленное содержимое в новый файл.
  • Делайте атомарное переименование из foo.txt.new в foo.txt
  • К сожалению, renameTo - это не гарантированное выполнение атомарного переименования.

    В приведенном ниже примере " ложь " вызывает перезапись файла, значение true вызывает обратное.

    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(); 
    

    В некоторых случаях может потребоваться сохранить огромный пустой файл, чтобы избежать дополнительных затрат на выделение пространства ОС по мере необходимости. Обычно это делается с помощью баз данных, виртуальных машин, а также в пакетных программах, которые обрабатывают и записывают объемные данные. Это значительно повысит производительность приложения. В этих случаях написание нового файла и переименование его не очень поможет. Вместо этого пустой файл должен быть заполнен. Именно тогда нужно перейти в режим переопределения.

    Гуава File.write " перезаписывает файл с содержимым байтового массива "

    Files.write(bytes, new File(path));
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top