我想合并一些看起来像这样的文件:
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();
}
}
}
}
}
}
答案 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();
这可行,但是文件的大小应该较小,对于较大的文件,您需要找到更好的解决方案。