如何在Java中的另一个新文件中合并多个文件?

时间:2019-05-07 14:35:27

标签: 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 个答案:

答案 0 :(得分:0)

您只需要将第二个文件的内容附加到第一个文件的末尾。

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

例如a.json:

{ "name":"John" }

和b.json:

{ "name":"Anna" }

产生一个combined.json

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

那不是有效的json。

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

a.json:

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

b.json

[{ "name":"Keith"}]

及其组合:

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

那不是有效的json内容文件

答案 1 :(得分:0)

该代码中的问题:

  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结果,则不能将它们附加到一个大文件中

答案 2 :(得分:0)

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

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

使用它来提取单个文件的内容作为字符串

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

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

JSONObject jsonObj = new JSONObject(extractedString);

然后将jsonObj存储在列表中。

要使用JSONObject,请将其添加到pom.xml或手动下载jars

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

使用以下方法合并列表中的JSONObjects

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

然后将最终的String写入文件中。

使用类似这样的东西

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

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