国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Java文件IO操作應(yīng)該拋棄File擁抱Path和Files

2019-11-15 00:03:21
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
java文件IO操作應(yīng)該拋棄File擁抱Path和Files

Java7中文件IO發(fā)生了很大的變化,專(zhuān)門(mén)引入了很多新的類(lèi):

import java.nio.file.DirectoryStream;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.nio.file.attribute.FileAttribute;import java.nio.file.attribute.PosixFilePermission;import java.nio.file.attribute.PosixFilePermissions;

......等等,來(lái)取代原來(lái)的基于java.io.File的文件IO操作方式.

1. Path就是取代File的

A Path rePResents a path that is hierarchical and composed of a sequence of directory and file name elements separated by a special separator or delimiter.

Path用于來(lái)表示文件路徑和文件。可以有多種方法來(lái)構(gòu)造一個(gè)Path對(duì)象來(lái)表示一個(gè)文件路徑,或者一個(gè)文件:

1)首先是final類(lèi)Paths的兩個(gè)static方法,如何從一個(gè)路徑字符串來(lái)構(gòu)造Path對(duì)象:

        Path path = Paths.get("C:/", "Xmp");        Path path2 = Paths.get("C:/Xmp");                URI u = URI.create("file:///C:/Xmp/dd");                Path p = Paths.get(u);

2)FileSystems構(gòu)造:

Path path3 = FileSystems.getDefault().getPath("C:/", "access.log");

3)File和Path之間的轉(zhuǎn)換,F(xiàn)ile和URI之間的轉(zhuǎn)換:

        File file = new File("C:/my.ini");        Path p1 = file.toPath();        p1.toFile();        file.toURI();

4)創(chuàng)建一個(gè)文件:

        Path target2 = Paths.get("C://mystuff.txt");//      Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-rw-rw-");//      FileAttribute<Set<PosixFilePermission>> attrs = PosixFilePermissions.asFileAttribute(perms);        try {            if(!Files.exists(target2))                Files.createFile(target2);        } catch (IOException e) {            e.printStackTrace();        }

windows下不支持PosixFilePermission來(lái)指定rwx權(quán)限。

5)Files.newBufferedReader讀取文件:

        try {//            Charset.forName("GBK")            BufferedReader reader = Files.newBufferedReader(Paths.get("C://my.ini"), StandardCharsets.UTF_8);            String str = null;            while((str = reader.readLine()) != null){                System.out.println(str);            }        } catch (IOException e) {            e.printStackTrace();        }

可以看到使用 Files.newBufferedReader 遠(yuǎn)比原來(lái)的FileInputStream,然后BufferedReader包裝,等操作簡(jiǎn)單的多了。

這里如果指定的字符編碼不對(duì),可能會(huì)拋出異常 MalformedInputException ,或者讀取到了亂碼:

java.nio.charset.MalformedInputException: Input length = 1    at java.nio.charset.CoderResult.throwException(CoderResult.java:281)    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)    at java.io.InputStreamReader.read(InputStreamReader.java:184)    at java.io.BufferedReader.fill(BufferedReader.java:161)    at java.io.BufferedReader.readLine(BufferedReader.java:324)    at java.io.BufferedReader.readLine(BufferedReader.java:389)    at com.coin.Test.main(Test.java:79)

6)文件寫(xiě)操作:

        try {            BufferedWriter writer = Files.newBufferedWriter(Paths.get("C://my2.ini"), StandardCharsets.UTF_8);            writer.write("測(cè)試文件寫(xiě)操作");            writer.flush();            writer.close();        } catch (IOException e1) {            e1.printStackTrace();        }

7)遍歷一個(gè)文件夾:

        Path dir = Paths.get("D://webworkspace");        try(DirectoryStream<Path> stream = Files.newDirectoryStream(dir)){            for(Path e : stream){                System.out.println(e.getFileName());            }        }catch(IOException e){                    }
        try (Stream<Path> stream = Files.list(Paths.get("C:/"))){            Iterator<Path> ite = stream.iterator();            while(ite.hasNext()){                Path pp = ite.next();                System.out.println(pp.getFileName());            }        } catch (IOException e) {            e.printStackTrace();        }

上面是遍歷單個(gè)目錄,它不會(huì)遍歷整個(gè)目錄。遍歷整個(gè)目錄需要使用:Files.walkFileTree

8)遍歷整個(gè)文件目錄:

    public static void main(String[] args) throws IOException{        Path startingDir = Paths.get("C://apache-tomcat-8.0.21");        List<Path> result = new LinkedList<Path>();        Files.walkFileTree(startingDir, new FindJavaVisitor(result));        System.out.println("result.size()=" + result.size());            }        private static class FindJavaVisitor extends SimpleFileVisitor<Path>{        private List<Path> result;        public FindJavaVisitor(List<Path> result){            this.result = result;        }        @Override        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs){            if(file.toString().endsWith(".java")){                result.add(file.getFileName());            }            return FileVisitResult.CONTINUE;        }    }

2. 強(qiáng)大的java.nio.file.Files

1)創(chuàng)建目錄和文件:

        try {            Files.createDirectories(Paths.get("C://TEST"));            if(!Files.exists(Paths.get("C://TEST")))                    Files.createFile(Paths.get("C://TEST/test.txt"));//            Files.createDirectories(Paths.get("C://TEST/test2.txt"));        } catch (IOException e) {            e.printStackTrace();        }

注意創(chuàng)建目錄和文件Files.createDirectories 和 Files.createFile不能混用,必須先有目錄,才能在目錄中創(chuàng)建文件。

2)文件復(fù)制:

從文件復(fù)制到文件:Files.copy(Path source, Path target, CopyOption options);

從輸入流復(fù)制到文件:Files.copy(InputStream in, Path target, CopyOption options);

從文件復(fù)制到輸出流:Files.copy(Path source, OutputStream out);

        try {            Files.createDirectories(Paths.get("C://TEST"));            if(!Files.exists(Paths.get("C://TEST")))                    Files.createFile(Paths.get("C://TEST/test.txt"));//          Files.createDirectories(Paths.get("C://TEST/test2.txt"));            Files.copy(Paths.get("C://my.ini"), System.out);            Files.copy(Paths.get("C://my.ini"), Paths.get("C://my2.ini"), StandardCopyOption.REPLACE_EXISTING);            Files.copy(System.in, Paths.get("C://my3.ini"), StandardCopyOption.REPLACE_EXISTING);        } catch (IOException e) {            e.printStackTrace();        }

3)遍歷一個(gè)目錄和文件夾上面已經(jīng)介紹了:Files.newDirectoryStream , Files.walkFileTree

4)讀取文件屬性:

            Path zip = Paths.get(uri);            System.out.println(Files.getLastModifiedTime(zip));            System.out.println(Files.size(zip));            System.out.println(Files.isSymbolicLink(zip));            System.out.println(Files.isDirectory(zip));            System.out.println(Files.readAttributes(zip, "*"));

5)讀取和設(shè)置文件權(quán)限:

            Path profile = Paths.get("/home/digdeep/.profile");            PosixFileAttributes attrs = Files.readAttributes(profile, PosixFileAttributes.class);// 讀取文件的權(quán)限            Set<PosixFilePermission> posixPermissions = attrs.permissions();            posixPermissions.clear();            String owner = attrs.owner().getName();            String perms = PosixFilePermissions.toString(posixPermissions);            System.out.format("%s %s%n", owner, perms);                        posixPermissions.add(PosixFilePermission.OWNER_READ);            posixPermissions.add(PosixFilePermission.GROUP_READ);            posixPermissions.add(PosixFilePermission.OTHERS_READ);            posixPermissions.add(PosixFilePermission.OWNER_WRITE);                        Files.setPosixFilePermissions(profile, posixPermissions);    // 設(shè)置文件的權(quán)限

Files類(lèi)簡(jiǎn)直強(qiáng)大的一塌糊涂,幾乎所有文件和目錄的相關(guān)屬性,操作都有想要的api來(lái)支持。這里懶得再繼續(xù)介紹了,詳細(xì)參見(jiàn) jdk8 的文檔。


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安庆市| 花垣县| 突泉县| 顺昌县| 高台县| 东源县| 金山区| 三明市| 瑞安市| 社会| 启东市| 商河县| 泗水县| 平潭县| 敦化市| 东台市| 丹东市| 华池县| 临泽县| 新巴尔虎右旗| 壤塘县| 龙山县| 上蔡县| 宁远县| 彭阳县| 托克托县| 邵阳县| 大埔区| 涪陵区| 潼南县| 团风县| 宁国市| 寿阳县| 青神县| 洛宁县| 丽江市| 和顺县| 额尔古纳市| 江源县| 三都| 民和|