文件压缩:

public class TestMerge {public static void merge(String srcFiles, String destFilePath) {//判断原文件路径是否为空if (srcFiles == null) {throw new IllegalArgumentException(srcFiles + " must be not null");}//创建目标文件夹,并且判断目标文件夹是否存在File destFile = new File(destFilePath);if (!destFile.exists()) {boolean effect = destFile.mkdirs();if (!effect) {throw new IllegalArgumentException(destFile + " create failed");}}//获取原文件夹中所有的文件File[] files = listAllFiles(srcFiles);for (File src : files) {//如果文件格式不是jpg或者png,就不参与文件合并if (!src.getName().endsWith("jpg") && !src.getName().endsWith("png")) {continue;}//记录每个参与合并的文件的字节长度int length = (int) src.length();//进行文件传入和目的文件的传出try (FileInputStream in = new FileInputStream(src);FileOutputStream out = new FileOutputStream(new File(destFile, "mergeP2.jpg"), true)) {//将每个参与合并的图片文件的长度加在文件字节前,用于记录参与合并的文件长度,并且在解压文件时起到指示此文件解压完成的作用//这里需要将文件的长度转换成byte数组,再传入目的文件中//length -> byte[]   82(int) -> 32(bit)for (int i = 0; i < trans(length).length; i++) {
//                    System.out.println(trans(length)[i]);out.write(trans(length)[i]);}//读取原文件中的字节内容byte[] buff = new byte[1024];int len = -1;while ((len = in.read(buff)) != -1) {out.write(buff, 0, len);}out.flush();} catch (IOException e) {e.printStackTrace();}}}//实现int类型转换为byte数组public static byte[] trans(int data) {//int转换成byte[] 不需要 & 0xFF//0xFF是字面量:00000000 00000000 00000000 11111111byte[] ret = new byte[4];ret[0] = (byte) (data >> 24);ret[1] = (byte) (data >> 16);ret[2] = (byte) (data >> 8);ret[3] = (byte) data;return ret;}//实现byte数组转换成int类型public static int byteArrayToInt(byte[] buff) {//byte[] 转换成int 必须 & 0xFFint values = 0;for (int i = 0; i < 4; i++) {int shift = (3 - i) * 8;values += (buff[i] & 0xFF) << shift;}return values;}//用来显示原文件夹下所有的文件,简化添加图片文件的步骤public static File[] listAllFiles(String srcFilePath) {File srcFile = new File(srcFilePath);if (srcFile.isFile()) {return new File[]{srcFile};}return srcFile.listFiles();}//测试public static void main(String[] args) {
//        String[] srcFiles = {"D:" + File.separator + "TestCode" + File.separator + "iotest" + File.separator + "data-a.txt",
//                "D:" + File.separator + "TestCode" + File.separator + "iotest" + File.separator + "data-b.txt",
//                "D:" + File.separator + "TestCode" + File.separator + "iotest" + File.separator + "data-c.txt"};
//        String destFilePath = "D:" + File.separator + "TestCode" + File.separator + "iotest" + File.separator + "data.txt";
//        merge(srcFiles, destFilePath);String srcFiles = "D:" + File.separator + "TestCode" + File.separator + "iotest" + File.separator + "spiltP";String destFilePath = "D:" + File.separator + "TestCode" + File.separator + "iotest" + File.separator + "mergePicture";long start = System.currentTimeMillis();merge(srcFiles, destFilePath);long end = System.currentTimeMillis();System.out.println(end-start);}
}

文件解压:

public class TestSplit {public static void splitFile(String srcFilePath, String destFilesPath) {//判断原文件路径是否存在if (srcFilePath.isEmpty()) {throw new IllegalArgumentException(srcFilePath + "must be not null");}//创建原文件File srcFile = new File(srcFilePath);//count用来记录解压得到的文件个数,并用于文件命名int count = 1;//创建目的文件夹File destFile = new File(destFilesPath);//判断目的文件夹是否存在if (!destFile.exists()) {destFile.mkdirs();}//进行文件传输try (FileInputStream in = new FileInputStream(srcFile)) {while (true) {//首先读取压缩文件中的前4个字节,这4个字节记录了第一个解压出的文件长度byte[] data = new byte[4];int length = in.read(data);if (length != 4) {break;}//创建解压出的文件FileOutputStream out = new FileOutputStream(new File(destFile, "p" + (count++) + ".jpg"));//将压缩文件中的前四个字节记录的值转换成int类型的文件长度值int fileLen = TestMerge.byteArrayToInt(data);int len = -1;//创建byte数组,数组长度为文件长度值byte[] buff = new byte[fileLen];len = in.read(buff);//判断文件是否读取完if (len != -1 && len == buff.length) {//buff -> fileout.write(buff, 0, len);out.flush();out.close();continue;}if (len == -1) {break;}}} catch (IOException e) {e.printStackTrace();}}//测试public static void main(String[] args) {String directory = "D:" + File.separator + "TestCode" + File.separator + "iotest" + File.separator;String srcFilePath = directory + "mergePicture"+File.separator+"mergeP2.jpg";String destFilesPath = directory + "b";long start = System.currentTimeMillis();splitFile(srcFilePath, destFilesPath);long end = System.currentTimeMillis();System.out.println(end-start);}
}

运行结果:

测试用例中,合并了87个文件图片,总共大小为328389KB,测试结果如图:
压缩结果以及压缩时间:


解压结果以及解压时间:

利用Java的I/O流实现图片的压缩以及解压相关推荐

  1. 利用哈夫曼树实现英文短文的压缩与解压

    #include <stdio.h> //主要包括常用的输入/输出函数 #include <string.h> //主要包括常用的字符串操作函数 #include <st ...

  2. java解压zip包_Java中文件的压缩与解压,每天进步一点点系列

    使用java.util.zip包,实现文件的压缩与解压,并提供了下载方法 注意 无论是调用createNewFile()创建文件,还是在创建输出流时由输出流负责创建文件,都必须保证父路径已经存在,否则 ...

  3. 利用huffman编码对文本文件进行压缩与解压(java实现)

    利用huffman编码对文本文件进行压缩与解压 输入:一个文本文件 输出:压缩后的文件 算法过程: (1)统计文本文件中每个字符的使用频度 (2)构造huffman编码 (3)以二进制流形式压缩文件 ...

  4. Java 中调用 Apache API 实现图片文件的 压缩 与 解压 实例

    < Java 中调用 Apache API 实现图片文件的 压缩 与 解压 > 为什么不直接使用 Java JDK 中自带的 API 呢?必须使用 Apache API 实现文件的压缩与解 ...

  5. [Java]Swing窗体演示ZIP压缩流的压缩与解压

    最近开始学习java,然后学完了Swing和各种流后,试着写了个ZIP的压缩解压软件出来,具体代码如下: 压缩准备部分: String path = ja.getText();//获取文本域内容Str ...

  6. Java利用Gzip对字符串进行压缩与解压

    在某些业务场景下,可能需要对字符串进行压缩与解压,压缩字符串可以使用 GZIPOutputStream 输出流来实现,而解压可以使用 GZIPInputStream 输入流来实现,下面先给出具体的参考 ...

  7. Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

  8. java gzip 解压文件_Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

  9. 使用java.util.zip包实现根据文件目录控制文件的压缩与解压

    根据文件目录实现文件的压缩与解压 import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputSt ...

最新文章

  1. gcc可以编译python程序吗_gcc c语言编译流程
  2. java 鸡兔统统_Java内存泄露介绍
  3. 移动端制作公共样式reset
  4. mysql timestamp 自动更新_mysql timestamp自动更新
  5. Android 第十三课 SharedPreferences存储
  6. array专题2---理解暴力枚举与动态规划
  7. 第67课 选择排序 改进例67.1 《小学生C++编程入门》
  8. 【奇技淫巧】在安卓模拟器中安装busybox
  9. mac下workbench轻松搭建(drools 7.11.0.Final版本)
  10. python制作网页挂机_python使用ip代理抓取网页
  11. 商品中心 --- 淘宝类目属性体系
  12. win10快捷键启动屏幕保护程序
  13. SPSS统计分析常用知识点
  14. matplotlib—画正弦、余弦函数图
  15. 如何坚持不懈的做某件事情
  16. c语言程序设计实验13文件,第13章_文件---《C语言程序设计》实验指导.ppt
  17. Java实现 LeetCode 345 反转字符串中的元音字母
  18. Android实时语音聊天
  19. 大数据实战|怎样实现大型电商热销榜?
  20. c++实现磨砂玻璃(类似马赛克)效果

热门文章

  1. HTML_表单的介绍提交按钮
  2. 机器学习实践指南:案例应用解析(第二版)
  3. 【录音取证篇】录音设备鉴定名词解释
  4. 通过面向对象设计串口协议
  5. Mysql进阶学习(五)连接查询(包含sql92标准和sql99标准)
  6. mysql sql 转义符_MySQL的转义字符
  7. Qt的转义字符,单双斜线路径转换
  8. 如何在github上添加密钥
  9. DVD支持的视频格式
  10. teraterm 执行sql命令_tera term的ttl脚本使用方法[转]