2016-04-01 25 views
0

Bazı verilerin olduğu, birden çok belgeden seçip yeni bir dosya oluşturduğum bir program yazıyorum.Verileri her zaman taze olarak dosyaya yaz

Kodum aşağıda.

public class IndexFiles extends SwingWorker<Void, String> { 
    private String inputPath; 

    public IndexFiles(String inputPath) { 
     this.inputPath = inputPath; 
    } 

    @Override 
    protected Void doInBackground() throws Exception { 
     File directory = new File(inputPath); 
     countFilesInDirectory(directory); 
     return null; 
    } 

    void countFilesInDirectory(File directory) throws IOException { 
     System.out.println("entered"); 
     File[] list = directory.listFiles(); 
     System.out.println("length is " + list.length); 
     for (int i = 0; i < list.length; i++) { 
      GenerateFiles(list[i].getAbsoluteFile().toString()); 
     } 

    } 

    private void GenerateFiles(String inputfilePath) throws IOException { 
     String input = inputfilePath; 
     URL url = new URL("file:///" + input); 
     BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
     String inputLine; 

     String tempPath = inputfilePath.substring(0, inputfilePath.lastIndexOf("\\") + 1); 
     String secPath = tempPath.substring(0, tempPath.lastIndexOf("\\")); 
     String finalPath = secPath.substring(0, secPath.lastIndexOf("\\")) + "\\OP\\"; 

     File outPath = new File(finalPath); 
     if (!outPath.exists()) { 
      outPath.mkdir(); 
     } 
     File temp = new File(finalPath + "temp.txt"); 
     FileOutputStream fos = new FileOutputStream(temp, true); 

     if (!temp.exists()) { 
      temp.createNewFile(); 
     } 
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos)); 
     bw.write(""); 
     while ((inputLine = in.readLine()) != null) { 
      if (inputLine.contains("/section")) { 
       break; 
      } 
      if (inputLine.contains("DOCTYPE")) { 
       inputLine = inputLine.replace("<!DOCTYPE html>", ""); 
      } 
      if (inputLine.contains("html")) { 
       inputLine = inputLine.replaceAll(
         "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta http-equiv=\"content-type\" content=\"text/html\" charset=\"utf-8\"/>(.*)<section>", 
         ""); 
      } 
      if (inputLine.contains("?")) { 
       inputLine = inputLine.replace("<?", ""); 
      } 
      if (inputLine.contains("pb")) { 
       inputLine = inputLine.replaceAll("pb label=\"(.*)\"?>", ""); 
      } 
      if (!(inputLine.trim().isEmpty())) { 
       bw.append(inputLine); 
       bw.newLine(); 
      } 
     } 
     bw.close(); 
     in.close(); 

    } 

} 

Bu program ilk kez düzgün çalışıyor. Dosya doğru şekilde oluşturuluyor. Ancak sorun, bunu tekrar çalıştırdığımda ortaya çıkıyor, yeni bir veri oluşturmak yerine ekleniyor. Bunun FileOutputStream fos = new FileOutputStream(temp, true); nedeniyle olduğundan eminim, true'u kaldırırsam, her dosya bittiğinde yeni bir kopya güncellenir. Ama benim ihtiyacım, mevcut olana eklenmek yerine, programı her çalıştırdığımda yeni bir veri yaratmak.

10 dosya diyorum ve programı çalıştırıyorum, tüm 10 dosyanın içeriği geçici dosyaya gitmeli. Tekrar çalıştırıyorum, olması gerektiği gibi, geçici dosyayı temizliyorum. Bu 10 dosyanın içeriğini yazınız. ama şu anda programı çalıştırıyorum, veriler geçici dosyaya yazılıyor, tekrar çalıştırıyorum, aynı 10 dosya verisine ekleniyor. Tam içeriği değiştirmek istiyorum, ancak tek tek dosya içeriği. İlk çalıştırdığımda, 10 dosya verisi geçici dosyaya yazılır. Tekrar çalıştırıyorum, geçici dosya temizlenmeli ve bu 10 dosya verisi yazılmalıdır.

Lütfen bunu nasıl yapabilirim?

Teşekkür

+0

[Java varolan bir çıktı dosyasının üzerine yazma] 'nın kopyası (http://stackoverflow.com/questions/17957849/java-overwriting-an-existing-output-file)? –

+0

Sanırım sorun aynı dosya adıyla. Dosya adında zaman damgasını eklemeyi deneyin. Yani her seferinde yeni dosya oluşturacak. – sAm

+0

Merhaba @TomRees, hayır öyle değil. Yukarıdaki problemden açıkça bahsetmiştim. – Rakesh

cevap

1

birini tercih edin:

  • countFilesInDirectory gerçek-bayrağı olmadan BufferedWriter oluşturun ve
  • için önce geçici dosya silme kodu ekleyin GenerateFiles bir argüman olarak iletin countFilesInDirectory
+0

Teşekkürler bu ipucu işe yaradı :) :) :) – Rakesh

1

Kullanım

0 yılında -loop yerine ekleme true olarak ayarlanırsa FileOutputStream (Dosya dosyası, boolean ekleme) yapıcısı için, yazdığınız veri dosyanın sonuna eklenecektir

FileOutputStream fos = new FileOutputStream(temp, true); 

ait

yerine ne üzerine yazmak yerine Zaten

İlgili konular