Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java7NIO读写文件_Java_File Io_Gson_Java 7_Nio - Fatal编程技术网

使用Java7NIO读写文件

使用Java7NIO读写文件,java,file-io,gson,java-7,nio,Java,File Io,Gson,Java 7,Nio,我的文件由数组中的json元素组成。 (几个文件。每个文件都有json元素数组) 我有一个流程,知道将每个json元素作为文件中的一行进行处理 因此,我创建了一个小程序,读取JSON数组,然后将元素写入另一个文件。 此实用程序的输出将是另一个进程的输入 我使用了Java7NIO(和gson) 我尝试尽可能多地使用Java7NIO。 我能做些什么改进吗? 过滤器呢?哪种方法更好 谢谢 public class TransformJsonsUsers { public TransformJsons

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

我有一个流程,知道将每个json元素作为文件中的一行进行处理

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

我使用了Java7NIO(和gson)

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

谢谢

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

        }
    });
}
公共类TransformJsonsUsers{
公共转换JSONSUSERS(){
}
公共静态void main(字符串[]args)引发IOException{
最终Gson Gson=新Gson();
Path Path=Path.get(“C:\\work\\data\\resources\\files”);
最终路径outputDirectory=路径
.get(“C:\\work\\data\\resources\\files\\output”);
DirectoryStream.Filter Filter=新的DirectoryStream.Filter(){
@凌驾
公共布尔接受(路径项)引发IOException{
//哪个更好?
//BasicFileAttributeView attView=Files.getFileAttributeView(条目,BasicFileAttributeView.class);
//返回attView.readAttributes().isRegularFile();
return!Files.isDirectory(条目);
}
};
DirectoryStream DirectoryStream=Files.newDirectoryStream(路径,过滤器);
forEach(新使用者(){
@凌驾
公共void接受(路径filePath){
字符串fileOutput=outputDirectory.toString()+File.separator+filePath.getFileName();
Path fileOutputPath=Path.get(fileOutput);
试一试{
BufferedReader br=Files.newBufferedReader(文件路径);
User[]users=gson.fromJson(br,User[].class);
BufferedWriter writer=Files.newBufferedWriter(fileOutputPath,Charset.defaultCharset());
for(用户:用户){
append(gson.toJson(user));
writer.newLine();
}
writer.flush();
}捕获(IOE异常){
抛出新的运行时异常(filePath.toString(),e);
}
}
});
}

}

如果要读取目录中的所有文件,则没有必要使用筛选器。筛选器主要用于应用某些筛选条件并读取文件的子集。两者在整体性能上可能没有任何实际差异

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

多线程

根据目录中存在的文件数量和CPU的功能,您可以应用多线程一次处理多个文件

排队

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


您还可以结合使用这两种方法来进一步提高性能

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

谢谢。因此,我使用带有glob:DirectoryStream DirectoryStream=Files.newDirectoryStream(路径“*.json”);原因是我只想检查这个目录(不是深度扫描)和json文件。I/O指的是如下操作:Files.isDirectory(entry)?谢谢请参阅我的评论以获取EJP答案。有没有一种特殊的方法可以将多线程应用于扫描过程,或者我需要创建自己的多线程?您可以使用文件系统监视程序使其成为事件驱动的。监视键是线程安全的,可以与java.nio.concurrent包一起使用。好主意。但这真的比我需要的多得多。请看