2014-11-14 108 views
0

我有一個程序用於讀取我的文件夾中的所有文件,並將這些文件合併到文件中並將它們放到一個新文件夾中。一些文件沒有被拉入,我不知道爲什麼。爲什麼我的程序沒有從文件夾中提取文件

文件名是wonder1.txt,wonder2.txt,wonder3.txt和wonder4.txt,文件夾名稱是Alice,但只有少數文件實際位於新文件夾中。

import java.io.*; 
import java.util.Scanner; 
import java.util.*; 
import java.lang.*; 
import java.io.PrintWriter; 



public class alice { 

    public static void main(String[] args) throws FileNotFoundException, IOException { 
     File folder = new File("/Users/DAndre/Desktop/Alice"); 

     //Reads in all the files in that folder 

     for (final File fileEntry : folder.listFiles()) { 
      String fileName = fileEntry.getAbsolutePath(); 
      BufferedReader br = new BufferedReader(new FileReader(fileName)); 
      try { 
       StringBuilder stringBuilder = new StringBuilder(); 
       String line = br.readLine(); 

       while (line != null) { 
        stringBuilder.append(line); 
        stringBuilder.append("\n"); 
        line = br.readLine(); 
       } 


       /** 
       * Pass original file content as string to another method which 
       * creates new file with same content. 
       */ 

       newFile(stringBuilder.toString()); 

      } finally { 
       br.close(); 
      } 
     } 

    } 

    public static void newFile(String fileContent) { 
    try { 
     String newFileLocation = "/Users/DAndre/Desktop/final/final_copy.txt"; 
     PrintWriter writer = new PrintWriter(newFileLocation); 
     writer.write(fileContent);//Writes original file content into new file 
     writer.close(); 
     System.out.println("File Created"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+0

讓我猜測,只有一個文件在'final_copy.txt'中?也許是因爲新的PrintWriter(newFileLocation);會截斷給定文件的內容,如果它已經存在了,你可以在[JavaDoc](https://docs.oracle.com/javase/7/文檔/ API/JAVA/IO/PrintWriter.html#的PrintWriter%28java.lang.String%29)。 – Tom 2014-11-14 19:32:14

+0

另外,你在說「'文件夾= ....'」。我認爲你需要一些有Folder對象的東西,而不是File對象。因爲你正在做'新的文件(/用戶/ DAndre /桌面/愛麗絲)',但在我看來,給出的路徑是一個文件夾,而不是文件。 – ha9u63ar 2014-11-14 19:33:01

+0

@hagubear我的朋友可能不是真的。它說:文件和目錄路徑名的抽象表示:Doc:https://docs.oracle.com/javase/7/docs/api/java/io/File.html – guness 2014-11-14 19:33:52

回答

1

解決方案的問題在於,您尚未以附加模式初始化PrintWriter,因此新文件會被寫入的最後一個文件的內容覆蓋。

public static void newFile(String fileContent) { 
try { 
    String newFileLocation = "C:\\Users\\Shayan\\Desktop\\files2\\final_copy.txt"; 
    PrintWriter writer = new PrintWriter(new FileOutputStream(new File(newFileLocation), true /* append = true */)); 
    writer.write(fileContent);//Writes original file content into new file 
    writer.close(); 
    System.out.println("File Created"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

}

在FileOututStream的構造函數的最後一個參數被設置爲true,表明它應該在追加模式打開。

+0

對不起,我改變了我的電腦的文件夾路徑,但我希望你明白了:) – 2014-11-14 19:45:19

+0

它的工作原理,但我怎麼才能讓他們像文件是故事的一部分,所以它的wonder1.txt,wonder2 .text等 – unlimited4311 2014-11-14 19:50:51

+0

如果您在編譯時知道文件的順序,那麼您可以做的一件事是首先讀取並保存ArrayList中的所有文件,然後按照您希望的順序在這些文件上調用newFile方法 – 2014-11-14 19:54:35

0

您需要更改

PrintWriter writer = new PrintWriter(newFileLocation); 

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(newFileLocation, true))) 

一點解釋:追加意味着它相加寫,反之寫入覆蓋現有文件。在你的代碼中,你正在創建一個新文件,包括你的奇蹟之一,但是在下一次迭代時,文件被重新創建。所以前一個奇蹟的內容已經消失了。

隨着PrintWriter對象的更改不會重新創建文件,而是將內容寫入BufferedWriter,該BufferedWriter也將流傳輸到可追加的FileWriter對象。

小提示:不要在每次迭代中創建一個PrintWriter對象。

第二點小建議:你不需要PrintWriter。就我所見,BufferedWriter本身就足夠好了。

+0

我認爲你應該添加一點解釋,爲什麼'write'是錯誤的,'append'是正確的。 – AdamMc331 2014-11-14 19:37:53

+0

'append'不正確。如果你重新編寫作者,它並沒有太大的改變。 – Tom 2014-11-14 19:38:27

+0

@你說得對,我的項目通常不需要PrintWriter。現在修復它。 – guness 2014-11-14 19:49:53

相關問題