2

プログラムのファイルシステムの概念に取り組んでいます。私はJavaで書いています(JDK 7 u17を使用)。

はじめに、FileSystemProvider クラスを使用して zip ベースのファイルシステムを作成する方法を示すチュートリアルを作成しました。

コードを実行すると、デスクトップからテキスト ファイルをコピーして zip ファイルに配置する例と同様のタスクが実行されます。問題は、ファイルをコピーすると、zipファイルに書き込まれず、ファイルがメモリに残っているように見え、プログラムが終了すると破壊されることです。

問題は、すべてが順調に進んでいるように見えるのに、何かが明らかに間違っていると言える限り、その理由が理解できないことです。

そうそう、同じことがディレクトリにも当てはまります。ファイルシステムに新しいディレクトリを作成するように指示すると、メモリにディレクトリが作成されるだけで、zip ファイルには何もありません。

とにかく、ここに私の作業コードがあります。

import java.io.IOException;
import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class Start {

    public static void main(String[] args) {

        Map <String, String> env = new HashMap<>();
        env.put("create", "true");
        env.put("encoding", "UTF-8");

        FileSystem fs = null;

        try {
            fs = FileSystems.newFileSystem(URI.create("jar:file:/Users/Ian/Desktop/test.zip"), env);
        } catch (IOException e) {
            e.printStackTrace();
        }

        Path externalTxtFile = Paths.get("/Users/Ian/Desktop/example.txt");
        Path pathInZipFile = fs.getPath("/example.txt");

        try {
            Files.createDirectory(fs.getPath("/SomeDirectory"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (Files.exists(fs.getPath("/SomeDirectory"))) {
            System.out.println("Yes the directory exists in memory.");
        } else {
            System.out.println("What directory?");
        }       

        // Why is the file only being copied into memory and not written out the jar/zip archive?
        try {
            Files.copy(externalTxtFile, pathInZipFile);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // The file clearly exists just before the program ends, what is going on?
        if (Files.exists(fs.getPath("/example.txt"))) {
            System.out.println("Yes the file has been copied into memory.");
        } else {
            System.out.println("What file?");
        }

    }

}
4

1 に答える 1

0

何かを追加したいだけです。おそらく、あなたが見つけた例は不完全でした (参照していないため確認できません) が、すべての例で FileSystem インスタンスが適切に閉じられていることがわかりました。

FileSystem 抽象クラスは Closeable を実装しているため、close() メソッドが (自動的に) 呼び出され、次のコードに try が残されます。

try (final FileSystem fs = FileSystems.newFileSystem(theUri, env)) {
    /* ... do everything you want here ; do not need to call fs.close() ... */
}

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

于 2014-04-26T11:35:52.637 に答える