2014-10-19 42 views
0

我需要从* .zip获取文件作为字节数组。我这样做从ZIP文件获取字节[]

String zipFileLocation = pathToFile; 


File file = new File(zipFileLocation); 
ZipFile zipfile = new ZipFile(file); 

ZipEntry zipentry; 

System.out.println("nList of files in zip archive"); 
int fileNumber = 0; 
for (Enumeration<? extends ZipEntry> e = zipfile.entries(); 
e.hasMoreElements(); fileNumber++) { 
zipentry = e.nextElement(); 

if (!zipentry.isDirectory()) { 
    System.out.println(fileNumber + "-" + zipentry.getName()); 
} 
} 

for (Enumeration<? extends ZipEntry> e = zipfile.entries(); e.hasMoreElements();) { 
zipentry = e.nextElement(); 
if (!zipentry.isDirectory()) { 
    fileName = zipentry.getName(); 
InputStream input = zipfile.getInputStream(zipentry); 
BufferedReader br = new BufferedReader(new InputStreamReader(input, "UTF-8")); 
(hash map) nameANDbytes.put(fileName, br.toString().getBytes()); 
} 

可以说,我得到

[[email protected] 

但是当我解压缩文件,然后执行:

String pathToCheckingFile = "path_to_file"; 
     byte[] b = {}; 
     try { 
     RandomAccessFile f = new RandomAccessFile(pathToCheckingFile, "r"); 
     b = new byte[(int) f.length()]; 
     f.read(b); 
    }catch(FileNotFoundException e) { 
     e.printStackTrace(); 
    }catch(IOException e) { 
     e.printStackTrace(); 
    } 

     System.out.println(b); 

我得到:

[[email protected] 

什么问题?

此外,如果我做了几次代码片段 - 我总是ged不同的结果。

+0

它们指向不同的字节数组,即全部。你应该检查两个数组的实际内容是什么。 – Tom 2014-10-19 10:01:50

回答

2

您可以使用下面的代码来获取字节或字符串:

public static void main(String[] args) throws IOException { 
    ZipFile zipFile = new ZipFile("C:/Test/Test.zip"); 
    Enumeration<? extends ZipEntry> entries = zipFile.entries(); 

    while(entries.hasMoreElements()){ 
     ZipEntry entry = entries.nextElement(); 
     System.out.println(entry.getName()); 
     InputStream stream = zipFile.getInputStream(entry); 

     //For characters 
     //BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); 
     BufferedInputStream reader = new BufferedInputStream(stream); 
     //For line reading 
     //System.out.println(reader.readLine()); 
     int byteRead = reader.read(); 
     while(byteRead != -1) { 
      System.out.println(byteRead); 
      byteRead = reader.read(); 
     } 

    } 
} 

你所看到的一个很简单,就是被实例化每次运行它和toString代表的无符号十六进制表示时间对象对象的哈希码

+0

非常感谢您 – RedCollarPanda 2014-10-19 11:27:37

0

BufferedReader.toString()不执行任何I/O。如果你想要流的内容,你必须阅读它们。 BufferedReader不适合反正,除非你知道该文件是文本。

+0

如何从BufferedReader读取byte []? – RedCollarPanda 2014-10-19 10:09:00