关于java:面试官请谈谈-Java-中的-IO-流

34次阅读

共计 1981 个字符,预计需要花费 5 分钟才能阅读完成。

Java 的 I/O 流

I/O 即 Input/Output,I/O 用来解决设施之间的数据传输,比方:从磁盘中读写文件、在网络中传输数据等。

在 Java 中,对于 I/O 的操作是以 流(Stream)的形式进行的,在 java.io 包中提供了多种流的类和接口,用来操作各种类型的数据,并通过 规范的办法 输出(read)和输入(write)数据。

流的分类

形象父类InputStream OutputStream Reader Writer

  1. 依照流的流向,分为:输出流和输入流
  2. 依照流中操作的数据单位,分为:字节流(8 bit)和字符流(16 bit)

    • 字节流InputStream OutputStream;
    • 字符流Reader Writer;
  3. 依照流是否间接与特定的中央(如磁盘、内存、设施等)相连,分为:节点流和解决流

    • 节点流:能够从或者向一个特定的节点读写数据的流,如:FileReader 类;

      常见 节点流

      • 文件流FileInputStream FileReader 等以 File 结尾的流;
    • 解决流 是对一个已存在流的封装 ,如:BufferedReader 类。解决流的构造方法总是要传入一个其余流对象作为参数,一个流对象通过解决流的包装,称为流的连贯。留神: 敞开流的时候要先敞开外层的流,再敞开内层的流(然而敞开外层的流时会主动敞开内层的流,所以只须要敞开外层的流)

      常见的 解决流

      • 缓冲流 BufferedInputStream BufferedReader 等以 Buffered 结尾的流,减少缓冲性能,防止频繁读写硬盘,进步了数据传输效率,BufferedWriterBufferedOutputStream 提供了 flush() 办法,作用是将缓冲区的数据刷新到根底流中,当缓冲区满了会主动刷新,咱们 不须要显式调用 flush(),除非须要立刻用到以后缓冲区的数据;
      • 转换流 InputStreamReader –> 继承自 ReaderOutputStreamWriter –> 继承自 Writer,实现 字节流与字符流之间的转换

        InputStreamReader:byte 转 char(解码);OutputStreamWriter:char 转 byte(编码)。

      • 数据流DataInputStream DataOutputStream ,提供办法读写 Java 根底数据类型;
      • 打印流PrintStream –> 继承自 FilterOutputStream –> 继承自 OutputStreamPrintWriter 继承自 Writer;这两个类提供了带两个参数的构造方法,能够实现主动 flush();留神:打印流的 print 办法不会抛出异样;

        public PrintStream(OutputStream out, boolean autoFlush);
        public PrintWriter(Writer out, boolean autoFlush);

NIO

NIO(New IO,Non-Bolcking IO)是 Java 1.4 引入的一套新的 IO API,NIO 与原来的 IO 起着同样的作用,然而 NIO 实现的形式不一样,NIO 反对 面向缓冲区的、基于通道 的操作,而 IO 是面向流的。NIO 以更高效的形式读写文件。从 JDK 1.7 开始,Java 扩大了 NIO,增加了 java.nio.file 包,提供了 Path, Paths, Files 等类和接口,加强了对文件解决的反对。(留神:Paths 类曾经不举荐应用,在将来可能会被废除)

对于 Path 接口和 Files 类的一些罕用办法:

Path

// 写文件:获取输入流,用来写数据进文件里
// 留神,Path.of 创立的 Path 对象只是对一个可能存在的文件的援用,不保障存在这个文件,如要确定,应调用 java.nio.file.Files.exists()办法
OutputStream out = Files.newOutputStream(Path.of("E:/szu.html"));

Files

// 写文件
Files.write(Path path, byte[] file);
// 读文件
Files.readAllBytes(Path path);

if (Files.isDirectory(Path.of(""))) {
    
    // 打印当前目录下的所有文件, forEach 里的 path 类型是 java.nio.file.Path
    Files.list(Path.of("")).forEach(path -> System.out.println(path));

    // 打印指定后缀的所有文件
    Files.list(Path.of(""))
        .filter(path -> path.toString().endswith(".pdf"))
        .forEach(System.out::println);
}

参考资料

  1. 尚硅谷 Java 入门
  2. Java 节点流和解决流的区别

正文完
 0