`
Dxx23
  • 浏览: 140970 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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



}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics