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

私の問題を解決します。解決策は、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 に答える
1

zipFile.getInputStream(ZipEntry entry)特定のエントリの入力ストリームを返します。

http://docs.oracle.com/javase/6/docs/api/java/util/zip/ZipFile.html#getInputStream(java.util.zip.ZipEntry)javadocを確認してください。ZipFile.getInputStream()

アップデート:

私はあなたの質問を読み違えました。を使用するためZipInputStreamに、Oracle の Web サイト ( 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 に答える