首页 > 编程语言 >java多线程转换文件格式

java多线程转换文件格式

时间:2024-09-10 14:53:05浏览次数:12  
标签:java String sourceCharset targetCharset 文件格式 private new 多线程 inputFile


private static final int THREAD_COUNT = 4; // 线程数
    private static final int BUFFER_SIZE = 1024; // 缓冲区大小

    /**
     * 多线程读取文件,转换文件编码格式 4线程 1Mb缓存
     *
     * @param inputFile     输入文件 String input = "E:/02code/web/test.txt";
     * @param sourceCharset 源文件编码 String output = "E:/02code/web/tes1t.txt";
     * @param outputFile    输出文件 String sourceCharset = "GBK";
     * @param targetCharset 目标文件编码 String targetCharset = "UTF-8";
     */
    private static void conversionFileEncodingFormat(File inputFile, String sourceCharset, File outputFile, String targetCharset) throws InterruptedException, IOException, ExecutionException {
        long fileSize = inputFile.length();
        long chunkSize = fileSize / THREAD_COUNT;

        ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
        List<Future<File>> futures = new ArrayList<>();

        for (int i = 0; i < THREAD_COUNT; i++) {
            long start = i * chunkSize;
            long end = (i == THREAD_COUNT - 1) ? fileSize : (start + chunkSize);
            futures.add(executor.submit(new FileReadTask(inputFile, start, end, i, sourceCharset, targetCharset)));
        }

        executor.shutdown();
        executor.awaitTermination(1, TimeUnit.HOURS);

        try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outputFile))) {
            for (Future<File> future : futures) {
                File tempFile = future.get();
                try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(tempFile))) {
                    byte[] buffer = new byte[BUFFER_SIZE];
                    int bytesRead;
                    while ((bytesRead = bis.read(buffer)) != -1) {
                        bos.write(buffer, 0, bytesRead);
                    }
                }
                tempFile.delete(); // 删除临时文件
            }
        }
    }

    static class FileReadTask implements Callable<File> {
        private final File inputFile;
        private final long start;
        private final long end;
        private final int index;
        /**
         * 源文件编码
         */
        private final String sourceCharset;
        /**
         * 目标文件编码
         */
        private final String targetCharset;

        public FileReadTask(File inputFile, long start, long end, int index, String sourceCharset, String targetCharset) {
            this.inputFile = inputFile;
            this.start = start;
            this.end = end;
            this.index = index;
            this.sourceCharset = sourceCharset;
            this.targetCharset = targetCharset;
        }

        @Override
        public File call() throws Exception {
            File tempFile = new File("temp_" + index + ".txt");
            try (RandomAccessFile raf = new RandomAccessFile(inputFile, "r");
                 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(tempFile), targetCharset))) {

                raf.seek(start);
                byte[] buffer = new byte[BUFFER_SIZE];
                long bytesToRead = end - start;
                while (bytesToRead > 0) {
                    int bytesRead = raf.read(buffer, 0, (int) Math.min(buffer.length, bytesToRead));
                    if (bytesRead == -1) break;
                    String chunk = new String(buffer, 0, bytesRead, sourceCharset); // 假设原文件编码为 ISO_8859_1
                    writer.write(chunk);
                    bytesToRead -= bytesRead;
                }
            }
            return tempFile;
        }
    }

标签:java,String,sourceCharset,targetCharset,文件格式,private,new,多线程,inputFile
From: https://blog.51cto.com/u_11288266/11971646

相关文章

  • 常见的Java课程设计/毕业设计选题
    从网上整理收集了常见的java系统设计源码,可以用于课程作业或者毕业设计。技术栈:java/springboot/mysql/js/vue1.基于java的家政预约网站系统平台采用B/S结构,后端采用主流的Springboot框架进行开发,前端采用主流的Vue.js进行开发。整个平台包括前台和后台两个部分。前台功能包括:首页......
  • 最全Java面试八股文过过过
    1.Java创建对象得五种方式?(1)new关键字  (2)Class.newInstance (3)Constructor.newInstance(4)Clone方法  (5)反序列化2.想要线程安全的HashMap怎么办?(1)使用ConcurrentHashMap(2)使用HashTable(3)Collections.synchronizedHashMap()方法3.ConcurrentHashMap原如何保......
  • Java学习 - 多线程第二部分
    1.线程池1.1线程状态介绍当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢?Java中的线程状态被定义在了java.lang.Thread.State枚举类中,State枚举类的源码如下:publi......
  • Java学习 - 反射&动态代理
    马上就要把Java的基础部分更新完了,后面会更新一些别的内容,也会多学习一些别的东西提升一下自己。加油加油加油!1.反射1.1反射的概述:**专业的解释(了解一下):**是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意......
  • Java学习 - 网络编程
    1.网络编程入门1.1网络编程概述计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统网络编程在网络通信协议下,不同计算机上运行的程序......
  • java+vue计算机毕设车票订购系统【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和人们生活节奏的加快,传统的车票购买方式已难以满足日益增长的出行需求。传统的售票窗口排队购票不仅耗时耗力,还常常因信息不......
  • java+vue计算机毕设车票管理系统【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着交通网络的日益发达和人们出行需求的不断增长,车票管理系统在现代社会中扮演着至关重要的角色。传统的车票购买方式往往存在排队时间长、信息不透......
  • java+vue计算机毕设出版社高校教材样书管理【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的快速发展与课程体系的不断革新,高校教材作为知识传播的重要载体,其更新换代的速度日益加快。出版社作为教材的主要供给方,面临着如何高效......
  • java+vue计算机毕设宠物医院App【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快和人们对宠物情感依赖的增强,宠物已成为许多家庭不可或缺的一员。然而,传统的宠物医疗服务模式往往存在信息不对称、预约难、服......
  • JAVA开源项目 员工绩效考核系统 计算机毕业设计
    本文项目编号T021,文末自助获取源码\color{red}{T021,文末自助获取源码}......