2017-08-17 187 views
1

我試圖合併一個特定文件夾中的所有.txt文件並創建一個output.txt文件。 我是新來的Java學習Java.IO包。 這裏是我的程序,編譯得很好,並創建一個輸出文件,但不寫任何東西。 我驗證了我的輸入文本文件並且它有數據。使用Java.IO合併文件夾中的所有.txt文件

import java.io.*; 

class Filemerger 
{ 
    public static void main(String[] args) throws IOException 
    { 
     PrintWriter pw = new PrintWriter("true1.txt");  
     File f = new File("E:\\A"); 
     String[] s = f.list(); 
     for (String s1 : s) 
     { 
      File f1 = new File(f, s1); 
      BufferedReader br = new BufferedReader(new FileReader(f1)); 
      String line = br.readLine(); 
      while (line != null) 
      { 
       pw.println(line); 
       line = br.readLine(); 
      } 
     } 
     pw.flush(); 
     pw.close(); 
    } 
} 
+0

我不會推薦閱讀和寫作的同時,我想以後我讀完成了原始文件的寫入。 –

+0

您應該使用名爲'NIO'的新文件API,它更健壯,並且提供更多功能。核心類有'Paths'和'Files'。 – Zabuza

+0

你能確認你的中間文件指向了正確的路徑嗎?我的意思是這個'文件f1 =新文件(f,s1);'。也許路徑是錯誤的,打印出來並看看它。 – Zabuza

回答

1

我認爲你的錯誤是最小的,也許有些路徑是錯誤的或類似的東西。無論如何,您應該使用名爲NIO的新IO API與文件進行交互。關鍵類別爲PathsFiles,位於包裝java.nio

class Filemerger 
{ 
    public static void main(String[] args) throws IOException 
    { 
     Path output = Paths.get("true1.txt"); 
     Path directory = Paths.get("E:\\A"); 
     Stream<Path> filesToProcess = Files.list(directory); 

     // Iterate all files 
     filesToProcess.forEach(path -> { 
      // Get all lines of that file 
      Stream<String> lines = Files.lines(path); 
      // Iterate all lines 
      lines.forEach(line -> { 
       // Append the line separator 
       String lineToWrite = line + System.lineSeparator(); 

       // Write every line to the output file 
       Files.write(output, lineToWrite.getBytes(StandardCharsets.UTF_8)); 
      }); 
     }); 
    } 
} 

或者你也可以使用Stream#flatMap方法,如果你只是想收集所有文件中的所有行沒有映射到它們屬於哪個文件:

Path output = Paths.get("true1.txt"); 
Path directory = Paths.get("E:\\A"); 

Files.list(directory) 
    .flatMap(Files::lines) 
    .forEach(line -> { 
     Files.write(output, (line + System.lineSeparator()) 
      .getBytes(StandardCharsets.UTF_8)); 
    }); 

注意Files#write和其他方法也接受一堆你可以設置的選項。例如,如果文件如果還不存在,應該創建它。或者,如果它已經存在,則應該添加內容還是應該刪除舊內容。

因此看看文檔網頁:

0

你的代碼沒有任何內容寫入文件。也許println()方法。請根據您的要求調整輸入和輸出文件的路徑。

經過稍微修改:

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Arrays; 

public class MergeTextFiles { 
    public static void main(String[] args) throws IOException { 
     File f = new File("./src/main/resources"); 

     File merged = new File("./src/main/resources/merged.txt"); 
     if (!merged.exists()) { 
      merged.createNewFile(); 
     } 

     PrintWriter pw = new PrintWriter(merged); 

     String[] s = f.list(); 
     System.out.println("list of files-> " + Arrays.asList(s)); 

     for (String s1 : s) { 
      File f1 = new File(f, s1); 
      BufferedReader br = new BufferedReader(new FileReader(f1)); 

      String line = ""; 
      while ((line = br.readLine()) != null) { 
       System.out.println(line); 
       pw.println(line); 
      } 
     } 
     pw.flush(); 
     pw.close(); 
    } 
} 

更新:這不是 '調用println'。

+0

雖然你應該去@ Zabuza的解決方案,更優雅的方式來做IO操作。 –

0

您應該始終處理main方法中的異常,否則將忽略異常。如果目錄不存在,f.list()返回null(!);如果目錄不存在,則返回null(!);如果目錄不存在,

如果目錄包含子目錄,那些子目錄的名稱也將被返回,所以你必須測試一個文件確實是一個文件;

當你打開一個文件,你應該將其關閉或(更好)使用與資源try塊:

public static void main(String[] args) 
{ 
    try(PrintWriter pw = new PrintWriter("true1.txt")) { 
     File f = new File("E:\\A"); 
     String[] s = f.list(); 
     if (s == null) { 
      throw new IOException("Directory doesn't exist: " + f); 
     } 
     for (String s1 : s) 
     { 
      File f1 = new File(f, s1); 
      if (!f1.isFile()) { 
       continue; 
      } 
      try (Reader reader = new FileReader(f1); 
        BufferedReader br = new BufferedReader(reader)) { 
       String line = br.readLine(); 
       while (line != null) 
       { 
        pw.println(line); 
        line = br.readLine(); 
       } 
      } 
     } 
    } catch (Throwable e) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
相關問題