亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? rarfile.java

?? RARoScope是一個用于掃描和列舉這個RAR壓縮文檔內(nèi)容的Java類庫。它能夠讀取RAR文檔大部分可用信息包括:1.完整的文件名包括路徑。2.文件被修改/創(chuàng)建的日期和時間。3.壓縮過的文件大小。4
?? JAVA
字號:
/*
 * RARoScope - Java Library for Scanning RAR Archives
 * 
 * Copyright 2008 Adarsh Ramamurthy 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0 
 *  
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License.
 * 
 * Homepage: http://www.adarshr.com/papers/raroscope
 */

package com.adarshr.raroscope;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;
import java.util.NoSuchElementException;

/**
 * Represents a RAR archive.
 * <p>
 * This class is used to enumerate the entries in a RAR file.
 * 
 * @author Adarsh Ramamurthy
 * 
 * @version 1.0, 10th March 2008
 */
public class RARFile
{
    /**
     * The underlying stream.
     */
    private InputStream stream;
    
    /**
     * Marker block of RAR archives. It is "Rar!" in reverse bytes.
     */
    private static final long MARKER = 0x21726152L;
    
    /**
     * To hold the available bytes in the stream.
     */
    private long available;
    
    /**
     * Constructs an instance of <tt>RARFile</tt> for performing operations
     * on the archive.
     * 
     * @param name the RAR file name.
     * 
     * @throws IOException in case of errors reading from the archive.
     */
    public RARFile(String name) throws IOException
    {
        this(new File(name));
    }
    
    /**
     * Constructs an instance of <tt>RARFile</tt> for performing operations
     * on the archive.
     * 
     * @param file the RAR file.
     * 
     * @throws IOException in case of errors reading from the archive.
     */
    public RARFile(File file) throws IOException
    {
        this.stream = new FileInputStream(file);
        
        this.available = this.stream.available();
        
        byte[] headers = new byte[7 + 13];
        
        // Read the Marker Block and Archive Header Blocks.
        this.stream.read(headers);
        
        if(MARKER != getLong(headers, 0, 3))
        {
            throw new IOException("Invalid RAR archive");
        }
    }
    
    /**
     * Enumerates all the entries in the RAR archive.
     * 
     * @return an instance of <tt>Enumeration</tt> for displaying the entries.
     * 
     * @see RAREntry
     */
    public Enumeration<RAREntry> entries()
    {
        return new Enumeration<RAREntry>() {
        
            public RAREntry nextElement()
            {
                byte[] buf = new byte[32];
                
                RAREntry entry = null;
                
                try
                {
                    RARFile.this.available -= RARFile.this.stream.read(buf);
                    
                    int type = buf[2] & 0xFF;
                    
                    // Means File Header Block
                    if(type == 0x74)
                    {
                        entry = new RAREntry();
                        
                        long flags = getLong(buf, 3, 4);
                        
                        entry.setDirectory((flags & 0xE0) == 0xE0);
                        
                        long pSize = getLong(buf, 7, 10);
                        long size = getLong(buf, 11, 14);
                        
                        // Very large file ( > 2GB )
                        if((flags & 0x100) == 0x100)
                        {
                            byte[] hiBytes = new byte[8];
                            
                            RARFile.this.available -= 
                                RARFile.this.stream.read(hiBytes);
                            
                            pSize = getLong(hiBytes, 0, 4) << 32 | pSize;
                            size = getLong(hiBytes, 5, 8) << 32 | size;
                        }
                        
                        long hSize = getLong(buf, 5, 6);
                        
                        entry.setCompressedSize(pSize);
                        entry.setSize(getLong(buf, 11, 14));
                        entry.setHostOS(toOS(buf[15] & 0xFF));
                        entry.setCrc(getLong(buf, 16, 19));
                        entry.setTime(toDate(getLong(buf, 20, 23)));
                        entry.setVersion(toVersion(buf[24] & 0xFF));
                        entry.setMethod(toMethod(buf[25] & 0xFF));
                        
                        long nSize = getLong(buf, 26, 27);
                        
                        byte[] name = new byte[(int)nSize];
                        
                        RARFile.this.available -= 
                            RARFile.this.stream.read(name);
                        
                        entry.setName(new String(name));
                        
                        RARFile.this.available -= 
                            RARFile.this.stream.skip(
                                hSize - (32 + nSize) + pSize);
                    }
                }
                catch (IOException e)
                {
                    throw new NoSuchElementException(e.getMessage());
                }
                
                if(entry == null)
                {
                    throw new NoSuchElementException();
                }
                
                return entry;
            }
            
            public boolean hasMoreElements()
            {
                return RARFile.this.available > 32;
            }
            
        };
    }
    
    /**
     * Closes the archive.
     * 
     * @throws IOException in case of errors while closing.
     */
    public void close() throws IOException
    {
        this.stream.close();
    }
    
    /**
     * Converts the input inverted array of bytes to a long representation.
     * 
     * @param bytes the byte array to be converted.
     * 
     * @return the long value.
     */
    protected long getLong(byte[] bytes)
    {
        long ret = 0;
        long mask = 0;
        
        for (int i = 0; i < bytes.length; i++)
        {
            ret |= (bytes[i] & 0xFF) << (8 * i); // mask and shift left
            mask = (mask << 8) | 0xFF; // generate the final mask
        }
        
        return ret & mask;
    }
    
    /**
     * Converts the input inverted array of bytes to a long representation.
     * Conversion is done inclusive of both the limits specified.
     * 
     * @param bytes the byte array to be converted.
     * 
     * @param start the index to start with.
     * 
     * @param end the end index.
     * 
     * @return the long value.
     */
    protected long getLong(byte[] bytes, int start, int end)
    {
        long ret = 0;
        long mask = 0;
        
        if(start < 0 || end >= bytes.length)
        {
            return ret;
        }
        
        for (int i = start, j = 0; i <= end; i++, j++)
        {
            ret |= (bytes[i] & 0xFF) << (8 * j); // mask and shift left
            mask = (mask << 8) | 0xFF; // generate the final mask
        }
        
        return ret & mask;
    }
    
    /**
     * Converts the DOS time to Java date.
     *  
     * @param dosTime MS DOS format time.
     * 
     * @return an instance of <tt>Date</tt>.
     */
    protected Date toDate(long dosTime)
    {
        Calendar calendar = Calendar.getInstance();
        
        calendar.set(
            (int)(((dosTime >> 25) & 0x7f) + 1980),  // year
            (int)(((dosTime >> 21) & 0x0f) - 1),  // month
            (int)((dosTime >> 16) & 0x1f),  // date
            (int)((dosTime >> 11) & 0x1f),  // hours
            (int)((dosTime >> 5) & 0x3f),  // minutes
            (int)((dosTime << 1) & 0x3e));  // seconds
        
        return calendar.getTime();
    }
    
    /**
     * Translate the OS byte to a human readable string.
     * 
     * @param o the number to be translated (1 byte).
     * 
     * @return the OS string.
     */
    protected String toOS(int o)
    {
        String os = null;
        
        switch(o)
        {
            case 0: 
                os = "MS DOS";
                break;
                
            case 1: 
                os = "OS/2";
                break;
                
            case 2: 
                os = "Win32";
                break;
                
            case 3: 
                os = "Unix";
                break;
                
            case 4: 
                os = "Mac OS";
                break;
                
            case 5:
                os = "BeOS";
                break;
                
            default:
                os = "Unknown";
                break;
        }
        
        return os;
    }
    
    /**
     * Decodes the version information. Version number will be of the format
     * 10 * Major Version + Minor Version.
     * 
     * @param v the version number.
     * 
     * @return the decoded version in the format "major.minor".
     */
    protected String toVersion(int v)
    {
        return String.valueOf(v/10F);
    }
    
    /**
     * Translates the compression method into a string.
     * 
     * @param m the compression method number.
     * 
     * @return the compression method string.
     */
    protected String toMethod(int m)
    {
        String method = null;
        
        switch (m)
        {
            case 0x30:
                method = "Storing";
                break;
                
            case 0x31:
                method = "Fastest Compression";
                break;
                
            case 0x32:
                method = "Fast Compression";
                break;
                
            case 0x33:
                method = "Normal Compression";
                break;
               
            case 0x34:
                method = "Good Compression";
                break;

            case 0x35:
                method = "Best Compression";
                break;
                
            default:
                method = "Unknown";
                break;
        }
        
        return method;
    }
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品乱码妇女bbbb| 激情都市一区二区| 一区二区三区欧美激情| 不卡一区二区中文字幕| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲免费观看高清完整版在线观看| 日韩免费观看2025年上映的电影 | 精品久久久久一区二区国产| 欧美v国产在线一区二区三区| 久久久久久久久久久久久久久99| 亚洲欧美日韩在线| 精品一区二区三区在线观看| 欧美日韩一区中文字幕| 亚洲一卡二卡三卡四卡五卡| 色欧美乱欧美15图片| 日韩精品一级二级| 精品成人a区在线观看| 日本不卡视频一二三区| 亚洲色欲色欲www在线观看| 老色鬼精品视频在线观看播放| 国产精品自在在线| 久久嫩草精品久久久久| 国产麻豆精品在线观看| 日韩欧美你懂的| 久久精品99久久久| 久久久精品黄色| 欧美一级午夜免费电影| 国产精品久久久久国产精品日日| 久久精品国产亚洲高清剧情介绍| 欧美日韩国产另类一区| 依依成人精品视频| 欧美日韩亚洲综合| 1024成人网| 成人深夜视频在线观看| 91精品办公室少妇高潮对白| 日韩不卡在线观看日韩不卡视频| 日韩精品一区二区三区三区免费 | 亚洲一区二区偷拍精品| 色综合天天综合色综合av| 国产日韩成人精品| 久久网这里都是精品| 97精品久久久午夜一区二区三区 | 蜜臀av性久久久久蜜臀av麻豆| 亚洲欧美激情插| 国产精品国产三级国产aⅴ中文| 久久精品一区二区三区不卡 | 日韩 欧美一区二区三区| 亚洲一区二区三区在线播放| 亚洲激情图片qvod| 亚洲综合色丁香婷婷六月图片| 亚洲伊人伊色伊影伊综合网| 亚洲日本va午夜在线影院| 亚洲品质自拍视频| 亚洲最大的成人av| 午夜精品久久久久久久蜜桃app| 亚洲成人免费av| 蜜桃视频在线观看一区| 经典三级一区二区| 国产91精品一区二区麻豆亚洲| 国产精品一卡二卡在线观看| 成人午夜免费av| 色网站国产精品| 51精品视频一区二区三区| 欧美不卡在线视频| 国产欧美1区2区3区| 91一区二区在线| 99国产精品久久| 欧美日韩一级二级| 日韩精品中文字幕一区二区三区| 久久免费看少妇高潮| 亚洲视频一二区| 日韩影院精彩在线| 国产成人午夜99999| 色综合天天综合狠狠| 8x8x8国产精品| 国产清纯白嫩初高生在线观看91| 亚洲欧洲一区二区在线播放| 亚洲不卡一区二区三区| 精品一区二区久久| 日本韩国欧美一区二区三区| 日韩一区二区免费在线电影| 中文字幕乱码一区二区免费| 亚洲成av人片| 成人午夜电影网站| 欧美一区日韩一区| 亚洲欧洲成人精品av97| 日韩av一区二区三区| 成人一级黄色片| 91精品久久久久久久久99蜜臂| 国产人成亚洲第一网站在线播放| 亚洲欧美日韩国产综合| 精品一区二区三区在线观看| 91久久精品一区二区| 日韩欧美二区三区| 亚洲综合另类小说| 视频在线在亚洲| 日本成人超碰在线观看| 99视频超级精品| 日韩欧美美女一区二区三区| 亚洲人成网站在线| 国产成人精品在线看| 欧美日韩不卡视频| 亚洲色欲色欲www在线观看| 激情av综合网| 欧美丰满少妇xxxbbb| 亚洲欧洲成人自拍| 国产精品一品视频| 日韩欧美国产三级| 无吗不卡中文字幕| 91精彩视频在线观看| 日本一区二区成人在线| 久久99精品久久久| 欧美精品久久久久久久久老牛影院| 国产精品久久久久国产精品日日| 极品美女销魂一区二区三区免费| 欧美三级在线视频| 国产精品乱子久久久久| 极品销魂美女一区二区三区| 欧美日韩成人一区| 亚洲午夜三级在线| 91麻豆福利精品推荐| 国产精品视频麻豆| 国产成人精品免费看| 久久只精品国产| 国内一区二区在线| 日韩欧美成人一区| 欧美bbbbb| 91精品国产日韩91久久久久久| 亚洲欧美日韩系列| 91一区二区在线观看| 国产精品久久久久毛片软件| 国产suv精品一区二区三区| 精品国产91乱码一区二区三区| 日韩中文字幕区一区有砖一区 | 国产一区二区女| 欧美va亚洲va在线观看蝴蝶网| 偷拍一区二区三区| 在线不卡中文字幕播放| 偷窥少妇高潮呻吟av久久免费| 欧洲另类一二三四区| 一区二区三区精品久久久| 色婷婷av一区二区| 亚洲码国产岛国毛片在线| 色菇凉天天综合网| 一区二区高清视频在线观看| 在线观看日产精品| 亚洲国产毛片aaaaa无费看| 欧美日韩在线免费视频| 日日摸夜夜添夜夜添国产精品| 欧美裸体bbwbbwbbw| 日本成人中文字幕| 26uuu色噜噜精品一区二区| 国产激情视频一区二区三区欧美| 中文字幕av资源一区| 99久久久免费精品国产一区二区| 中文字幕一区二区三区在线不卡| heyzo一本久久综合| 亚洲精品写真福利| 欧美精品三级日韩久久| 国内精品在线播放| 中文字幕一区二区三区四区不卡| 91黄色在线观看| 免费看日韩精品| 国产亚洲欧美日韩在线一区| eeuss鲁片一区二区三区 | 精品捆绑美女sm三区| 国产91在线|亚洲| 亚洲一区av在线| 久久综合狠狠综合久久综合88| 成人白浆超碰人人人人| 亚洲成av人综合在线观看| 精品国产乱码久久久久久闺蜜| 成人av午夜影院| 日韩电影免费在线看| 国产精品网站在线| 欧美日韩免费一区二区三区视频| 美女在线视频一区| 国产精品久久久久一区二区三区共| 欧美性感一区二区三区| 精品一区二区三区在线观看国产| 日韩理论片网站| 日韩精品一区二区在线观看| 成人丝袜视频网| 免费不卡在线视频| 中文字幕一区日韩精品欧美| 日韩视频一区二区| 91免费视频网| 国产在线一区二区| 一区二区三区日韩欧美| 久久综合狠狠综合久久激情| 色狠狠av一区二区三区| 国产久卡久卡久卡久卡视频精品| 一区二区三区在线视频观看58| 日韩精品中文字幕一区 | 91精品国产91热久久久做人人| 丰满少妇久久久久久久| 日韩精品一级二级| 亚洲人精品午夜| 国产色婷婷亚洲99精品小说| 欧美另类久久久品|