精华内容
下载资源
问答
  • 主要为大家详细介绍了java多线程读取多个文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 多线程读取多个文件package thread;import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.util.concurrent.CountDownLatch;public class ReadMultiFilesByThread { /** ...

    多线程读取多个文件

    package thread;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.util.concurrent.CountDownLatch;
    
    public class ReadMultiFilesByThread {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            long startTime = System.currentTimeMillis();
    
            final int thNum = 4;
            final String filePath3 = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词3.txt"; //266M
            final String filePath2 = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词2.txt"; //186M
            final String filePath = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词.txt"; //39KB
            final String filePath4 = "C:\\Users\\IBM_ADMIN\\Downloads\\carootcert(1).der"; //1KB
    
            CountDownLatch doneSignal = new CountDownLatch(thNum);
            ReadFileThread2 r1 = new ReadFileThread2(doneSignal,filePath);
            ReadFileThread2 r2 = new ReadFileThread2(doneSignal,filePath2);
            ReadFileThread2 r3 = new ReadFileThread2(doneSignal,filePath3);
            ReadFileThread2 r4 = new ReadFileThread2(doneSignal,filePath4);
            r1.start();
            r2.start();
            r3.start();
            r4.start();
            try {
                doneSignal.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            long endTime = System.currentTimeMillis();
            System.out.println("===============================");
            System.out.println("The totally executed time: "+(endTime-startTime));
        }
    
    }
    
    class ReadFileThread2 extends Thread{
        private RandomAccessFile raf;
        private CountDownLatch doneSignal;
        private final int bufLen = 256;
        private String path;
    
        public ReadFileThread2(CountDownLatch doneSignal,String path){
            this.doneSignal = doneSignal;
            this.path = path;
        }
    
    
        @Override
        public void run() {
            long start = System.currentTimeMillis();
            try {
                raf = new RandomAccessFile(path,"rw");
                raf.seek(0);
                long contentLen = new File(path).length();
                long times = contentLen / bufLen +1;
                byte []buff = new byte[bufLen];
                int hasRead = 0;
                String result = null;
                for(int i=0;i<times;i++){
                    hasRead = raf.read(buff);
                    if(hasRead < 0){
                        break;
                    }
                    result = new String(buff,"gb2312");
                }
                doneSignal.countDown();
            } catch (IOException e) {
                e.printStackTrace();
            }
            long end = System.currentTimeMillis();
            System.out.println(getName() + " " + path +" total Time: " + (end - start));
        }
    }
    

    程序部分说明:
    分别创建4个线程,读取四个不同大小的文件。
    分别计算读取每个文件的时间,然后得到读取4个文件的总时间。

    java.util.concurrent.CountDownLatch 
    一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
    
    await()使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
    
    countDown()递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
    
    线程执行完读取文件的操作,然后锁存器减一,当4个线程都执行读取文件的操作后,锁存器计数为0,执行await方法后,输出总的读取时间。
    加入CountDownLatch 是为了让子线程分别读取完文件后,主线程才能把总的读取时间输出。否则会造成主线程一早就计算时间。
    

    运行结果:

    Thread-8 C:\Users\IBM_ADMIN\Downloads\carootcert(1).der total Time: 8
    Thread-5 C:\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词.txt total Time: 28
    Thread-6 C:\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词2.txt total Time: 4051
    Thread-7 C:\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词3.txt total Time: 5190
    ===============================
    The totally executed time: 5194

    从结果可以看出,总的运行时间接近那个读取最大文件所用的时间。

    ===================================

    不用线程读取多个文件

    package thread;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    
    public class ReadMultiFilesWithoutThread {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            long startTime = System.currentTimeMillis();
    
            ReadMultiFilesWithoutThread read = new ReadMultiFilesWithoutThread();
    
            final String filePath3 = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词3.txt"; //266M
            final String filePath2 = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词2.txt"; //186M
            final String filePath = "C:\\Users\\IBM_ADMIN\\Downloads\\马达加斯加3全篇英文台词.txt"; //39KB
            final String filePath4 = "C:\\Users\\IBM_ADMIN\\Downloads\\carootcert(1).der"; //1KB
    
            read.readFile(filePath);
            read.readFile(filePath2);
            read.readFile(filePath3);
            read.readFile(filePath4);
    
            long endTime = System.currentTimeMillis();
            System.out.println("===============================");
            System.out.println("The totally executed time: "+(endTime-startTime));
        }
    
        public void readFile(String path){
            long start = System.currentTimeMillis();
            int bufLen = 256;
            try {
                RandomAccessFile raf = new RandomAccessFile(path,"rw");
                raf.seek(0);
                long contentLen = new File(path).length();
                long times = contentLen / bufLen +1;
                byte []buff = new byte[bufLen];
                int hasRead = 0;
                String result = null;
                for(int i=0;i<times;i++){
                    hasRead = raf.read(buff);
                    if(hasRead < 0){
                        break;
                    }
                    result = new String(buff,"gb2312");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            long end = System.currentTimeMillis();
            System.out.println( path +" total Time: " + (end - start));
        }
    }
    
    

    程序部分说明:
    分别读取4个大小不同的文件,计算读取每个文件所需的时间。
    计算总共的时间。

    运行结果:

    :\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词.txt total Time: 17
    C:\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词2.txt total Time: 2983
    C:\Users\IBM_ADMIN\Downloads\马达加斯加3全篇英文台词3.txt total Time: 3794
    C:\Users\IBM_ADMIN\Downloads\carootcert(1).der total Time: 1
    ===============================
    The totally executed time: 6795
    

    从结果可以看出,总的运行时间接近所有读取所有文件的时间总和。

    展开全文
  • java 多线程读取多个文件

    千次阅读 2019-01-02 10:49:34
    package ... import java.io.*; import java.util.List; import java.util.concurrent.CountDownLatch; ... * 多线程读取多个文件 */ public class FileThread extends Thread{ p...

    工具类代码如下:

    import java.io.*;
    import java.util.List;
    import java.util.concurrent.CountDownLatch;
    
    /**
     * 多线程读取多个文件
     */
    public class FileThread extends Thread{
    
        private final CountDownLatch countDownLatch = new CountDownLatch(10);
        private int fileIndex;
        private List<String> filelist;
        private String filepath = "D:\\LocalFtpServer\\data20181229\\";
        private String movepath = "D:\\LocalFtpServer\\data20181229_01\\";
    
        public int getFileIndex() {
            return fileIndex;
        }
    
        public void setFileIndex(int fileIndex) {
            this.fileIndex = fileIndex;
        }
    
        public List<String> getFilelist() {
            return filelist;
        }
    
        public void setFilelist(List<String> filelist) {
            this.filelist = filelist;
        }
    
        @Override
        public void run() {
    
            for (int i = 0; i < filelist.size(); i++) {
                if (i % 10 == fileIndex) {
                    //读取文件
                    File readfile = new File(filepath + filelist.get(i));
                    InputStreamReader isr = null;
                    try {
                        isr = new InputStreamReader(new FileInputStream(readfile), "UTF-8");
                        BufferedReader reader = new BufferedReader(isr);
                        String line = null;
                        // 一次读入一行,直到读入null为文件结束
                        while ((line = reader.readLine()) != null) {
                            System.out.println(line );
                        }
                        reader.close();
                        isr.close();
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    //读取完后, 移动文件位置
                    readfile.renameTo(new File(movepath + readfile.getName()));
                }
            }
            countDownLatch.countDown();
        }
    }
    
    

    调用测试:

     public static void main(String[] args) throws IOException {
    			String filepath = "D:\\LocalFtpServer\\data20181229\\";
    			File file = new File(filepath);
    			//读取目录下所有文件
    			String[] filelist = file.list();
    			List<String> fList=new ArrayList<String>();
    
    			for (int i = 0; i < filelist.length; i++) {
    				if (filelist[i].startsWith("data") && filelist[i].endsWith(".txt")) {
    					fList.add(filelist[i]);
    				}
    			}
    			for(int i=0;i<30;i++){
    				FileThread fileThread=new FileThread();
    				fileThread.setFileIndex(i);
    				fileThread.setFilelist(fList);
    				fileThread.start();
    			}
    			countDownLatch.await();
    }
    
    展开全文
  • 本文实例为大家分享了java多线程读取多个文件的具体代码,供大家参考,具体内容如下工具类代码如下:import java.io.*;import java.util.List;import java.util.concurrent.CountDownLatch;/*** 多线程读取多个文件*...

    本文实例为大家分享了java多线程读取多个文件的具体代码,供大家参考,具体内容如下

    工具类代码如下:

    import java.io.*;

    import java.util.List;

    import java.util.concurrent.CountDownLatch;

    /**

    * 多线程读取多个文件

    */

    public class FileThread extends Thread{

    private final CountDownLatch countDownLatch = new CountDownLatch(10);

    private int fileIndex;

    private List filelist;

    private String filepath = "D:\\LocalFtpServer\\data20181229\\";

    private String movepath = "D:\\LocalFtpServer\\data20181229_01\\";

    public int getFileIndex() {

    return fileIndex;

    }

    public void setFileIndex(int fileIndex) {

    this.fileIndex = fileIndex;

    }

    public List getFilelist() {

    return filelist;

    }

    public void setFilelist(List filelist) {

    this.filelist = filelist;

    }

    @Override

    public void run() {

    for (int i = 0; i < filelist.size(); i++) {

    if (i % 10 == fileIndex) {

    //读取文件

    File readfile = new File(filepath + filelist.get(i));

    InputStreamReader isr = null;

    try {

    isr = new InputStreamReader(new FileInputStream(readfile), "UTF-8");

    BufferedReader reader = new BufferedReader(isr);

    String line = null;

    // 一次读入一行,直到读入null为文件结束

    while ((line = reader.readLine()) != null) {

    System.out.println(line );

    }

    reader.close();

    isr.close();

    } catch (UnsupportedEncodingException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    //读取完后, 移动文件位置

    readfile.renameTo(new File(movepath + readfile.getName()));

    }

    }

    countDownLatch.countDown();

    }

    }

    调用测试:

    public static void main(String[] args) throws IOException {

    String filepath = "D:\\LocalFtpServer\\data20181229\\";

    File file = new File(filepath);

    //读取目录下所有文件

    String[] filelist = file.list();

    List fList=new ArrayList();

    for (int i = 0; i < filelist.length; i++) {

    if (filelist[i].startsWith("data") && filelist[i].endsWith(".txt")) {

    fList.add(filelist[i]);

    }

    }

    for(int i=0;i<30;i++){

    FileThread fileThread=new FileThread();

    fileThread.setFileIndex(i);

    fileThread.setFilelist(fList);

    fileThread.start();

    }

    countDownLatch.await();

    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 本文实例为大家分享了java多线程读取多个文件的具体代码,供大家参考,具体内容如下工具类代码如下:import java.io.*;import java.util.List;import java.util.concurrent.CountDownLatch;/*** 多线程读取多个文件*...

    本文实例为大家分享了java多线程读取多个文件的具体代码,供大家参考,具体内容如下

    工具类代码如下:

    import java.io.*;

    import java.util.List;

    import java.util.concurrent.CountDownLatch;

    /**

    * 多线程读取多个文件

    */

    public class FileThread extends Thread{

    private final CountDownLatch countDownLatch = new CountDownLatch(10);

    private int fileIndex;

    private List filelist;

    private String filepath = "D:\\LocalFtpServer\\data20181229\\";

    private String movepath = "D:\\LocalFtpServer\\data20181229_01\\";

    public int getFileIndex() {

    return fileIndex;

    }

    public void setFileIndex(int fileIndex) {

    this.fileIndex = fileIndex;

    }

    public List getFilelist() {

    return filelist;

    }

    public void setFilelist(List filelist) {

    this.filelist = filelist;

    }

    @Override

    public void run() {

    for (int i = 0; i < filelist.size(); i++) {

    if (i % 10 == fileIndex) {

    //读取文件

    File readfile = new File(filepath + filelist.get(i));

    InputStreamReader isr = null;

    try {

    isr = new InputStreamReader(new FileInputStream(readfile), "UTF-8");

    BufferedReader reader = new BufferedReader(isr);

    String line = null;

    // 一次读入一行,直到读入null为文件结束

    while ((line = reader.readLine()) != null) {

    System.out.println(line );

    }

    reader.close();

    isr.close();

    } catch (UnsupportedEncodingException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    //读取完后, 移动文件位置

    readfile.renameTo(new File(movepath + readfile.getName()));

    }

    }

    countDownLatch.countDown();

    }

    }

    调用测试:

    public static void main(String[] args) throws IOException {

    String filepath = "D:\\LocalFtpServer\\data20181229\\";

    File file = new File(filepath);

    //读取目录下所有文件

    String[] filelist = file.list();

    List fList=new ArrayList();

    for (int i = 0; i < filelist.length; i++) {

    if (filelist[i].startsWith("data") && filelist[i].endsWith(".txt")) {

    fList.add(filelist[i]);

    }

    }

    for(int i=0;i<30;i++){

    FileThread fileThread=new FileThread();

    fileThread.setFileIndex(i);

    fileThread.setFilelist(fList);

    fileThread.start();

    }

    countDownLatch.await();

    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • java多线程读取多个文件 导入数据库

    千次阅读 2016-10-14 16:59:21
    多个线程文件和单个线程文件,效率差不多,甚至可能不如单线程,原因如下:如果只是单纯的读文件,一个线程足够了,因为一般瓶颈是在磁盘io上,多个线程只会在磁盘io上阻塞。因为不同文件的读写,会造成磁头的...
  • 多线程读取多个文件(1)(例子)

    千次阅读 2013-03-12 09:27:26
    是我写的三类,用于多线程操作读取文件内容和写入文件内容,不知道是不是你合你味口。 packagepro; import java.io.*; public class ReadFileToWriteOtherFile {  private File oldFile;  ...
  • 今天遇到一个问题,需要多个...首先我们写个文件,然后多线程读取,以下是我实验的代码:package com.alibaba.middleware.race;import java.io.IOException; import java.io.RandomAccessFile;public class Test2 { pub
  • 但线程中readlines()就已经全部读完文件了,多线程共同调用同一个文件对象的io方法会造成偏移量错误的问题,你需要锁。(python3 有 os.pread 函数,这个是原子操作,可以不用锁)。这个问题使用线程的效率价值在...
  • 但线程中readlines()就已经全部读完文件了,多线程共同调用同一个文件对象的io方法会造成偏移量错误的问题,你需要锁。(python3 有 os.pread 函数,这个是原子操作,可以不用锁)。这个问题使用线程的效率价值在...
  • python多线程读取同一个文件

    万次阅读 2015-05-13 21:36:05
    python多线程读取同一个文件 多线程读取同一个文件,要求不能重复,不能遗漏。 最开始尝试了一种方法(后来实践证明是无效的) 主线程分配给每个读线程需要读取文件中哪些行, 比如线程1读取1-10行,线程2...
  • 本文提供java多线程分别定时读写同一个文件的样例,其中两个线程,一个每分钟写入当前时间到指定文件,另一个线程读出每分钟新写的内容。使用简单的Thread.sleep技术实现定时package test.thread;import java.io....
  • 不同的线程读取多个配置文件,输出多个文件
  • 今天写完一个多线程读取文件,发现多线程反而比但线程慢多了;最后还是改成了多进程版本。多线程向多进程的转换也非常的方便,为什么Python多线程反而更慢了?原因就在于 GIL ,在 Cpython 解释器(Python语言的主流...
  • 昨天下午朋友跟我聊起,他说有需求,需要把上G的txt文件读取写入到数据库。用普通的io结果自然是OOM了,所以果断用NIO技术。为了提高速度,自然还得用上多线程技术。接下来就介绍一下实现思路以及相关的知识点。...
  • Java多线程读取文件

    2020-12-22 21:24:55
    前言  是五一假期第,按理应该是快乐玩耍的日子,...  为了充分利用多线程读取,需要把文件划分成多个区域,供每个线程读取。那么需要有一个算法来计算出每个线程读取的开始位置和结束位置。那么首先根据配置的线程
  • 单线程与多线程读取文件

    千次阅读 2017-09-06 15:05:35
    //实验多个线程读取多个文件和单个线程读取多个文件//当文件数量是2-3个时,单线程比多线程更快,可能是没有创建线程之类的开销//文件数量增加到10多个以后,多个线程稍微快一点,但是并没有快多少//按照网上的说法...
  • 在写之前先声明,本文是基于之前在博客园网站上检索到的一份JAVA多线程读写文件的示例,我在写自己的程序时是在那位...针对这样的大文件解析处理,解决方案是使用多个线程,分割读取指定的大文件。获取我们所需要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,206
精华内容 882
关键字:

多线程读取多个文件