美文网首页
Java并行读取多个文件

Java并行读取多个文件

作者: 0x70e8 | 来源:发表于2018-08-16 11:33 被阅读0次

测试打开目录下1000+文件,使用两种方式,返回处理的行数:

  • 使用JDK7 的forkjoin框架
  • 使用Java8 的并行流(内部基于forkjoin)

code

  • RecursiveTask实现类,Forkjoin框架的Task类型,是递归任务

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

public class ReadFileTask extends RecursiveTask<Integer> {

    private static final long serialVersionUID = 1L;
    private File[] files;
    private final static Integer THRESHOLD = 20;

    public ReadFileTask(File[] files) {
        this.files = files;
    }

    @Override
    protected Integer compute() {
        int all = 0;
        int size = files.length;
        // 采用二叉树思想来拆分子任务
        if (size > THRESHOLD) {
            int mid = size / 2;
            ForkJoinTask<Integer> left = new ReadFileTask(Arrays.copyOfRange(files, 0, mid)).fork();
            ForkJoinTask<Integer> right = new ReadFileTask(Arrays.copyOfRange(files, mid, size)).fork();
            // 等待子任务的结束以统计数据
            left.join();
            right.join();
            try {
                all = left.get() + right.get();
            } catch (InterruptedException | ExecutionException e1) {
                e1.printStackTrace();
            }
        } else {
            // 任务详细逻辑
            for (File f : files) {
                try (BufferedReader reader = Files.newBufferedReader(f.toPath())) {
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        // processLine(line);
                        all++;
                    }
                } catch (IOException e) {
                }
            }
        }
        return all;
    }

// getter setter

}
  • Client 包含并行流方法
public class Client {
    public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
        Path path = Paths.get("C:\\Users\\Desktop\\all\\");
        useForkJoinPool(path);
        useParallelStream(path);
    }

    static void useForkJoinPool(Path path) throws InterruptedException, ExecutionException {
        long begin = System.currentTimeMillis();

        if (Files.exists(path) && Files.isDirectory(path)) {
            File[] list = path.toFile().listFiles();
            System.out.println(list.length);
            ReadFileTask task = new ReadFileTask(list);
            // 未指定pool内线程数,使用CPU core的数目
            ForkJoinPool fjp = new ForkJoinPool();
            ForkJoinTask<Integer> future = fjp.submit(task);
            System.out.println(future.get());
        }

        System.out.println("used:" + (System.currentTimeMillis() - begin) + "mills");
    }
    // java8 并行流 
    static void useParallelStream(Path path) throws IOException {
        long begin = System.currentTimeMillis();
        if (Files.exists(path) && Files.isDirectory(path)) {
            int[] count = { 0, 0 };
            @SuppressWarnings("resource")
            Stream<Path> files = Files.list(path);
            files.parallel().forEach(p -> {
                count[0]++;
                try (BufferedReader reader = Files.newBufferedReader(p)) {
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        count[1]++;
                        // processLine(line);
                    }
                } catch (IOException e) {

                }
            });
            System.out.println("files count:" + count[0]);
            System.out.println("line count:" + count[1]);
        }
        System.out.println("used:" + (System.currentTimeMillis() - begin) + "mills");
    }
}
  • 结果
// 结果
// 1053
// 6320
// used:203mills
// files count:1053
// line count:6320
// used:234mills

相关文章

  • Java并行读取多个文件

    测试打开目录下1000+文件,使用两种方式,返回处理的行数: 使用JDK7 的forkjoin框架 使用Java8...

  • java读取properties文件总结

    一、java读取properties文件 1.1 java读取properties文件代码测试

  • 将多个文件打包成ZIP压缩包输出

    工具类一(将多个远端文件读取并压缩) import java.io.BufferedInputStream; im...

  • 多个文件读取

    Combining Multiple Files Using the ‘cat’ Method from netC...

  • Java Web技术经验总结(十六)

    使用Java读取文件时,要评估文件的大小,避免因为文件过大而造成OOM,参见:Java高效读取文件 RateLim...

  • java IO 读取数据

    java IO 读取数据 提供集中读取数据的方法 java7 读取文件的API

  • Java读取文件方法汇总

    这篇文章主要为大家详细介绍了Java读取文件方法,按字节读取文件内容、按字符读取文件内容、随机读取文件内容等,具有...

  • Java读取文件方法汇总

    这篇文章主要为大家详细介绍了Java读取文件方法,按字节读取文件内容、按字符读取文件内容、随机读取文件内容等,具有...

  • java读取大文件解决思路

    1. java 读取大文件的困难 java 读取文件的一般操作是将文件数据全部读取到内存中,然后再对数据进行操作。...

  • java面试题(三)

    Java 多线程模块 1、并行和并发有什么区别? 并行:多个处理器或多核处理器同时处理多个任务。 并发:多个任务在...

网友评论

      本文标题:Java并行读取多个文件

      本文链接:https://www.haomeiwen.com/subject/ucmnbftx.html