查看完整版本 : Java 7, 8, 9 新功能介紹 (不定期更新)

assembly.jc 2017-11-12 09:08 AM

Java 7, 8, 9 新功能介紹 (不定期更新)

在這個帖子,JC 希望能夠列舉並附例子說明 Java 7 以來,Java 加入的新功能、語法和變化。給自己做一個記錄。當中如有錯誤望各Ching 能夠指出。先謝各位。

當然,Java 7 以來,變化甚大,不可能一次過把所有的東西列出,所以採取愚公移山的方法,希望有朝一日能夠完成。

另,這裡所列的是以 OpenJDK 為準,有些功能未必有在 Android 實現,有關二者的差異,請自行參考 Android API。
Okay, Let Go!

[[i] 本帖最後由 assembly.jc 於 2017-11-24 07:32 PM 編輯 [/i]]

assembly.jc 2017-11-12 09:16 AM

1. String in switch
Java 7 以前,switch 只接受 integer 或 enum。如果以 String 為條件作比較,一定要用 if。如:[code]if(cmd.equals("show"))
    pl("Run show command");
else if(cmd.equals("append"))
    pl("Run append command");
else
    pl("Not a known command");[/code]Java 7 以後可寫成:[code]switch(cmd) {
    case "show":
        pl("Run show command"); break;
    case "append":
        pl("Run append command"); break;
    default:
        pl("Not a known command"); break;
}[/code]

[[i] 本帖最後由 assembly.jc 於 2017-11-12 04:54 PM 編輯 [/i]]

assembly.jc 2017-11-12 09:25 AM

2. Numeric Literals

將 2 進位數字放入 variable,Java 7 以前要用 parseInt(),由 String 轉為 int[code]int a = Integer.parseInt("1100110", 2);[/code]Java 7 以後,可以直接 assign to variable[code]int x = 0b1010;
int y = 0b0101;

pl("1010 + 0101 = " + (x + y));        
pl("1010 & 0101 = " + (x & y));        
pl("1010 | 0101 = " + (x | y));        [/code]另,一些很大的數字,如 1億,好易打少個 0,Java 7 以後可用 _ underscore 分隔,如: 100,000,000,可直接寫成:[code]int longLenNum = 100_000_000;[/code]

[[i] 本帖最後由 assembly.jc 於 2017-11-12 04:50 PM 編輯 [/i]]

assembly.jc 2017-11-12 09:38 AM

3. Multiple Catch

如果同一個操作 handles 唔同 Exceptions (IOException, SQLException),Java 7 以前重覆 coding 無可避免,如[code]try {
    readData(path);
} catch(IOException ie) {
    pl("IO error");
} catch(SQLException se) {
    pl("IO error");
} catch(IllegalArgumentException ae)
    pl("Invalid path: " + path);
}[/code]Java 7[code]try {
    readData(path);
// catch multi exceptions in one line
} catch(IOException | SQLException e) {
    pl("IO Error");        
} catch (IllegalArgumentException e){
    pl("Invalid path");        
}[/code]

[[i] 本帖最後由 assembly.jc 於 2017-11-12 04:57 PM 編輯 [/i]]

assembly.jc 2017-11-12 10:15 AM

4 Rethrow Exception

假如有個 method 會 throw 不同的 Checked Exceptions 如:[code]void readData(final String source) throws SQLException, IOException {
    if(source == "file")
        throw new IOException();
    else if (source == "db")
        throw new SQLException();
    else
        throw new IllegalArgumentException();
}[/code]Call readData method,記錄 exception 之後,再 re-throw,Java 7 之前,因 throws clause 一定要和 catch clause 對應,所以唔可以指明是 IOException 和 SQLException,即 IOException 和 SQLException 被 rethrowException() method 隱藏了 如:[code]void rethrowException() throws Exeption {
    try {
        readData("db");
    } catch(Exception e) {
        logError(e);
        throw(e);
    }
}[/code]Java 7 以後,throws clause 要和 catch clause 的對應放寬了,所以以下寫法是合法的, IOException 和 SQLException 也不會被 rethrowException() method 隱藏[code]void rethrowException() throws SQLException, IOException {
    try {
        readData("db");
    } catch(Exception e) {
        logError(e);
        throw(e);
    }
}[/code]

[[i] 本帖最後由 assembly.jc 於 2017-11-12 05:00 PM 編輯 [/i]]

assembly.jc 2017-11-12 04:41 PM

5 Diamond syntax

Java 6,generic type declare 有時可增加可讀性,但有時就顯得累贅,如:[code]Map<Integer, List<String>> namesMap = new HashMap<Integer, List<String>>();[/code]Java 7, 可簡化為[code]Map<Integer, List<String>> namesMap = new HashMap<>();[/code]

form5 2017-11-13 11:35 PM

J9 interface 真係好核突,好彩C# 有所克制

Susan﹏汪汪 2017-11-13 11:52 PM

[quote]原帖由 [i]form5[/i] 於 2017-11-13 11:35 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470835097&ptid=27052912][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
J9 interface 真係好核突,好彩C# 有所克制 [/quote]
有咩分別?

C#的interface只係半成品
Java冇寫過唔清楚

[[i] 本帖最後由 Susan﹏汪汪 於 2017-11-13 11:53 PM 編輯 [/i]]

煙民母親生賤種 2017-11-14 01:32 AM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-13 11:52 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470835901&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

有咩分別?

C#的interface只係半成品
Java冇寫過唔清楚 [/quote]點為之半成品??

interface 本身就只係一個接口, 洗乜成品? 你到底有無寫過程式?? :fst_003:

assembly.jc 2017-11-14 02:12 AM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-13 11:52 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470835901&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

有咩分別?

C#的interface只係半成品
Java冇寫過唔清楚 [/quote]

[quote]原帖由 [i]form5[/i] 於 2017-11-13 11:35 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470835097&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
J9 interface 真係好核突,好彩C# 有所克制 [/quote]

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2017-11-14 01:32 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470839393&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
點為之半成品??

interface 本身就只係一個接口, 洗乜成品? 你到底有無寫過程式?? :fst_003: [/quote]

是指 Interface private method 吧。各位 ching 絲打,請移玉步到新帖討論。Thanks.


[url=http://computer.discuss.com.hk/viewthread.php?tid=27056751&extra=page%3D1]http://computer.discuss.com.hk/viewthread.php?tid=27056751&extra=page%3D1[/url]

[[i] 本帖最後由 assembly.jc 於 2017-11-14 02:25 AM 編輯 [/i]]

assembly.jc 2017-11-19 01:35 PM

6. AutoCloseable[code]ClosedState state = new ClosedState();
try (CloseableClass closeObject = new CloseableClass(state)) {
    closeObject.run();  
} catch(Exception e) {
    System.out.println("Error occurred");
    state.printClose();
}[/code]在 try(...) 開啟的 resource,在 try block 完結時,或發生 exception 離開 try block 時,會自動 call close() method。

以下是 CloseableClass 和 ClosedState source code:[code]private static class CloseableClass implements AutoCloseable {
    public CloseableClass(ClosedState state) {
        System.out.println("Opening...");
        this.state = state;
        this.state.closed = false;
        state.printClose();
        throwException("Throw exception when open");
    }

    public void run() {
        System.out.println("Running...");
        throwException("Throw exception when running? ");
    }

    @Override public void close() {
        this.state.closed = true;
        state.printClose();
    }

    private void throwException(String msg) {
        System.out.println(msg);

        Scanner in = new Scanner(System.in);
        String yn = in.nextLine();
        if(yn.toLowerCase().equals("y"))
            throw new RuntimeException();
    }

    private ClosedState state;
}

private static class ClosedState {
    public boolean closed;

    public void printClose() {
        System.out.println("Is Closed? " + closed);
    }
}[/code]如果在 run() method throw exception,可正常關閉。如在 CloseableClass 的 Constructor 發生異常,CloseableClass 的 close() 不會自動執行。

[[i] 本帖最後由 assembly.jc 於 2017-11-21 05:06 PM 編輯 [/i]]

assembly.jc 2017-11-21 05:13 PM

7. NIO.2

Java I/O 在 1.4 時加強稱 NIO (new IO, JSR 51), 包括
1. buffer
2. Channels
3. Selectors
4. Regex
5. Charsets

Java 7 自 1.4 後再有比較大的變化,名為 NIO.2,即 NIO 2.0, 包括
1. Asynchronous I/O
2. Socket Channel
3.Helper class to access file system.

[[i] 本帖最後由 assembly.jc 於 2017-11-21 05:24 PM 編輯 [/i]]

assembly.jc 2017-11-21 10:22 PM

7.1.1 NIO.2 File Attributes

Java 7 之前,Java API 沒有File System 的概念,File Object 只能存取簡單的檔案屬性。Java 7 在這方面做了改善。根據唔到 File System implements 唔同的 interfaces 去存取 system-dependent 的屬性。詳情可參考 [url=https://docs.oracle.com/javase/7/docs/api/java/nio/file/attribute/package-summary.html]https://docs.oracle.com/javase/7/docs/api/java/nio/file/attribute/package-summary.html[/url]

以下這個 program 在 windows 和 linux 會有不同的結果:[code]import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.DosFileAttributes;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.BasicFileAttributes;

public class NIO2 {
    public static void main(String[] args) throws Exception {
        readFileAttr();
    }

    private static void readFileAttr() throws Exception {
        DosFileAttributes dosAttr = readAttributes(
            ".", DosFileAttributes.class
        );
        if(dosAttr != null) {
            pl("isArchive: " + dosAttr.isArchive());
            pl("isSystem: " + dosAttr.isSystem());
        }
        
        PosixFileAttributes posixAttr = readAttributes(
            ".", PosixFileAttributes.class
        );
        if(posixAttr != null) {
            pl("owner: " + posixAttr.owner());
            pl("group: " + posixAttr.group());
        }
    }

    private static  A readAttributes(
        String path, Class clazz
    ) throws Exception {
        try {
            return(Files.readAttributes(Paths.get(path), clazz));
        } catch(UnsupportedOperationException e) {
            return(null);
        }
    }

    private static void pl(Object obj) {
        System.out.println(obj.toString());
    }
}[/code]

[[i] 本帖最後由 assembly.jc 於 2017-11-24 01:29 PM 編輯 [/i]]

Qoo記 2017-11-21 10:50 PM

AutoCloseabl用try with resource好似冇咩so
照寫番平時都夠
叫做拎黎提人要close

assembly.jc 2017-11-22 12:19 AM

[quote]原帖由 [i]Qoo記[/i] 於 2017-11-21 10:50 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=471259227&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
AutoCloseabl用try with resource好似冇咩so
照寫番平時都夠
叫做拎黎提人要close [/quote]

主要是防止開啟資源,離開時沒有關閉。而且 coding 較短。概念都是從其他語言借過來的。
但這種寫法都有要留意的地方:
1. close() method 如果 throw exception,不會傳去 caller,會默默地被隱藏。
2. 以下例子,如 InputStreamReader throw exception,開啟了的 FileInputStream 不會被關閉。[code]try (BufferedReader in = new BufferedReader(InputStreamReader(new FileInputerStream("path")), "UTF-8") {...}[/code]

McLoneV 2017-11-22 12:50 AM

[quote]原帖由 [i]Qoo記[/i] 於 2017-11-21 10:50 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=471259227&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
AutoCloseabl用try with resource好似冇咩so
照寫番平時都夠
叫做拎黎提人要close [/quote]
舊時要用finally close嘛..

assembly.jc 2017-11-24 07:29 PM

7.2 NIO.2 FileSystem

之前說,Java 7 之後 NIO 有 File System 的概念,有點誇大。實際上只是對 IO 的操作以 FileSystem Interface 作為起點,劃分不同的功能而已。

一如以往,為了 encapsulation,FileSystem 的實作不在 Public API 公開。作為用戶,好處是無須理會目前運行的是什麼平台。只要執行以下程式碼,便可取得相應的 FileSystem 實作:[code]FileSystem fs = FileSystems.getDefault();[/code]如果檢視 JDK 的 source code,可知 Java 7 己經只實作了好幾個 FileSystem。如:WindowFileSystem,LinuxFileSystem, MacOSFileSystem, SolarisFileSystem 等等。[url=http://hg.openjdk.java.net/jdk7u/jdk7u60/jdk/file/33c1eee28403/src/solaris/classes/sun/nio/fs]http://hg.openjdk.java.net/jdk7u/jdk7u60/jdk/file/33c1eee28403/src/solaris/classes/sun/nio/fs[/url]

FileSystem 對應著平台,而 FileStore 則勉強可以說是對應著每個儲存的實體,如 Hard-disk, Floppy, USB Disk, DVD 等等。可透過 FileSystem instance 得到。[code]Iterable stores = FileSystems.getDefault().getFileStores();[/code]如在 windows 環境下,有 C, D 和 USB drives,就會得到 3 個 FileStore Objects。以下例子列舉 FileStore 的名稱 (有可能是 empty string),File System type 和大小。[code]for(FileStore store : FileSystems.getDefault().getFileStores())
    P.ln(String.format(
        "%s: %s (%d MB)", store.name(), store.type(),
        store.getTotalSpace() / (1024 * 1024)
    ));[/code]

[[i] 本帖最後由 assembly.jc 於 2017-11-25 01:34 PM 編輯 [/i]]

assembly.jc 2017-11-25 01:44 PM

7.3.1 NIO.2 File and Path

Java7 API doc 說得好([url=https://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html]https://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html[/url]): Path 是
[quote]An object that may be used to locate a file in a file system. It will typically represent a system dependent file path[/quote]
所以NIO 的 File (interface) 不再用 String 去 locate files or directories。如何定義和轉換各種「路徑」的語法和方法都集中到 Path object 去。這是 Single responsibility principle 體現。

assembly.jc 2017-11-26 02:20 AM

7.3.2 簡單 File IO

Java 7 之前,簡單的IO動作,如讀取細小文字檔案,都必須透過 open stream, read 和 close 步驟,中間還要夾雜著 exception handling。Java 7 NIO 為此提供簡單的IO 存取 methods。

讀取 binary file[code]byte[] content = Files.readAllBytes(Paths.get("path_to_file"));[/code]讀取 text file[code]List lines = Files.readAllLines(Paths.get("path_to_file", Charset.forName("ISO-8859-1")));[/code]寫入 binary file[code]byte[] data = ...
Files.write(Paths.get("path_to_file"), data);[/code]寫入 text file[code]List lines = ...
Files.write(Paths.get("path_to_file"), lines, Charset.forName("ISO-8859-1"));[/code]

煙民母親生賤種 2017-11-26 03:40 AM

[quote]原帖由 [i]assembly.jc[/i] 於 2017-11-26 02:20 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=471461478&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
7.3.2 簡單 File IO

Java 7 之前,簡單的IO動作,如讀取細小文字檔案,都必須透過 open stream, read 和 close 步驟,中間還要夾雜著 exception handling。Java 7 NIO 為此提供簡單的IO 存取 methods。

讀取 b ... [/quote]
呢個.net 一早有。最好用係 text[] = file.readlines()

assembly.jc 2017-11-26 05:23 PM

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2017-11-26 03:40 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=471462932&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

呢個.net 一早有。最好用係 text[] = file.readlines() [/quote]

Java 7 推出左都 6 年了。即是 6 年前已經有。另,.net 有無 api 處理 symbolic link ?

assembly.jc 2017-12-29 04:57 PM

7.3.3 Walk File Tree

繼續 Java 7 簡化 File Operation 的介紹。File.walkFileTree() method 用 call-back 的方式走訪 Path 指定的 File Tree 每一個 Nodes (Directory or file)。一個簡單的例子,Recursively lists 所有的 file's names。[code]public class ListPath extends SimpleFileVisitor {
    public static void main(String[] args) throws Exception {
        Files.walkFileTree(Paths.get(args[0]), new ListPath());
    }
   
    @Override public FileVisitResult visitFile(
        Path path, BasicFileAttributes attrs
    ) throws java.io.IOException {
        System.out.println(path.toAbsolutePath().normalize());
        return(FileVisitResult.CONTINUE);
    }
}[/code]配搭 grep 可 recursively 找尋想要的 files by name[code]java ListPath . | grep -i pattern_of_file_name [/code]

[[i] 本帖最後由 assembly.jc 於 2017-12-29 05:03 PM 編輯 [/i]]

Susan﹏汪汪 2017-12-29 05:08 PM

[quote]原帖由 [i]assembly.jc[/i] 於 2017-12-29 04:57 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=473014749&ptid=27052912][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
7.3.3 Walk File Tree

繼續 Java 7 簡化 File Operation 的介紹。File.walkFileTree() method 用 call-back 的方式走訪 Path 指定的 File Tree 每一個 Nodes (Directory or file)。一個簡單的例子,Recursively l ... [/quote]
File.walkFileTree會唔會resolve symbol link?

Susan﹏汪汪 2017-12-29 05:20 PM

照睇應該唔會自動resolve symbol link

[url]http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/nio/file/Files.java#Files.walkFileTree%28java.nio.file.Path%2Cjava.util.Set%2Cint%2Cjava.nio.file.FileVisitor%29[/url][code]public static Path More ...walkFileTree(Path start,
2649                                    Set<FileVisitOption> options,
2650                                    int maxDepth,
2651                                    FileVisitor<? super Path> visitor)
2652        throws IOException
2653    {
        
Create a FileTreeWalker to walk the file tree, invoking the visitor for each event.
2657
2658        try (FileTreeWalker walker = new FileTreeWalker(options, maxDepth)) {
2659            FileTreeWalker.Event ev = walker.walk(start);
2660            do {
2661                FileVisitResult result;
2662                switch (ev.type()) {
2663                    case ENTRY :
2664                        IOException ioe = ev.ioeException();
2665                        if (ioe == null) {
2666                            assert ev.attributes() != null;
2667                            result = visitor.visitFile(ev.file(), ev.attributes());
2668                        } else {
2669                            result = visitor.visitFileFailed(ev.file(), ioe);
2670                        }
2671                        break;
2672
2673                    case START_DIRECTORY :
2674                        result = visitor.preVisitDirectory(ev.file(), ev.attributes());
2675
2676                        // if SKIP_SIBLINGS and SKIP_SUBTREE is returned then
2677                        // there shouldn't be any more events for the current
2678                        // directory.
2679                        if (result == FileVisitResult.SKIP_SUBTREE ||
2680                            result == FileVisitResult.SKIP_SIBLINGS)
2681                            walker.pop();
2682                        break;
2683
2684                    case END_DIRECTORY :
2685                        result = visitor.postVisitDirectory(ev.file(), ev.ioeException());
2686
2687                        // SKIP_SIBLINGS is a no-op for postVisitDirectory
2688                        if (result == FileVisitResult.SKIP_SIBLINGS)
2689                            result = FileVisitResult.CONTINUE;
2690                        break;
2691
2692                    default :
2693                        throw new AssertionError("Should not get here");
2694                }
2695
2696                if (Objects.requireNonNull(result) != FileVisitResult.CONTINUE) {
2697                    if (result == FileVisitResult.TERMINATE) {
2698                        break;
2699                    } else if (result == FileVisitResult.SKIP_SIBLINGS) {
2700                        walker.skipRemainingSiblings();
2701                    }
2702                }
2703                ev = walker.next();
2704            } while (ev != null);
2705        }
2706
2707        return start;
2708    }[/code]汪汪之前也寫過相同的功能
會search埋symbol link (macOS有UNIX的SymbolicLink和System 7的AliasFile兩種)

[url]https://github.com/SusanDoggie/Doggie/blob/master/Sources/Doggie/Foundation/FileManager.swift[/url]

有一點需要注意的係, resolve symbol link有機會無限loop
所以一定要有checking

assembly.jc 2017-12-29 06:54 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-12-29 05:08 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=473015169&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

File.walkFileTree會唔會resolve symbol link? [/quote]

API doc: default 唔會,如要 resolve symbol link, 要加 FileVisitOption.FOLLOW_LINKS。

[quote]
By default, symbolic links are not automatically followed by this method. If the options parameter contains the [url=https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileVisitOption.html#FOLLOW_LINKS]FOLLOW_LINKS[/url] option then symbolic links are followed. When following links, ....

If the options parameter contains the [url=https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileVisitOption.html#FOLLOW_LINKS]FOLLOW_LINKS[/url] option then this method keeps track of directories visited so that cycles can be detected. A cycle arises when there is an entry in a directory that is an ancestor of the directory. Cycle detection is done by recording the [url=https://docs.oracle.com/javase/7/docs/api/java/nio/file/attribute/BasicFileAttributes.html#fileKey()]file-key[/url] of directories, or if file keys are not available, by invoking the [url=https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#isSameFile(java.nio.file.Path,%20java.nio.file.Path)]isSameFile[/url] method to test if a directory is the same file as an ancestor. When a cycle is detected it is treated as an I/O error, and the [url=https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileVisitor.html#visitFileFailed(T,%20java.io.IOException)]visitFileFailed[/url] method is invoked with an instance of [url=https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileSystemLoopException.html]FileSystemLoopException[/url].
[/quote]
[url=https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path,%20java.util.Set,%20int,%20java.nio.file.FileVisitor)]https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path,%20java.util.Set,%20int,%20java.nio.file.FileVisitor)[/url]

assembly.jc 2017-12-29 06:58 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-12-29 05:20 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=473015672&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
照睇應該唔會自動resolve symbol link

[url=http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/nio/file/Files.java#Files.walkFileTree%28java.nio.file.Path%2Cjava.util.Set%2C]http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/nio/file/Files.java#Files.walkFileTree%28java.nio.file.Path%2Cjava.util.Set%2C[/url] ... [/quote]

Visit 動作應該在 FileTreeWalker 内實現
[url=http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/nio/file/FileTreeWalker.java#FileTreeWalker.next%28%29]http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/nio/file/FileTreeWalker.java#FileTreeWalker.next%28%29[/url]

Susan﹏汪汪 2017-12-29 07:09 PM

[quote]原帖由 [i]assembly.jc[/i] 於 2017-12-29 06:54 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=473020027&ptid=27052912][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


API doc: default 唔會,如要 resolve symbol link, 要加 FileVisitOption.FOLLOW_LINKS。


https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#walkFileTree(java.nio.file.Path,%20java ... [/quote]
係就奇怪了

汪汪就係見唔到佢有一條list record 路徑
遇著circular reference的話會stack overflow

Susan﹏汪汪 2017-12-29 07:11 PM

原來有checking

[code]Returns true if walking into the given directory would result in a file system loop/cycle.
235
236    private boolean More ...wouldLoop(Path dir, Object key) {
237        // if this directory and ancestor has a file key then we compare
238        // them; otherwise we use less efficient isSameFile test.
239        for (DirectoryNode ancestor: stack) {
240            Object ancestorKey = ancestor.key();
241            if (key != null && ancestorKey != null) {
242                if (key.equals(ancestorKey)) {
243                    // cycle detected
244                    return true;
245                }
246            } else {
247                try {
248                    if (Files.isSameFile(dir, ancestor.directory())) {
249                        // cycle detected
250                        return true;
251                    }
252                } catch (IOException | SecurityException x) {
253                    // ignore
254                }
255            }
256        }
257        return false;
258    }[/code]

form5 2017-12-30 01:00 AM

[quote]原帖由 [i]assembly.jc[/i] 於 2017-11-26 05:23 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=471486629&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]


Java 7 推出左都 6 年了。即是 6 年前已經有。另,.net 有無 api 處理 symbolic link ? [/quote]

For those people using mac or linux with C#,
one may add mono posix assembly to your project,
and  checking symbolic link using   "UnixSymbolicLinkInfo.GetFileSystemEntry(path)",
that is also working for dotnet core by switching to dotnet standard mono posix assembly
Xamarin can work on iOS, Android linux I don't think java is capable regarding cross platform. :smile_30:

[[i] 本帖最後由 form5 於 2017-12-30 01:01 AM 編輯 [/i]]

form5 2017-12-30 01:32 AM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-12-29 05:20 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=473015672&ptid=27052912][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
照睇應該唔會自動resolve symbol link

[url=http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/nio/file/Files.java#Files.walkFileTree%28java.nio.file.Path%2Cjava.util.Set%2C]http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/nio/file/Files.java#Files.walkFileTree%28java.nio.file.Path%2Cjava.util.Set%2C[/url] ... [/quote]
冇記錯的話Unix 得两種symbolic link,soft 同hard,  hard 係吾會link 到directory, 祗有soft 可以,
walktree之類api都吾應該用啦, 祗要其中一個 unauthorized folder,或者有問題嘅folder ,成個 loop 無啦啦有exception 停左, 都吾知還有幾多未做, 不嬲應該一個一個人手走一次。呢類api 似陷阱多啲
頁: [1] 2
查看完整版本: Java 7, 8, 9 新功能介紹 (不定期更新)