尝试使用c++ gzlib和java GZIPOutputStream 读写gz压缩文件
2015-04-20 16:17
501 查看
问题背景:
我需要生成一个大概1.5T的double型矩阵,硬盘受不了,IO时间消耗不起,于是尝试在输出前压缩。矩阵生成使用java,在矩阵上的计算使用cpp
于是分别尝试使用java 写gz压缩文件和使用c++读压缩文件
一下为简单的测试代码:
写:
读:
需要注意的问题:
GZIPOutputStream只有一个write方法,只接受byte[],于是需要将double转换成byte[],有两条路:
1. double 直接转化成byte[]
这种方法写入的文件,不能使用gunzip直接解压,解压会出乱码,因为文件存储double值是按照每个数字的char作为一个字节存储的,只能自己写解压程序,将byte[]转成double
2. double 转String再转byte[]
也就是我最终用的方法
最后,做了一些测试,gzip的压缩效果真心点赞
-rw-r--r-- 1 users 193843 Apr 20 2015 t10e4
-rw-r--r-- 1 users 5408 Apr 20 2015 t10e4.gz
-rw-r--r-- 1 users 1977688 Apr 20 2015 t10e5
-rw-r--r-- 1 users 80940 Apr 20 2015 t10e5.gz
我需要生成一个大概1.5T的double型矩阵,硬盘受不了,IO时间消耗不起,于是尝试在输出前压缩。矩阵生成使用java,在矩阵上的计算使用cpp
于是分别尝试使用java 写gz压缩文件和使用c++读压缩文件
一下为简单的测试代码:
写:
public boolean generateGzipFile(String ofname) throws IOException { FileOutputStream fout = new FileOutputStream(ofname); GZIPOutputStream gos = new GZIPOutputStream(fout); for(int i = 0; i < numbers.size(); i++){ String tstr = String.valueOf(numbers.get(i)); tstr += "\n"; gos.write(tstr.getBytes()); } gos.finish(); gos.flush(); gos.close(); return true; }
读:
#include <iostream> #include <stdlib.h> #include <string> #include <zlib.h> using namespace std; int main(int argc, char **argv){ if(argc != 2){ cerr << "example command: exe file.tar.gz" << endl; return 0; } gzFile gzfp = gzopen(argv[1], "rb"); if(!gzfp) return 0; char buf[32]; while(gzgets(gzfp, buf, 31)){ cout << "str: " << buf << endl; cout << "num: " << atof(buf) << endl; } return 0; }
需要注意的问题:
GZIPOutputStream只有一个write方法,只接受byte[],于是需要将double转换成byte[],有两条路:
1. double 直接转化成byte[]
//byte dnum[] = new byte[8]; //ByteBuffer.wrap(dnum).putDouble(numbers.get(i)); //gos.write(dnum);
这种方法写入的文件,不能使用gunzip直接解压,解压会出乱码,因为文件存储double值是按照每个数字的char作为一个字节存储的,只能自己写解压程序,将byte[]转成double
2. double 转String再转byte[]
也就是我最终用的方法
最后,做了一些测试,gzip的压缩效果真心点赞
-rw-r--r-- 1 users 193843 Apr 20 2015 t10e4
-rw-r--r-- 1 users 5408 Apr 20 2015 t10e4.gz
-rw-r--r-- 1 users 1977688 Apr 20 2015 t10e5
-rw-r--r-- 1 users 80940 Apr 20 2015 t10e5.gz
相关文章推荐
- 使用GZIPOutputStream和GZIPInputStream进行压缩解压文件
- 170814、Java使用gzip压缩文件、还原文件
- Java使用GZIP进行压缩和解压缩(GZIPOutputStream,GZIPInputStream)
- Java使用zip4j进行压缩文件处理
- 操作、压缩MDB文件;使用ADO读写Mysql数据库;建立数据库和表的VBS脚本代码(2013-08-26 11:39:34)
- Java ZIP压缩文件读写
- java使用POI jar包读写xls文件
- java压缩和解压缩Zip、Jar、Gzip文件
- java中GZIPOutputStream 流的使用(EOFException)
- Java使用线程池递归压缩文件夹下面的所有子文件
- java使用IO读写文件总结
- 使用volley读取压缩文件的内容(zip、gz)
- 使用tar和gzip对某文件夹内的某类型文件进行压缩与解压缩
- Java使用RandomAccessFile读写文件
- [Java]使用gzip对字符串进行压缩/解压
- 使用java.util.Properties类读写配置文件
- Java使用7Zip完成文件的压缩和解压缩
- 使用Java zip包和apach 的ant包对文件、文件夹进行压缩,兼容中文
- 使用Java对文件或文件夹的压缩, 解压, 加密和解密
- web使用GZIP压缩和解压缩文件