Java FileWriter перезаписать - PullRequest
       13

Java FileWriter перезаписать

2 голосов
/ 24 октября 2009

У меня есть фрагмент кода, который генерирует новые данные всякий раз, когда появляются новые данные, доступные как InputStream. Один и тот же файл перезаписывается каждый раз. Иногда файл становится 0 кб, прежде чем он будет записан. Веб-сервис читает эти файлы через равные промежутки времени. Мне нужно избегать случая, когда файл имеет размер 0 байт.

Как это сделать? Помогут ли замки в этом случае? Если браузер входит, чтобы прочитать файл, который заблокирован, он будет продолжать показывать старые данные из кэша, пока не будет снята блокировка, и файл не будет доступен для повторного чтения.

try{
String outputFile = "output.html";     
FileWriter fWriter = new FileWriter(outputFile);
//write the data ...

fWriter .flush();


outputFile = "anotheroutput.html";     
fWriter = new FileWriter(outputFile);
//write the data ...

fWriter .flush();
fWriter.close();
}
catch(Exception e)
{
 e.prinStackTrace();
}

Ответы [ 4 ]

2 голосов
/ 24 октября 2009

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

public class Data
{
    private final File file;
    protected  Data(String fileName) {
        this.file = new File(filename);
    }

   /* above is in some class somehwere 
    *  then your code brings new info to the file
    */

   // 
   public synchronized accessFile(String data) {
       try {
           // Create temporary file
           String tempFilename = UUID.randomUUID().toString() + ".tmp";
           File tempFile = new File(tempFilename);

           //write the data ...
           FileWriter fWriter = new FileWriter(tempFile);
           fWriter.write(data);
           fWriter.flush();
           fWriter.close();

           // Move the new file in place
           if (!tempFile.renameTo(file)) {
               // You may want to retry if move fails?
               throw new IOException("Move Failed");
           }
       } catch(Exception e) {
           // Do something sensible with the exception.
           e.prinStackTrace();
       }
   }
}
1 голос
/ 18 декабря 2010
FileWriter fWriter = new FileWriter(fileName,true);

попробуйте использовать выше: -)

0 голосов
/ 24 октября 2009

Ваше требование не очень понятно. Хотите ли вы каждый раз записывать новый файл имен, или хотите добавить в тот же файл, или вы хотите перезаписать тот же файл? В любом случае все три случая просты, и с помощью API вы можете управлять им.

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

Файл 0Kb происходит потому, что вы снова перезаписываете тот же файл. Перезапись очищает все данные, а затем начинается запись нового содержимого.

0 голосов
/ 24 октября 2009
public class Data
{
  String fileName;
  protected  Data(String fileName)
  {
     this.fileName= fileName;
     return; // return from constructor often not needed.
  }

   /* above is in some class somehwere 
    *  then your code brings new info to the file
    */

  // 
  public synchronized accessFile(String data)
  {
    try
    {
       // File name to be class member.
       FileWriter fWriter = new FileWriter(fileName);
       //write the data ...
       fWriter.write(data);
       fWriter .flush();
       fWriter .close();
       return;
    }
    catch(Exception e)
    {
       e.prinStackTrace();
    }

это не нужно:

 outputFile = "anotheroutput.html";     
 fWriter = new FileWriter(outputFile);
 //write the data ...

fWriter .flush();
fWriter.close();

это потому, что работа с файлом - это метод класса Data

...