java-解压ZIP压缩包及读文件


package com.zjasm.util;

/**
* Created with IntelliJ IDEA.
* Date: 13-7-31
* Time: 下午4:29
* To change this template use File | Settings | File Templates.
*/
/**
version: 1.1 / 2007-01-25
- changed BOM recognition ordering (longer boms first)

Original pseudocode : Thomas Weidenfeller
Implementation tweaked: Aki Nieminen

http://www.unicode.org/unicode/faq/utf_bom.html
BOMs:
00 00 FE FF = UTF-32, big-endian
FF FE 00 00 = UTF-32, little-endian
EF BB BF = UTF-8,
FE FF = UTF-16, big-endian
FF FE = UTF-16, little-endian

Win2k Notepad:
Unicode format = UTF-16LE
***/

import java.io.*;

/**
* Generic unicode textreader, which will use BOM mark
* to identify the encoding to be used. If BOM is not found
* then use a given default or system encoding.
*/
public class UnicodeReader extends Reader {
PushbackInputStream internalIn;
InputStreamReader internalIn2 = null;
String defaultEnc;

private static final int BOM_SIZE = 4;

/**
*
* @param in inputstream to be read
* @param defaultEnc default encoding if stream does not have
* BOM marker. Give NULL to use system-level default.
*/
UnicodeReader(InputStream in, String defaultEnc) {
internalIn = new PushbackInputStream(in, BOM_SIZE);
this.defaultEnc = defaultEnc;
}

public String getDefaultEncoding() {
return defaultEnc;
}

/**
* Get stream encoding or NULL if stream is uninitialized.
* Call init() or read() method to initialize it.
*/
public String getEncoding() {
if (internalIn2 == null) return null;
return internalIn2.getEncoding();
}

/**
* Read-ahead four bytes and check for BOM marks. Extra bytes are
* unread back to the stream, only BOM bytes are skipped.
*/
protected void init() throws IOException {
if (internalIn2 != null) return;

String encoding;
byte bom[] = new byte[BOM_SIZE];
int n, unread;
n = internalIn.read(bom, 0, bom.length);

if ( (bom[0] == (byte)0x00) && (bom[1] == (byte)0x00) &&
(bom[2] == (byte)0xFE) && (bom[3] == (byte)0xFF) ) {
encoding = "UTF-32BE";
unread = n - 4;
} else if ( (bom[0] == (byte)0xFF) && (bom[1] == (byte)0xFE) &&
(bom[2] == (byte)0x00) && (bom[3] == (byte)0x00) ) {
encoding = "UTF-32LE";
unread = n - 4;
} else if ( (bom[0] == (byte)0xEF) && (bom[1] == (byte)0xBB) &&
(bom[2] == (byte)0xBF) ) {
encoding = "UTF-8";
unread = n - 3;
} else if ( (bom[0] == (byte)0xFE) && (bom[1] == (byte)0xFF) ) {
encoding = "UTF-16BE";
unread = n - 2;
} else if ( (bom[0] == (byte)0xFF) && (bom[1] == (byte)0xFE) ) {
encoding = "UTF-16LE";
unread = n - 2;
} else {
// Unicode BOM mark not found, unread all bytes
encoding = defaultEnc;
unread = n;
}
//System.out.println("read=" + n + ", unread=" + unread);

if (unread > 0) internalIn.unread(bom, (n - unread), unread);

// Use given encoding
if (encoding == null) {
internalIn2 = new InputStreamReader(internalIn);
} else {
internalIn2 = new InputStreamReader(internalIn, encoding);
}
}

public void close() throws IOException {
init();
internalIn2.close();
}

public int read(char[] cbuf, int off, int len) throws IOException {
init();
return internalIn2.read(cbuf, off, len);
}

}




package com.zjasm.util;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

import java.io.*;
import java.util.*;

/**
* Created with IntelliJ IDEA.
* Date: 13-7-8
* Time: 上午10:25
* To change this template use File | Settings | File Templates.
*/
public class ZipUtil {
public static final int BUFFER = 1024*5;


/**
* 可以处理中文文件名
*/
public static List unZip(String path){
List zipList = new ArrayList();
int count = -1;
int index = -1;
File file = null;
InputStream is = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
String newFilePath = path.substring(0,path.lastIndexOf(".zip"))+"\\";
new File(newFilePath).mkdirs();
String targetPath = newFilePath;//解压到路径
try{
ZipFile zipFile = new ZipFile(path,"utf-8");//防止中文文件名乱码
Enumeration entries = zipFile.getEntries();
while(entries.hasMoreElements()){
byte buf[] = new byte[BUFFER];
ZipEntry entry = (ZipEntry)entries.nextElement();
String filename = entry.getName();
if (entry.isDirectory()) {
new File(targetPath + filename).mkdirs();
continue;
}
zipList.add(filename);
index = filename.lastIndexOf("/");
if(index > -1){
filename = filename.substring(index+1);
}
filename = targetPath + filename;
file = new File(filename);
file.createNewFile();
is = zipFile.getInputStream(entry);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos, BUFFER);
while((count = is.read(buf)) > -1){
bos.write(buf, 0, count );
}
bos.flush();
bos.close();
fos.close();
is.close();
}
zipFile.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
return zipList;
}

/**
* 解压zip文件(不支持中文文件名)
*
* @param filePath
* zip文件全路径
* @throws IOException
*/
/*public static List unZip(String filePath)
throws IOException {
List zipList = new ArrayList();
String newFilePath = filePath.substring(0,filePath.lastIndexOf(".zip"))+"\\";
new File(newFilePath).mkdirs();
String targetPath = newFilePath;//解压到路径

ZipFile zipFile = new ZipFile(filePath);
Enumeration emu = zipFile.entries();
while (emu.hasMoreElements()) {
ZipEntry entry = (ZipEntry) emu.nextElement();
zipList.add(entry.getName());
if (entry.isDirectory()) {
new File(targetPath + entry.getName()).mkdirs();
continue;
}
BufferedInputStream bis = new BufferedInputStream(
zipFile.getInputStream(entry));
File file = new File(targetPath+entry.getName());
File parent = file.getParentFile();
if (parent != null && (!parent.exists())) {
parent.mkdirs();
}
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER);

int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
bos.write(data, 0, count);
}
bos.flush();
bos.close();
fos.close();
bis.close();
}
return zipList;
}*/

/**
* 动态改变数组
*
*/
public static Object[] insertArr(Object[] arr, Object str){
int size = arr.length;
Object[] tmp = new Object[size + 1];
System.arraycopy(arr, 0, tmp, 0, size);
tmp[size] = str;
return tmp;
}

public static String loadFile(String file) throws IOException {
// read text file, auto recognize bom marker or use
// system default if markers not found.
BufferedReader reader = null;
CharArrayWriter writer = null;
UnicodeReader r = new UnicodeReader(new FileInputStream(file), null);
char[] buffer = new char[16 * 1024]; // 16k buffer
int read;
try {
reader = new BufferedReader(r);
writer = new CharArrayWriter();
while( (read = reader.read(buffer)) != -1) {
writer.write(buffer, 0, read);
}
writer.flush();
return writer.toString();
} catch (IOException ex) {
throw ex;
} finally {
try {
writer.close(); reader.close(); r.close();
} catch (Exception ex) { }
}
}


public String readTxt(String txtPath){
StringBuffer stringBuffer = new StringBuffer();
String line = null;
try {
InputStreamReader read = new InputStreamReader(
new FileInputStream(new File(txtPath)),"utf-8");//考虑到编码格式
BufferedReader br = new BufferedReader(read);
while ((line = br.readLine()) != null) {
stringBuffer.append(line+"\n");
}
br.close();
read.close();
} catch (Exception e) {
e.printStackTrace();
}
return stringBuffer.toString();
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值