当前位置: 首页 > 后端技术 > Java

面试官:请说说Java中的I-O流

时间:2023-04-01 13:30:17 Java

Java的I/O流I/O是Input/Output。I/O用于处理设备间的数据传输,例如:从磁盘文件读写,通过网络传输数据等。在Java中,I/O的操作是以流(Stream)的形式进行的.java.io包提供了多种流类和接口来操作各种类型的数据,并通过标准方法输入(读取)和输出(写入)数据。流的分类抽象父类:InputStreamOutputStreamReaderWriter;根据流的流向,分为:输入流和输出流;根据流中操作的数据单元分为:字节流(8位)和字符流(16位);字节流:InputStreamOutputStream;字符流:ReaderWriter;根据流是否直接连接到特定的地方(如磁盘、内存、设备等),分为:节点流和处理流;节点流:从或到特定节点读写数据流,如:FileReader类;普通节点流:文件流:FileInputStreamFileReader等以File开头的流;处理流:封装一个已有的流,如:BufferedReader类。处理流的构造方法总是需要传入另一个流对象作为参数,一个流对象被处理流封装起来,称为流连接。注意:关闭流时,必须先关闭外流,再关闭内流(但关闭外流时,内流会自动关闭,所以只需要关闭外流即可);常用处理流:Buffered流:BufferedInputStreamBufferedReader等以Buffered开头的流,增加缓冲功能,避免频繁读写硬盘,提高数据传输效率。BufferedWriter和BufferedOutputStream提供了flush()方法,用于将缓冲区中的数据刷新到基本流中,当缓冲区满时会自动刷新,我们不需要显式调用flush(),除非当前缓冲区中的数据需要立即使用;转换流:InputStreamReader-->继承自Reader,OutputStreamWriter-->继承自Writer,实现字节流和字符流的转换;InputStreamReader:字节转字符(解码);OutputStreamWriter:字符到字节(编码)。数据流:DataInputStreamDataOutputStream,提供读写Java基本数据类型的方法;打印流:PrintStream-->继承自FilterOutputStream-->继承自OutputStream;PrintWriter继承自Writer;这两个类提供了两个参数的构造方法,可以实现自动flush();注意:打印流的print方法不会抛出异常;publicPrintStream(OutputStreamout,booleanautoFlush);publicPrintWriter(Writerout,booleanautoFlush);NIONIO(NewIO,Non-BolckingIO)是Java1.4引入的一组新的IOAPI。NIO的作用和原来的IO一样,只是NIO的实现不同。NIO支持面向缓冲区和基于通道的操作,而IO是面向流的。NIO以更高效的方式读取和写入文件。从JDK1.7开始,Java对NIO进行了扩展,增加了java.nio.file包,提供了Path、Paths、Files等类和接口,增强了对文件处理的支持。(注:Paths类已被弃用,以后可能会被废弃)Path接口和Files类的一些常用方法:Path//Writeafile:获取输出流向文件中写入数据//注意,Path.of创建的Path对象只是对一个可能存在的文件的引用,并不保证一定存在。如果想确定,应该调用java.nio.file.Files.exists()方法OutputStreamout=Files.newOutputStream(Path.of("E:/szu.html"));Files//写入文件Files.write(Pathpath,byte[]file);//读取文件Files.readAllBytes(Pathpath);if(Files.isDirectory(Path.of(""))){//打印当前目录下的所有文件,forEach中的路径类型为java.nio.file.PathFiles.list(Path.of("")).forEach(path->System.out.println(path));//打印指定后缀的所有文件Files.list(Path.of("")).filter(path->path.toString().endswith(".pdf")).forEach(System.out::println);}参考:上硅谷Java入门Java节点流和处理流的区别