博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 基础之图片的多线程处理和大文件的多线程拷贝
阅读量:5788 次
发布时间:2019-06-18

本文共 5529 字,大约阅读时间需要 18 分钟。

图片的多线程处理

public class PhotoHandle {    public static void main(String[] args) {        File file = new File("D:\\photo.bmp");        photoHandle(file, 4);//把文件分成4个线程来处理    }    public static void photoHandle(File file, int threadNumber) {        long length = file.length();        long unitLength = length/threadNumber;//把图片长度按线程数等分        for(int i=0; i

MyThread类

public class MyThread implements Runnable {    private String name;//线程名    private File file;//文件名    private long begin;//起始位置    private long end;//读取的结束位置    public MyThread(String name, File file, long begin, long end) {        this.name = name;        this.file = file;        this.begin = begin;        this.end = end;    }    @Override    public void run() {        RandomAccessFile raf = null;        try {            raf = new RandomAccessFile(file, "rw");            raf.seek(begin);// raf指针定位到最开始            while (begin <= end) {//还没到最后,则继续                int i = 255 - raf.read();                raf.seek(raf.getFilePointer() - 1);// 或raf.seek(begin)                raf.write(i);                begin++;            }            System.out.println(name + "拷贝完成!");        } catch (FileNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } finally {            IOUtils.closeRandomAccessFile(raf);        }    }}复制代码

多线程分段示意图如下

此图同样适用于下例的文件拷贝

(大)文件的的多线程拷贝

public class MultiThreadCopy{    public static void main(String[] args) {        File sourceFile = new File("E:\\javaIO\\myeclipse.exe");//源文件地址        File targetDir = new File("e:/javaFile");//目标文件地址        int threadNumber = 4;        copyFile(sourceFile, targetDir, threadNumber);    }    public static void copyFile(File sourceFile, File targetDir, int threadNumber) {        // TODO Auto-generated method stub        if(!targetDir.exists()){            targetDir.mkdirs();        }        File targetFile = new File(targetDir, sourceFile.getName());        long length = sourceFile.length();        long unitLength = length/threadNumber;        for(int i=0; i

MyThread类

public class MyThread extends Thread{    private String name;    private File sourceFile;    private File targetDir;    private long begin;    private long end;    public MyThread(String name, File sourceFile, File targetDir, long begin, long end) {        this.name = name;        this.sourceFile = sourceFile;        this.targetDir = targetDir;        this.begin = begin;        this.end = end;    }    @Override    public void run() {        //定义读写的文件访问流        RandomAccessFile rafRead = null;        RandomAccessFile rafWrite = null;        try {            rafRead = new RandomAccessFile(sourceFile, "r");            rafWrite = new RandomAccessFile(targetDir, "rw");            //设置文件指针的开始位置和文件长度            rafWrite.setLength(end);            rafRead.seek(begin);            rafWrite.seek(begin);            int buffSize = 1024*6;            byte[] buff = new byte[buffSize];            while((begin+buffSize)<=end){                //把数据读入到buff缓冲数组中                rafRead.read(buff);                //把buff缓冲数组的数据写入到目标文件                rafWrite.write(buff);                //起始位置再向前移                begin+=buffSize;            }            //begin+buffSize超出了每一段的结尾,最后那一撮另外读            long lastSize = end-begin;            rafRead.read(buff, 0, (int) lastSize);            rafWrite.write(buff, 0, (int) lastSize);            System.out.println(this.name+"拷贝完成!");        } catch (FileNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            IOUtils.closeRandomAccessFile(rafRead);            IOUtils.closeRandomAccessFile(rafWrite);        }    }}复制代码

IOUtils工具类

public class IOUtils {    public static void closeInputStream(InputStream is){//传入的是具体的子类        if (is != null){            try {                is.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            is = null;        }    }    public static void closeOutputStream(OutputStream os){        if (os != null){            try {                os.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            os = null;        }    }    public static void closeReader(Reader reader){        if (reader != null){            try {                reader.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            reader = null;        }    }    public static void closeWriter(Writer writer){        if (writer != null){            try {                writer.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            writer = null;        }    }    public static void closeRandomAccessFile(RandomAccessFile raf){        if (raf != null){            try {                raf.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            raf = null;        }    }}复制代码

转载于:https://juejin.im/post/5a45d64f6fb9a0450909d414

你可能感兴趣的文章
云南去年有望实现151万贫困人口净脱贫
查看>>
Java架构师面试题系列整理(大全)
查看>>
延伸产业链 中国产粮大省向“精深”问发展
查看>>
消费贷用户70%月收入低于5000元 80、90后是主要人群
查看>>
2018年内蒙古外贸首次突破1000亿元
查看>>
CTOR有助于BCH石墨烯技术更上一层楼
查看>>
被遗忘的CSS
查看>>
Webpack中的sourcemap以及如何在生产和开发环境中合理的设置sourcemap的类型
查看>>
做完小程序项目、老板给我加了6k薪资~
查看>>
java工程师linux命令,这篇文章就够了
查看>>
关于React生命周期的学习
查看>>
webpack雪碧图生成
查看>>
搭建智能合约开发环境Remix IDE及使用
查看>>
Spring Cloud构建微服务架构—服务消费基础
查看>>
RAC实践采坑指北
查看>>
runtime运行时 isa指针 SEL方法选择器 IMP函数指针 Method方法 runtime消息机制 runtime的使用...
查看>>
LeetCode36.有效的数独 JavaScript
查看>>
Scrapy基本用法
查看>>
PAT A1030 动态规划
查看>>
自制一个 elasticsearch-spring-boot-starter
查看>>