2

我将我的zip存档上传到服务器并希望打开.txt其中的.jpg文件。我成功地在我的控制器中获取了我的存档,并通过ZipEntry. 现在我想打开它,但为此我应该得到我的文件的完整路径。

我还没有找到如何做到这一点。你能建议一些方法来做到这一点吗?

更新

我尝试使用下面建议的示例,但我无法打开文件

ZipFile zFile = new ZipFile("trainingDefaultApp.zip");

我有FileNotFoundException

所以我回到我的起点。我在 Java Spring 应用程序中有上传表单。在控制器中,我有一个 zip 存档byte[]

@RequestMapping(method = RequestMethod.POST)
public String create(UploadItem uploadItem, BindingResult bindingResult){
    try {
        byte[] zip = uploadItem.getFileData().getBytes();
        saveFile(zip);

然后我得到了每个ZipEntry

    InputStream is = new ByteArrayInputStream(zip);
    ZipInputStream zis = new ZipInputStream(is);

    ZipEntry entry = null;
    while ((entry = zis.getNextEntry()) != null) {
        String entryName = entry.getName();
        if (entryName.equals("readme.txt")) {
            ZipFile zip = new ZipFile(entry.getName()); // here I had got an exception

根据文档,我做得很好,但对我来说,只传递文件名并怀疑你会成功打开文件很奇怪

4

2 回答 2

1

zipFile.getInputStream(ZipEntry entry)将为您返回特定条目的输入流。

查看javadocsZipFile.getInputStream() - http://docs.oracle.com/javase/6/docs/api/java/util/zip/ZipFile.html#getInputStream(java.util.zip.ZipEntry ) 。

更新:

我误读了你的问题。对于使用ZipInputStream,Oracle 网站 ( http://java.sun.com/developer/technicalArticles/Programming/compression/ ) 上的示例代码向您展示了如何从流中读取。请参阅第一个代码示例:代码

  • 示例 1:UnZip.java。

在这里复制,它是从条目中读取并将其直接写入文件,但您可以用您需要的任何逻辑替换它:

ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null) {
   System.out.println("Extracting: " +entry);
   int count;
   byte data[] = new byte[BUFFER];
   // write the files to the disk
   FileOutputStream fos = new FileOutputStream(entry.getName());
   dest = new 
   BufferedOutputStream(fos, BUFFER);

   while ((count = zis.read(data, 0, BUFFER)) != -1) {
        dest.write(data, 0, count);
   }
}
于 2012-06-13T14:04:25.423 回答
1

我解决了我的 uissue。解决方案是直接使用 ZipInputStream。这里的代码:

    private void saveFile(byte[] zip, String name, String description) throws IOException {
    InputStream is = new ByteArrayInputStream(zip);
    ZipInputStream zis = new ZipInputStream(is);

    Application app = new Application();
    ZipEntry entry = null;
    while ((entry = zis.getNextEntry()) != null) {
        String entryName = entry.getName();
        if (entryName.equals("readme.txt")) { 
           new Scanner(zis); //!!!
           //... 
           zis.closeEntry();
于 2012-06-14T11:27:56.703 回答