首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java-解压ZIP压缩包及读资料

2013-10-01 
java-解压ZIP压缩包及读文件package com.zjasm.util/** * Created with IntelliJ IDEA. * Date: 13-7-31

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();    }}


热点排行