首页 > 其他分享 >文件分片读取工具类

文件分片读取工具类

时间:2022-09-18 19:58:16浏览次数:63  
标签:文件 读取 jsonObject putOpt private str 分片 new public

package com.xxj;

import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;

/**
 * ClassName:BigFileReader
 * Package:com.xxj
 * Description:描述信息
 *
 * @Date:2022/9/18 12:49
 * @author:alpha_Joker
 */
public class BigFileReader {
    private int threadSize;
    private String charset;
    private int bufferSize;
    private IHandle handle;
    private ExecutorService executorService;
    private long fileLength;
    private RandomAccessFile randomAccessFile;
    private Set<StartEndPair> startEndPairs;
    private CyclicBarrier cyclicBarrier;

    private AtomicLong counter = new AtomicLong(0);

    private BigFileReader(File file, IHandle handle, String charset, int bufferSize, int threadSize) {
        this.fileLength = file.length();
        this.handle = handle;
        this.charset = charset;
        this.bufferSize = bufferSize;
        this.threadSize = threadSize;
        try {
            this.randomAccessFile = new RandomAccessFile(file, "r");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        this.executorService = Executors.newFixedThreadPool(threadSize);
        startEndPairs = new HashSet<BigFileReader.StartEndPair>();
    }

    private void calculateStartEnd(long start, long size) throws IOException {
        if (start > fileLength - 1) {
            return;
        }
        StartEndPair pair = new StartEndPair();
        pair.start = start;
        long endPosition = start + size - 1;
        if (endPosition >= fileLength - 1) {
            pair.end = fileLength - 1;
            startEndPairs.add(pair);
            return;
        }
        randomAccessFile.seek(endPosition);
        byte tmp = (byte) randomAccessFile.read();
        while (tmp != '\n' && tmp != '\r') {
            endPosition++;
            if (endPosition >= fileLength - 1) {
                endPosition = fileLength - 1;
                break;
            }
            randomAccessFile.seek(endPosition);
            tmp = (byte) randomAccessFile.read();
        }
        pair.end = endPosition;
        startEndPairs.add(pair);

        calculateStartEnd(endPosition + 1, size);
    }

    public void shutdown() {
        try {
            this.randomAccessFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.executorService.shutdown();
    }

    private void handle(byte[] bytes) throws UnsupportedEncodingException {
        String line = null;
        if (this.charset == null) {
            line = new String(bytes);
        } else {
            line = new String(bytes, charset);
        }
        if (line != null && !"".equals(line)) {
            this.handle.handle(line);
            counter.incrementAndGet();
        }
    }

    //切片
    private static class StartEndPair {
        public long start;
        public long end;

        @Override
        public String toString() {
            return "star=" + start + "end=" + end;

        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + (int) (end ^ (end >>> 32));
            result = prime * result + (int) (start ^ (start >>> 32));
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            StartEndPair other = (StartEndPair) obj;
            if (end != other.end)
                return false;
            if (start != other.start)
                return false;
            return true;
        }
    }

    //读取
    private class SliceReaderTask implements Runnable {
        private long start;
        private long sliceSize;
        private byte[] readBuff;

        public SliceReaderTask(StartEndPair pair) {
            this.start = pair.start;
            this.sliceSize = pair.end - pair.start + 1;
            this.readBuff = new byte[bufferSize];
        }

        @Override
        public void run() {
            try {
                MappedByteBuffer mapBuffer = randomAccessFile.getChannel().map(FileChannel.MapMode.READ_ONLY, start, this.sliceSize);
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                for (int offset = 0; offset < sliceSize; offset += bufferSize) {
                    int readLength;
                    if (offset + bufferSize <= sliceSize) {
                        readLength = bufferSize;
                    } else {
                        readLength = (int) (sliceSize);
                    }
                    mapBuffer.get(readBuff, 0, readLength);
                    for (int i = 0; i < readLength; i++) {
                        byte tmp = readBuff[i];
                        if (tmp == '\n' || tmp == '\r') {
                            handle(bos.toByteArray());
                            bos.reset();
                        } else {
                            bos.write(tmp);
                        }
                    }
                }
                if (bos.size() > 0) {
                    handle(bos.toByteArray());
                }
                cyclicBarrier.await();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static class Builder {
        private int threadSize = 1;
        private String charset = null;
        private int bufferSize = 1024 * 1024;
        private IHandle handle;
        private File file;

        public Builder(String file, IHandle handle) {
            this.file = new File(file);
            if (!this.file.exists())
                throw new IllegalArgumentException("文件不存在");
            this.handle = handle;
        }

        public Builder withTreadSize(int size) {
            this.threadSize = size;
            return this;
        }

        public Builder withCharset(String charset) {
            this.charset = charset;
            return this;
        }

        public Builder withBufferSize(int bufferSize) {
            this.bufferSize = bufferSize;
            return this;
        }

        public BigFileReader build() {
            return new BigFileReader(this.file, this.handle, this.charset, this.bufferSize, this.threadSize);
        }
    }

    public void start() {
        long everySize = this.fileLength / this.threadSize;
        try {
            calculateStartEnd(0, everySize);

        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
        final long startTime = System.currentTimeMillis();
        cyclicBarrier = new CyclicBarrier(startEndPairs.size(), new Runnable() {
            @Override
            public void run() {
                long time = System.currentTimeMillis() - startTime;
                System.out.println("time:"+time);
                System.out.println("line:"+counter.get());
            }
        });
        for (StartEndPair pair : startEndPairs) {
            System.out.println(pair);
            this.executorService.execute(new SliceReaderTask(pair));
        }
    }


}

  

package com.xxj;

/**
 * ClassName:IHandle
 * Package:com.xxj
 * Description:描述信息
 *
 * @Date:2022/9/18 12:48
 * @author:alpha_Joker
 */
public interface IHandle {
    void handle(String line);
}

  

package com.xxj;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * ClassName:Test
 * Package:com.xxj
 * Description:描述信息
 *
 * @Date:2022/9/18 15:11
 * @author:alpha_Joker
 */
public class Test {
    public static void main(String[] args) {
//        fre
        BigFileReader.Builder builder =new BigFileReader.Builder("C:\\Users\\Administrator\\Desktop\\fre.txt", new IHandle() {
            @Override
            public void handle(String line) {
//                System.out.println(line);
                JSONObject jsonObject = new JSONObject();
                String [] str = line.split("\\s+");
                String[] _str = reverseArray(str);
//                System.out.println("数据:"+Arrays.toString(_str));
                if (str.length ==1 && str[0].length() == 14) {
                    jsonObject.putOpt("time", str[0]);
                    System.out.println(jsonObject.toJSONString(0));
                }
                if (_str.length == 11) {
//                    jsonObject.putOpt("Iteam", str[0]);
                    jsonObject.putOpt("Dtail", str[1]+" "+str[2]+" "+str[3]+" "+str[4]);
                    jsonObject.putOpt("F", _str[5]);
                    jsonObject.putOpt("max", _str[4]);
                    jsonObject.putOpt("mem", _str[3]);
                    jsonObject.putOpt("nem", _str[2]);
                    jsonObject.putOpt("csf", _str[1]);
                    jsonObject.putOpt("asd", _str[0]);
                    System.out.println(jsonObject.toJSONString(0));
                }
                if (_str.length == 10 || _str.length == 9) {
//                    jsonObject.putOpt("Iteam", str[0]);
                    if (_str.length == 10)
                        jsonObject.putOpt("Dtail", str[1]+" "+str[2]+" "+str[3]);
                    if (_str.length == 9)
                        jsonObject.putOpt("Dtail", str[1]+" "+str[2]);
                    jsonObject.putOpt("F", _str[5]);
                    jsonObject.putOpt("max", _str[4]);
                    jsonObject.putOpt("mem", _str[3]);
                    jsonObject.putOpt("nem", _str[2]);
                    jsonObject.putOpt("csf", _str[1]);
                    jsonObject.putOpt("asd", _str[0]);
                    System.out.println(jsonObject.toJSONString(0));
                }


//                System.out.println(str.length+"--"+line.startsWith(" "));
            }

        });
        //            builder.withThreadSize(10).withCharset("gbk").withBufferSize("1024*1024");
        builder.withTreadSize(1).withCharset("utf-8").withBufferSize(1024*1024);

        BigFileReader bigFileReader = builder.build();

        bigFileReader.start();

    }

    /**
     * 使用Collections.reverse来倒置数组
     *
     * @param strArray 原来的字符串数组
     * @return
     */
    public static String[] reverseArray(String[] strArray) {
        //定一个新的数组
        String[] newArray = new String[strArray.length];
        List<String> list = new ArrayList<>();
        Collections.addAll(list, strArray);
        Collections.reverse(list);

        list.toArray(newArray);
        return newArray;
    }

}

  

标签:文件,读取,jsonObject,putOpt,private,str,分片,new,public
From: https://www.cnblogs.com/joyny/p/16705567.html

相关文章

  • 解决文件夹里右键“创建文本文件”选项消失的问题
    新建一个文本输入以下内容WindowsRegistryEditorVersion5.00[HKEY_CLASSES_ROOT\.txt]@="txtfile""ContentType"="text/plain"[HKEY_CLASSES_ROOT\.txt\Shel......
  • 【JVM】一、从class文件开始
    一、从class文件开始1、手撕字节码文件一个简单的Java源文件packagejvmClass;publicclassjvmClass{ privateStringname; publicStringgetName(){ retu......
  • xampp相关配置文件所在路径
    环境:Xampp3.2.4一般来讲,可以在xampp的控制面板打开先关的配置文件,但是出现有些问题的时候,还是需要到别的路径下找到相关配置文件修改才行。Xampp的配置文件propertie......
  • .mat文件批量转存为.json文件的方法
    记录下.mat文件批量转存为.json文件的方法matlab本身是没有json解析包的,因此需要加载一个jsonlab工具包,可以用git命令下载gitclonehttps://github.com/fangq/jsonlab.g......
  • testbench (verilog)读取文件的细节问题
    为什么要用?在使用数字图像IC设计中,往往需要测试所设计的图像处理模块的功能,此时模块的输入端数据时序要求比较复杂,因此需要通过testbench按照一定的时序关系读取外部的文......
  • 创建一个很棒的 GitHub 个人资料自述文件!!
    创建一个很棒的GitHub个人资料自述文件!!啊,自述文件——当你开始一个新的GitHub存储库或项目时生成的那些Markdown文件。也许你给你的项目一些描述,或者你是一个偶尔更......
  • 使用 CSS 的 Glassmorphic 配置文件卡
    使用CSS的Glassmorphic配置文件卡在这篇博客中,我们使用css创建了一个glassmorphic配置文件卡。获取完整的源代码编码扭矩.com版权声明:本文为博主原创文章,遵循......
  • 文件操作
    程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放通过文件可以将数据持久化C++中对文件操作需要包含头文件==<fstream>==文件类型分为两种:文本文件......
  • 操作系统学习笔记13 | 目录与文件系统
    本文完成磁盘管理4层抽象中的最后一层抽象:目录与文件系统。达成的效果是整个磁盘抽象为我们日常所熟悉的目录树,这个树应当能够适配不同的操作系统(是一个独立子系统),通过目......
  • 1-STM32+Air724UG远程升级篇OTA(自建物联网平台)-STM32通过Air724UG使用http或https下
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/myota.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>......