2017-08-17 5 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

中間ファイルが正しいパスを指していることを確認できますか?私はこの 'File f1 = new File(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

メインメソッドでは常に例外を処理する必要があります。それ以外の場合は例外は無視されます。

ディレクトリが存在しない場合、f.list()は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); 
    } 
} 
関連する問題