/*
* 非面嚮對象語言要實現保存工作數據(如一個繪圖程序保存一幅畫面的定義),往往需要一個程序數據格式轉換爲外部
* 文件格式存儲,工作時再反向轉換的過程.實現比較麻煩,編程不透明.而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包