2009-10-24 2 views
2

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

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

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(); 
} 
+0

Я думаю, что вы ищете 'file.length()'. Этот метод возвращает размер файла в байтах. –

ответ

0
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

+0

!? вы предполагаете, что все программы, обращающиеся к файлу, находятся в одной JVM, так что ключевое слово «synchronized» предотвращает одновременное использование нескольких файлов. как насчет процессов вне JVM? вне компьютера? (если файл поделился через сеть) –

+0

Джейсон, я пытался получить что-то, что приводит к понятию уплощения (я не знаю, как он называется, я делаю это все время), где вы сортируете код заполняя буфер копирования-вставки и разворачивая цикл, я бы добрался до sync() и блокировки после того, как op заметил его - я сейчас занят JCE, остаюсь с op, пока он не получает нулевую длину чтобы сделать проблему обработанной ... это другое, как то, что вы упомянули на моем ... хе, владельцы сайтов -> можно ли получить редактор кода во всех тяжелых сценариях ??? ..... действительно, действительно помогло бы (большое время!) –

0

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

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

0Kb-файл происходит потому, что вы снова перезаписываете тот же файл. Overwriting очищает все данные, а затем начинает писать новый контент.

2

Попробуйте записать во временный файл (в той же файловой системе) и как только запись файла полностью переместится на место с помощью 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
FileWriter fWriter = new FileWriter(fileName,true); 

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