1. NIO的使用说明

Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO AP。 NIO与原来的IO同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的IO操作。 NIO将以更加高效的方式进行文件的读写操作。 随着 JDK 7 的发布,Java对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称他们为 NIO.2。

2. Path的使用 —- jdk7提供

2.1 Path的说明

Path替换原有的File类。

2.2 如何实例化

image.png

  1. // 如何使用Paths实例化Path
  2. @Test
  3. public void test1() {
  4. Path path = Paths.get("d:\\nio\\bg1.jpg"); // new File(String filePath)
  5. Path path2 = Paths.get("d:\\", "nio\\bg1.jpg"); // new File(String parent, String fileName);
  6. System.out.println(path);
  7. System.out.println(path2);
  8. Path path3 = Paths.get("d:\\", "nio");
  9. System.out.println(path3);
  10. }

2.3 常用方法

image.png

    @Test
    public void test2() {

        Path path1 = Paths.get("d:\\", "nio\\nio1\\nio2\\hello.txt");
        Path path2 = Paths.get("hello.txt");

//        String toString() : 返回调用 Path 对象的字符串表示形式
        System.out.println(path1);

//        boolean startsWith(String path) : 判断是否以 path 路径开始
        System.out.println(path1.startsWith("d:\\nio"));
//        boolean endsWith(String path) : 判断是否以 path 路径结束
        System.out.println(path1.endsWith("hello.txt"));
//        boolean isAbsolute() : 判断是否是绝对路径
        System.out.println(path1.isAbsolute() + "~");
        System.out.println(path2.isAbsolute() + "~");
//        Path getParent() :返回Path对象包含整个路径,不包含 Path 对象指定的文件路径
        System.out.println(path1.getParent());
        System.out.println(path2.getParent());
//        Path getRoot() :返回调用 Path 对象的根路径
        System.out.println(path1.getRoot());
        System.out.println(path2.getRoot());
//        Path getFileName() : 返回与调用 Path 对象关联的文件名
        System.out.println(path1.getFileName() + "~");
        System.out.println(path2.getFileName() + "~");
//        int getNameCount() : 返回Path 根目录后面元素的数量
//        Path getName(int idx) : 返回指定索引位置 idx 的路径名称
        for (int i = 0; i < path1.getNameCount(); i++) {
            System.out.println(path1.getName(i) + "*****");
        }

//        Path toAbsolutePath() : 作为绝对路径返回调用 Path 对象
        System.out.println(path1.toAbsolutePath());
        System.out.println(path2.toAbsolutePath());
//        Path resolve(Path p) :合并两个路径,返回合并后的路径对应的Path对象
        Path path3 = Paths.get("d:\\", "nio");
        Path path4 = Paths.get("nioo\\hi.txt");
        path3 = path3.resolve(path4);
        System.out.println(path3);

//        File toFile(): 将Path转化为File类的对象
        File file = path1.toFile();//Path--->File的转换

        Path newPath = file.toPath();//File--->Path的转换
    }

3. Files工具类 —- jdk7提供

3.1 作用

操作文件或文件目录的工具类

3.2 常用方法

image.png

    @Test
    public void test1() throws IOException {
        Path path1 = Paths.get("d:\\nio", "hello.txt");
        Path path2 = Paths.get("atguigu.txt");

//        Path copy(Path src, Path dest, CopyOption … how) : 文件的复制
        //要想复制成功,要求path1对应的物理上的文件存在。path1对应的文件没有要求。
//        Files.copy(path1, path2, StandardCopyOption.REPLACE_EXISTING);

//        Path createDirectory(Path path, FileAttribute<?> … attr) : 创建一个目录
        //要想执行成功,要求path对应的物理上的文件目录不存在。一旦存在,抛出异常。
        Path path3 = Paths.get("d:\\nio\\nio1");
//        Files.createDirectory(path3);

//        Path createFile(Path path, FileAttribute<?> … arr) : 创建一个文件
        //要想执行成功,要求path对应的物理上的文件不存在。一旦存在,抛出异常。
        Path path4 = Paths.get("d:\\nio\\hi.txt");
//        Files.createFile(path4);

//        void delete(Path path) : 删除一个文件/目录,如果不存在,执行报错
//        Files.delete(path4);

//        void deleteIfExists(Path path) : Path对应的文件/目录如果存在,执行删除.如果不存在,正常执行结束
        Files.deleteIfExists(path3);

//        Path move(Path src, Path dest, CopyOption…how) : 将 src 移动到 dest 位置
        //要想执行成功,src对应的物理上的文件需要存在,dest对应的文件没有要求。
//        Files.move(path1, path2, StandardCopyOption.ATOMIC_MOVE);

//        long size(Path path) : 返回 path 指定文件的大小
        long size = Files.size(path2);
        System.out.println(size);

    }

image.png

    @Test
    public void test2() throws IOException {
        Path path1 = Paths.get("d:\\nio", "hello.txt");
        Path path2 = Paths.get("atguigu.txt");
//        boolean exists(Path path, LinkOption … opts) : 判断文件是否存在
        System.out.println(Files.exists(path2, LinkOption.NOFOLLOW_LINKS));

//        boolean isDirectory(Path path, LinkOption … opts) : 判断是否是目录
        //不要求此path对应的物理文件存在。
        System.out.println(Files.isDirectory(path1, LinkOption.NOFOLLOW_LINKS));

//        boolean isRegularFile(Path path, LinkOption … opts) : 判断是否是文件

//        boolean isHidden(Path path) : 判断是否是隐藏文件
        //要求此path对应的物理上的文件需要存在。才可判断是否隐藏。否则,抛异常。
//        System.out.println(Files.isHidden(path1));

//        boolean isReadable(Path path) : 判断文件是否可读
        System.out.println(Files.isReadable(path1));
//        boolean isWritable(Path path) : 判断文件是否可写
        System.out.println(Files.isWritable(path1));
//        boolean notExists(Path path, LinkOption … opts) : 判断文件是否不存在
        System.out.println(Files.notExists(path1, LinkOption.NOFOLLOW_LINKS));
    }

    /**
     * StandardOpenOption.READ:表示对应的Channel是可读的。
     * StandardOpenOption.WRITE:表示对应的Channel是可写的。
     * StandardOpenOption.CREATE:如果要写出的文件不存在,则创建。如果存在,忽略
     * StandardOpenOption.CREATE_NEW:如果要写出的文件不存在,则创建。如果存在,抛异常
     *
     * @throws IOException
     * @author shkstart 邮箱:shkstart@126.com
     */
    @Test
    public void test3() throws IOException {
        Path path1 = Paths.get("d:\\nio", "hello.txt");

//        InputStream newInputStream(Path path, OpenOption…how):获取 InputStream 对象
        InputStream inputStream = Files.newInputStream(path1, StandardOpenOption.READ);

//        OutputStream newOutputStream(Path path, OpenOption…how) : 获取 OutputStream 对象
        OutputStream outputStream = Files.newOutputStream(path1, StandardOpenOption.WRITE, StandardOpenOption.CREATE);


//        SeekableByteChannel newByteChannel(Path path, OpenOption…how) : 获取与指定文件的连接,how 指定打开方式。
        SeekableByteChannel channel = Files.newByteChannel(path1, StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE);

//        DirectoryStream<Path>  newDirectoryStream(Path path) : 打开 path 指定的目录
        Path path2 = Paths.get("e:\\teach");
        DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path2);
        Iterator<Path> iterator = directoryStream.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

    }