/*
* 非面向对象语言要实现保存工作数据(如一个绘图程序保存一幅画面的定义),往往需要一个程序数据格式转换为外部
* 文件格式存储,工作时再反向转换的过程.实现比较麻烦,编程不透明.而java语言是一种面向对象的语言,使用它的
* 对象序列化特性,就可实现将工作对象(画面定义对象数据)直接写入硬盘,需要时再直接再读入内存,不需任何额外操作.实现非常
* 方便.但由于写出对象为java类格式,因此数据冗余度较大.当数据量很大时,往往造成存储文件很大.过多的磁盘操作也导致
* 数据读入花费了更多时间,占有了大量内存.采用gzip压缩存储对象是解决此类问题的有效手段.(在本人实现的一个
* 监控系统中,调入一幅测试画面(10万个组件,压缩前7M,压缩后600K),压缩前对如画面后内存为26M,压缩后读入内存为12M,读入速度也大幅提高.效果十分明显).
* java程序开发网络应用程序是它的最大优势,但在某些低速网络情况下(Internet、拨号网络).网络往往造成传输瓶颈,
* 影响应用效果,对于实时性要求高的应用影响更大.采用压缩可以有效改善通信效果.
* 可见,在java下的对象gzip压缩有着广泛的应用价值.以下是一个简单事例程序.
*/
public class GzipDataInflaterManager {
public static void main(String[] args) {
Data testData_ = new Data();
// 未压缩数据对象内容
System.out.println("name=" + testData_.name + " age=" + testData_.age + " height=" + testData_.height);
// 1 压缩
byte[] i_ = CompressObject.writeCompressObject(testData_);
// 2 可执行保存或网络传输,需要时还原或在对端还原
// 3 解压缩
Data o_ = CompressObject.readCompressObject(i_);
// 解压缩后对象内容
System.out.println("name=" + o_.name + " age=" + o_.age + " height=" + o_.height);
}
}
final class CompressObject {
// 将Data类型数据对象序列化对象压缩,返回字节数组,压缩后的对象数组可写入文件保存或用于网络传输
public static byte[] writeCompressObject(Data object_) {
byte[] data_ = null;
try {
// 建立字节数组输出流
ByteArrayOutputStream o = new ByteArrayOutputStream();
// 建立gzip压缩输出流
GZIPOutputStream gzout = new GZIPOutputStream(o);
// 建立对象序列化输出流
ObjectOutputStream out = new ObjectOutputStream(gzout);
out.writeObject(object_);
out.flush();
out.close();
gzout.close();
// 返回压缩字节流
data_ = o.toByteArray();
o.close();
} catch (IOException e) {
System.out.println(e);
}
return data_;
}
// 将压缩字节数组还原为Data类型数据对象
public static Data readCompressObject(byte[] data_) {
Data object_ = null;
try {
// 建立字节数组输入流
ByteArrayInputStream i = new ByteArrayInputStream(data_);
// 建立gzip解压输入流
GZIPInputStream gzin = new GZIPInputStream(i);
// 建立对象序列化输入流
ObjectInputStream in = new ObjectInputStream(gzin);
// 按制定类型还原对象
object_ = (Data) in.readObject();
i.close();
gzin.close();
in.close();
} catch (ClassNotFoundException e) {
System.out.println(e);
} catch (IOException e) {
System.out.println(e);
}
return object_;
}
}
class Data implements Serializable {
private static final long serialVersionUID = 1L;
String name = "李冰冰";
int age = 25;
float height = 160f;
}
public class GzipFileInflaterManager {
public static void main(String[] args) throws IOException {
String zipName = "D:\\new file\\ff.gzip";
String fileName = "D:\\new file\\f1.txt";
String _zipName = "D:\\new file\\ff.gzip";
String _fileName = "D:\\new file\\f11.txt";
gzip(zipName, fileName);
ungzip(_zipName, _fileName);
}
private static void gzip(String zipName, String fileName) throws IOException {
FileInputStream fis = new FileInputStream(fileName);
FileOutputStream fos = new FileOutputStream(zipName);
GZIPOutputStream gos = new GZIPOutputStream(fos);
byte[] bytes = new byte[1024];
int size = 0;
while ( (size = fis.read(bytes)) != -1 ) {
gos.write(bytes, 0, size);
}
gos.flush();
gos.close();
fos.close();
fis.close();
}
private static void ungzip(String zipName, String fileName) throws IOException {
FileInputStream fis = new FileInputStream(zipName);
GZIPInputStream gis = new GZIPInputStream(fis);
FileOutputStream fos = new FileOutputStream(fileName);
byte[] bytes = new byte[1024];
int size = 0;
while ( (size = gis.read(bytes, 0, bytes.length)) != -1 ) {
fos.write(bytes, 0, size);
}
fos.flush();
gis.close();
fos.close();
fis.close();
}
}
public class InflaterManagerImpl{
public static void main(String[] args){
InflaterManager ifm=new InflaterManager();
ifm.inflat("D:\\new file\\tgz.tar");
}
}
class InflaterManager {
public void inflat(String path) {
File file = new File(path), tempFile = null;
InputStream fis = null;
OutputStream fos = null;
TarInputStream zis = null;
try {
fis = new FileInputStream(file);
zis = new TarInputStream(fis);
TarEntry tarEntry = null; //关键在于这个TarEntry 的理解,实际你的tar包里有多少文件就有多少TarEntry
while ((tarEntry = zis.getNextEntry()) != null) {
tempFile = new File("D:\\new file\\" + tarEntry.getName());
tempFile.createNewFile();
fos = new FileOutputStream(tempFile);
byte[] buf = new byte[1024];
int size = 0;
while ((size = zis.read(buf)) != -1) {
fos.write(buf, 0, size);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.flush();
fis.close();
zis.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public class ZipFileInflaterManager {
public static void main(String[] args) throws IOException {
// String[] filesName = new String[3];
// String zipName = "D:\\new file\\ff.zip";
// filesName[0] = "f1.txt";
// filesName[1] = "f2.txt";
// filesName[2] = "f3.txt";
// zip(zipName, filesName);
String[] _filesName = new String[3];
String _zipName = "D:\\new file\\f.zip";
_filesName[0] = "D:\\new file\\f1.txt";
_filesName[1] = "D:\\new file\\f2.txt";
_filesName[2] = "D:\\new file\\f3.txt";
unzip(_zipName, _filesName);
}
private static void zip(String zipName, String[] filesName) throws IOException {
String path = "D:\\new file\\";
FileOutputStream fos = new FileOutputStream(zipName);
ZipOutputStream zos = new ZipOutputStream(fos);
for (String fileName : filesName) {
int size = 0;
byte[] bytes = new byte[128];
// 建立要压缩的文件
ZipEntry ze = new ZipEntry(fileName);
zos.putNextEntry(ze);
// 向要压缩的文件中写入内容
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(path + fileName);
while ((size = fis.read(bytes)) != -1) {
baos.write(bytes, 0, size);
}
zos.write(baos.toByteArray());
// 结束
zos.flush();
fis.close();
}
zos.close();
fos.close();
}
private static void unzip(String zipName, String[] filesName) throws IOException {
int size = 0, i = 0;
byte[] bytes = new byte[128];
FileInputStream fis = new FileInputStream(zipName);
ZipInputStream zis = new ZipInputStream(fis);
// ZipEntry ze = null;
// while ((ze = zis.getNextEntry()) != null) {
while (zis.getNextEntry() != null) {
FileOutputStream fos = new FileOutputStream(filesName[i++]);
while ((size = zis.read(bytes)) != -1) {
fos.write(bytes, 0, size);
}
fos.flush();
fos.close();
zis.closeEntry();
}
fis.close();
zis.close();
}
}
public class FileOperate {
private String message;
/**
* 读取文本文件内容
* @param filePathAndName 带有完整绝对路径的文件名
* @param encoding 文本文件打开的编码方式
* @return 返回文本文件的内容
*/
public String readTxt(String filePathAndName, String encoding) throws IOException {
encoding = encoding.trim();
StringBuffer str = new StringBuffer("");
String st = "";
try {
FileInputStream fs = new FileInputStream(filePathAndName);
InputStreamReader isr;
if (encoding.equals("")) {
isr = new InputStreamReader(fs);
} else {
isr = new InputStreamReader(fs, encoding);
}
BufferedReader br = new BufferedReader(isr);
try {
String data = "";
while ((data = br.readLine()) != null) {
str.append(data + " ");
}
} catch (Exception e) {
str.append(e.toString());
}
st = str.toString();
} catch (IOException es) {
st = "";
}
return st;
}
/**
* 新建目录
* @param folderPath 目录
* @return 返回目录创建后的路径
*/
public String createFolder(String folderPath) {
String txt = folderPath;
try {
java.io.File myFilePath = new java.io.File(txt);
txt = folderPath;
if (!myFilePath.exists()) {
myFilePath.mkdir();
}
} catch (Exception e) {
message = "创建目录操作出错";
}
return txt;
}
/**
* 多级目录创建
* @param folderPath 准备要在本级目录下创建新目录的目录路径 例如 c:myf
* @param paths 无限级目录参数,各级目录以单数线区分 例如 a|b|c
* @return 返回创建文件后的路径 例如 c:myfac
*/
public String createFolders(String folderPath, String paths) {
String txts = folderPath;
try {
String txt;
txts = folderPath;
StringTokenizer st = new StringTokenizer(paths, "|");
for (int i = 0; st.hasMoreTokens(); i++) {
txt = st.nextToken().trim();
if (txts.lastIndexOf("/") != -1) {
txts = createFolder(txts + txt);
} else {
txts = createFolder(txts + txt + "/");
}
}
} catch (Exception e) {
message = "创建目录操作出错!";
}
return txts;
}
/**
* 新建文件
* @param filePathAndName 文本文件完整绝对路径及文件名
* @param fileContent 文本文件内容
*/
public void createFile(String filePathAndName, String fileContent) {
try {
String filePath = filePathAndName;
filePath = filePath.toString();
File myFilePath = new File(filePath);
if (!myFilePath.exists()) {
myFilePath.createNewFile();
}
FileWriter resultFile = new FileWriter(myFilePath);
PrintWriter myFile = new PrintWriter(resultFile);
String strContent = fileContent;
myFile.println(strContent);
myFile.close();
resultFile.close();
} catch (Exception e) {
message = "创建文件操作出错";
}
}
/**
* 有编码方式的文件创建
* @param filePathAndName 文本文件完整绝对路径及文件名
* @param fileContent 文本文件内容
* @param encoding 编码方式 例如 GBK 或者 UTF-8
*/
public void createFile(String filePathAndName, String fileContent,
String encoding) {
try {
String filePath = filePathAndName;
filePath = filePath.toString();
File myFilePath = new File(filePath);
if (!myFilePath.exists()) {
myFilePath.createNewFile();
}
PrintWriter myFile = new PrintWriter(myFilePath, encoding);
String strContent = fileContent;
myFile.println(strContent);
myFile.close();
} catch (Exception e) {
message = "创建文件操作出错";
}
}
/**
* 删除文件
* @param filePathAndName 文本文件完整绝对路径及文件名
* @return Boolean 成功删除返回true遭遇异常返回false
*/
public boolean delFile(String filePathAndName) {
boolean bea = false;
try {
String filePath = filePathAndName;
File myDelFile = new File(filePath);
if(myDelFile.exists()){
myDelFile.delete();
bea = true;
}else{
bea = false;
message = (filePathAndName + "删除文件操作出错");
}
}
catch (Exception e) {
message = e.toString();
}
return bea;
}
/**
* 删除文件夹
* @param folderPath 文件夹完整绝对路径
*/
public void delFolder(String folderPath) {
try {
delAllFile(folderPath); // 删除完里面所有内容
String filePath = folderPath;
filePath = filePath.toString();
java.io.File myFilePath = new java.io.File(filePath);
myFilePath.delete(); // 删除空文件夹
} catch (Exception e) {
message = ("删除文件夹操作出错");
}
}
/**
* 删除指定文件夹下所有文件
* @param path 文件夹完整绝对路径
*/
public boolean delAllFile(String path) {
boolean bea = false;
File file = new File(path);
if (!file.exists()) {
return bea;
}
if (!file.isDirectory()) {
return bea;
}
String[] tempList = file.list();
File temp = null;
for (int i = 0; i < tempList.length; i++) {
if (path.endsWith(File.separator)) {
temp = new File(path + tempList[i]);
} else {
temp = new File(path + File.separator + tempList[i]);
}
if (temp.isFile()) {
temp.delete();
}
if (temp.isDirectory()) {
delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
delFolder(path + "/" + tempList[i]);// 再删除空文件夹
bea = true;
}
}
return bea;
}
/**
* 复制单个文件
* @param oldPathFile 准备复制的文件源
* @param newPathFile 拷贝到新绝对路径带文件名
*/
public void copyFile(String oldPathFile, String newPathFile) {
try {
int bytesum = 0;
int byteread = 0;
File oldfile = new File(oldPathFile);
if (oldfile.exists()) { // 文件存在时
InputStream inStream = new FileInputStream(oldPathFile); // 读入原文件
FileOutputStream fs = new FileOutputStream(newPathFile);
byte[] buffer = new byte[1444];
while ((byteread = inStream.read(buffer)) != -1) {
bytesum += byteread; // 字节数 文件大小
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
inStream.close();
}
} catch (Exception e) {
message = ("复制单个文件操作出错");
}
}
/**
* 复制整个文件夹的内容
* @param oldPath 准备拷贝的目录
* @param newPath 指定绝对路径的新目录
*/
public void copyFolder(String oldPath, String newPath) {
try {
new File(newPath).mkdirs(); // 如果文件夹不存在 则建立新文件夹
File a = new File(oldPath);
String[] file = a.list();
File temp = null;
for (int i = 0; i < file.length; i++) {
if (oldPath.endsWith(File.separator)) {
temp = new File(oldPath + file[i]);
} else {
temp = new File(oldPath + File.separator + file[i]);
}
if (temp.isFile()) {
FileInputStream input = new FileInputStream(temp);
FileOutputStream output = new FileOutputStream(newPath
+ "/" + (temp.getName()).toString());
byte[] b = new byte[1024 * 5];
int len;
while ((len = input.read(b)) != -1) {
output.write(b, 0, len);
}
output.flush();
output.close();
input.close();
}
if (temp.isDirectory()) {// 如果是子文件夹
copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);
}
}
} catch (Exception e) {
message = "复制整个文件夹内容操作出错";
}
}
/**
* 移动文件
*/
public void moveFile(String oldPath, String newPath) {
copyFile(oldPath, newPath);
delFile(oldPath);
}
/**
* 移动目录
*/
public void moveFolder(String oldPath, String newPath) {
copyFolder(oldPath, newPath);
delFolder(oldPath);
}
public String getMessage() {
return this.message;
}
}
public class InflaterManagerImpl {
public static void main(String[] args) throws IOException {
ungzip("D:\\newfile\\fe569190-b628-012c-8680-0019e3436cf2.tgz");
}
private static void ungzip(String path_tgz) {
String path_tar = path_tgz.substring(0, path_tgz.indexOf(".tgz")) + ".tar";
/**
* ungzip
*/
InputStream fis_tgz = null;
InputStream gis_tgz = null;
FileOutputStream fos_tar = null;
File file_tar = null;
try {
// Input the file which's suffix is tgz
fis_tgz = new FileInputStream(path_tgz);
gis_tgz = new GZIPInputStream(fis_tgz);
// Output the file which's suffix is tar
file_tar = new File(path_tar);
file_tar.createNewFile();
fos_tar = new FileOutputStream(file_tar);
byte[] bytes = new byte[1024];
int size = 0;
while ((size = gis_tgz.read(bytes, 0, bytes.length)) != -1) {
fos_tar.write(bytes, 0, size);
}
fos_tar.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos_tar.close();
gis_tgz.close();
fis_tgz.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* untar
*/
InputStream fis_tar = null;
TarInputStream tis_tar = null;
OutputStream fos_doc = null;
try {
// Input the file which's suffix is tar
fis_tar = new FileInputStream(file_tar);
tis_tar = new TarInputStream(fis_tar);
TarEntry tarEntry = null; // 关键在于这个TarEntry的理解,实际你的tar包里有多少文件就有多少TarEntry
String path_doc = null;
while ((tarEntry = tis_tar.getNextEntry()) != null) {
if (path_doc == null) {
path_doc = path_tgz.substring(0, path_tgz.indexOf(tarEntry.getName().substring(0, tarEntry.getName().length() - 1)));
}
File tempFile = new File(path_doc + tarEntry.getName());
if (tarEntry.isDirectory()) {
tempFile.mkdirs();
} else {
tempFile.createNewFile();
fos_doc = new FileOutputStream(tempFile);
byte[] buf = new byte[1024];
int size = 0;
while ((size = tis_tar.read(buf)) != -1) {
fos_doc.write(buf, 0, size);
}
}
}
fos_doc.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos_doc.close();
tis_tar.close();
fis_tar.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
22 用到了javatar包