有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在java中将多个文件合并到另一个新文件中?

我想合并一些如下所示的文件:

File 1
line 01
line 02
line 03

File2
line 04
line 05

输出应该是这样的:

NewFile
line 01
line 02
line 03
line 04
line 05

我的算法接收本地目录的URL,然后对其进行迭代,以仅获取具有json扩展名的文件并合并它们。例如,在这个URL中有两个json文件,但最后一个附加到新文件

这是到目前为止我的代码

public class ReadFiles {
    static FileWriter fileWriter;
    public static void main(String... args) throws IOException, InterruptedException, ParseException {
        File[] files = new File("C:\\xampp\\htdocs\\project-js\\blocks\\actions\\Application").listFiles();
        showFiles(files);
    }

    public static void showFiles(File[] files) throws FileNotFoundException, IOException, ParseException {
        for (File file : files) {
            if (file.isDirectory()) {
                System.out.println("Directory: " + file.getName());
                showFiles(file.listFiles());

            } else {
                if (file.getName().endsWith("json")) { // find only those with json extensions
                    System.out.println(file.getName());

                    JSONParser parser = new JSONParser();

                    fileWriter = new FileWriter("C:\\xampp\\htdocs\\project-js\\blocks\\actions\\Application\\ApplicationDesc.js");
                    fileWriter.write(parser.parse(new FileReader(file)).toString());
                    fileWriter.close();

                    try {
                        System.out.println(parser.parse(new FileReader(file)));
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                }  
            }
        }
    }
}

共 (3) 个答案

  1. # 1 楼答案

    您可以收集所有文件的文本

    为此,您需要逐个读取每个文件并提取其内容

    使用此选项将单个文件的内容提取为字符串

    private static String readFileAsString(String filePath){
        StringBuilder contentBuilder = new StringBuilder();
    
        try (Stream<String> stream = Files.lines( Paths.get(filePath), StandardCharsets.UTF_8)){
            stream.forEach(s -> contentBuilder.append(s).append("\n"));
        }
        catch (IOException e){
            e.printStackTrace();
        }
    
        return contentBuilder.toString();
    }
    

    您可以为每个提取的字符串创建一个JSONObject(org.json)

    JSONObject jsonObj = new JSONObject(extractedString);
    

    然后将它存储在一个列表中

    要使用JSONObject,请将其添加到pom中。xml或手动下载JAR

    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20180813</version>
    </dependency>
    

    使用下面的方法从列表中合并JSONObject

    public static JSONObject mergeJSONObjects(JSONObject json1, JSONObject json2) {
        JSONObject mergedJSON = new JSONObject();
        try {
            mergedJSON = new JSONObject(json1, JSONObject.getNames(json1));
            for (String key : JSONObject.getNames(json2)) {
                mergedJSON.put(key, json2.get(key));
            }
    
        } catch (JSONException e) {
            throw new RuntimeException("JSON Exception" + e);
        }
        return mergedJSON;
    }
    

    然后在文件中写入最后一个字符串

    用这样的东西

     BufferedWriter writer = new BufferedWriter(new FileWriter("test.txt"));
     writer.write();
     writer.close();
    

    这是可行的,但是文件的大小应该很小,对于较大的文件,您需要找到更好的解决方案

  2. # 2 楼答案

    只需将第二个文件的内容附加到第一个文件的末尾即可

    请注意,json内容文件与另一个json内容文件合并后会生成非json内容文件

    例如a.json:

    { "name":"John" }
    

    和b.json:

    { "name":"Anna" }
    

    结果是一个综合的结果。json

    { "name":"John" }
    { "name":"Anna" }
    

    这不是有效的json

    如果您有一个json对象数组,也会发生这种情况:

    a.json:

    [{ "name":"John" }, { "name":"Anna" }] 
    

    b.json

    [{ "name":"Keith"}]
    

    以及两者的结合:

    [{ "name":"John" }, { "name":"Anna" }] 
    [{ "name":"Keith"}]
    

    这不是有效的json内容文件

  3. # 3 楼答案

    该代码中的问题是:

      fileWriter = new FileWriter("C:\\xampp\\htdocs\\project-js\\blocks\\actions\\Application\\ApplicationDesc.js");
      fileWriter.write(parser.parse(new FileReader(file)).toString());
      fileWriter.close();
    

    它每次都会创建一个新的FileWriter并覆盖上一个文件。您可以使用以下方法创建fileWriter:

    fileWriter = new FileWriter("C:\\xampp\\htdocs\\project-js\\blocks\\actions\\Application\\ApplicationDesc.js",true); //The true in the end is to append to file
    

    或者在循环外部创建fileWriter,然后在循环完成时关闭它。如果文件的内容与您的示例中的内容类似,那么您就可以了。如果它们是JSON文件,并且您希望得到一个有效的JSON结果,那么您不能仅仅将它们附加到一个大文件中