使用Java.IO合并文件夹中的所有.txt文件

时间:2017-08-17 13:17:11

标签: java file-io

我正在尝试将所有.txt文件合并到一个特定文件夹中,并创建一个output.txt文件。 我是Java学习Java.IO包的新手。 这是我的程序编译好并创建一个输出文件,但不写任何东西。 我验证了我的输入文本文件,它有数据。

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

3 个答案:

答案 0 :(得分:2)

我认为您的错误很小,可能是某些路径错误或类似的东西。无论如何,您应该使用名为 NIO 的新IO API与文件进行交互。关键类位于Paths包中的Filesjava.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和其他方法也接受一组您可以设置的选项。例如,如果文件尚不存在则应该创建。或者,如果它已经存在,则应该追加内容还是应该删除旧内容。

因此,请查看文档页面:

答案 1 :(得分: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();
    }
}

更新:这不是&#39; println&#39;。

答案 2 :(得分:0)

您应该始终在main方法中处理异常,否则将忽略异常。

如果目录不存在,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);
    }
}