使用Java 7 nio读取和写入文件

时间:2014-12-11 19:17:07

标签: java file-io gson java-7 nio

我有一个由数组中的json元素组成的文件。 (几个文件。每个文件都有json数组元素)

我有一个进程知道将每个json元素作为一行从文件中处理并处理它。

所以我创建了一个读取JSON数组的小程序,然后将这些元素写入另一个文件。 该实用程序的输出将是另一个进程的输入。

我使用的是Java 7 NIO(和gson)。

我尝试尽可能多地使用Java 7 NIO。 我能做些什么改进吗? 过滤器怎么样?哪种方法更好?

谢谢,

public class TransformJsonsUsers {

public TransformJsonsUsers() {
}

public static void main(String[] args) throws IOException {
    final Gson gson = new Gson();

    Path path = Paths.get("C:\\work\\data\\resources\\files");
    final Path outputDirectory = Paths
            .get("C:\\work\\data\\resources\\files\\output");

    DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {

        @Override
        public boolean accept(Path entry) throws IOException {
            // which is better?
            // BasicFileAttributeView attView = Files.getFileAttributeView(entry, BasicFileAttributeView.class);
           // return attView.readAttributes().isRegularFile();
            return !Files.isDirectory(entry);
        }

    };

    DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path, filter);

    directoryStream.forEach(new Consumer<Path>() {
        @Override
        public void accept(Path filePath) {
            String fileOutput = outputDirectory.toString() + File.separator + filePath.getFileName();
            Path fileOutputPath = Paths.get(fileOutput);
            try {
                BufferedReader br = Files.newBufferedReader(filePath);
                User[] users = gson.fromJson(br, User[].class);
                BufferedWriter writer = Files.newBufferedWriter(fileOutputPath, Charset.defaultCharset());
                for (User user : users) {
                    writer.append(gson.toJson(user));
                    writer.newLine();
                }
                writer.flush();
            } catch (IOException e) {
                throw new RuntimeException(filePath.toString(), e);
            }

        }
    });
}

}

2 个答案:

答案 0 :(得分:1)

如果要从目录中读取所有文件,则无需使用Filter。过滤器主要用于应用某些过滤条件并读取文件的子集。它们两者在所有性能上可能没有任何实际差异。

如果您希望提高性能,可以尝试不同的方法。

<强>多线程

根据目录中存在的文件数量以及CPU的强大程度,您可以应用多线程一次处理多个文件

<强>队列

现在您正在同步读取和写入另一个文件。您可以使用Queue对文件的内容进行排队,并创建异步编写器。

您可以将这两种方法结合使用,以进一步提高性能。

答案 1 :(得分:1)

不要将I / O放入过滤器。这不是它的用途。您应该获得完整的文件列表,然后然后处理它。例如,如果I / O在目录中创建另一个文件,则行为未定义。您可能会错过文件,或者在accept()方法中查看新文件。