java-解压ZIP压缩包及读文件
程序员文章站
2024-03-07 12:21:15
...
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(); } }