Table of contents


Path

之前java.io的基本操作是基於File,NIO的基本操作是Path。 Path

兩者間可以透過Path.toFile(),File.toPath()互相轉換,Path雖然可以完成很多java.io.File的操作,但因為java.io.File具有一些操作是Path沒辦法做的,所以,java.io.File並沒有被deprecate

aPath.resolve(bPath) - bPath會串接在aPath後面,結果會是 aPath/bPath

如果不想看了解細節,可以在了解Path後,可以先試著用用看io跟nio的轉換表來使用NIO http://docs.oracle.com/javase/tutorial/essential/io/legacy.html#mapping http://docs.oracle.com/javase/tutorial/essential/io/legacy.html#mapping”)

Paths

多重目錄
Path path = Paths.get("myPath", "subPathA", "subPathB"); // myPath/subPathA/subPathB

環境變數

Path並不直接支援環境變數(Environment Variable)的使用,所以,需要自行透過System.getProperty()取出變數後,丟進path

Path downloadedFile = Paths.get(System.getProperty("user.home"),"downloads", "test.txt");

Files

讀入文字檔
List<String> lines = Files.readAllLines(path,Charset.forName("UTF-8"));

列出目錄下的子目錄或檔案

這邊的try-catch是java7的新功能,只要有實作Closeable的類別,就可以用這樣的方式處理。

Path dir = ...;
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{java,class,jar}")) {
    for (Path entry: stream) {
        System.out.println(entry.getFileName());
    }
} catch (IOException x) {
    //IOException can never be thrown by the iteration.
    //In this snippet, it can only be thrown by newDirectoryStream.
    System.err.println(x);
}

MISC

雖然 Windows 沒有 Symbolic, Hard Links 但在程式中還是可以使用,NIO會處理跨平台的相容性。 Symbolic 會用 Windows 中的 Shortcut取代。

從jar檔中取得Path

在程式中,常用url = myObject.getClass().getResource(“my.txt”)取得檔案的url,然後直接使用裡面的資訊取得File或Stream,Path的話,可以這樣用Path.get(url.toURI()), 但這個在預設的檔案系統下可以行的通,但程式被包成時jar檔行不通了,因為jar檔在NIO里是另一個FileSystem,以下的method, 可以不用管resource是放jar或直接放classpath裡面,都以把resource抓成Path,抓成Path後,file system的資訊會被包在Path中,所以再來就可以不用管他是不是在jar裡面了

public static Path urlToPath(URL buildUrl) throws URISyntaxException, IOException {
    Path result;
        if ("jar".equalsIgnoreCase(buildUrl.toURI().getScheme())) {
        JarURLConnection jarUrl = (JarURLConnection) buildUrl.openConnection();
        FileSystem fs = FileSystems.newFileSystem(Paths.get(jarUrl.getJarFileURL().toURI()), null);
        result = fs.getPath(jarUrl.getEntryName());
        logger.info("load {} from jar : {}", result.getFileName(),fs);
    } else {
        result = Paths.get(buildUrl.toURI());
        logger.info("load {} from : {}", result.getFileName() ,buildUrl);
    }
    return result;
}

Resource