Java-IO流


Java-IO流(一)

java的IO通过java.io包下的类和接口来支持,在该包下主要有输入、输出两种IO流,每种输出、输入流又可分为字节流和字符流。此外,Java的IO流使用了一种装饰器设计模式,将IO流分成底层节点流和上层处理流,其中节点流用于和物理储存节点直接关联,不同物理节点获取节点流的方式可能有差异,但程序可以把不同物理节点流包装成统一的处理流,从而允许程序使用统一的输入输出代码来读取不同的物理存储节点的资源。java.nio及其子包提供了一系列API,是对原IO的升级。

File类

访问文件和目录

File类是java.io包下代表与平台无关的文件和目录,也就是说它并不能访问文件,需要时使用IO流。File可以使用文件路径字符串来创建File实例,通过调用实例方法来访问,如下:

访问文件名相关
  • String getName():返回此File对象所表示的文件名或路径名。
  • String getPath():返回此File对象所对应的路径名。
  • File getAbsoluteFile():返回此File对象的绝对路径。
  • String getAbsolutePath():返回File对象对应的绝对路径名。
  • String getParent():返回File对象对应目录的父目录名。
  • boolean renameTo(File newName):重命名文件或目录,成功返回true。

还有文件检测方法、获取常规文件、文件操作相关和目录操作相关的方法等。注意文件路径用斜杠/表示!

文件过滤器

File类的list()方法中可以接收一个FilenameFilter参数,通过该参数可以列出符合条件的文件,这里的FilenameFilter接口和javax.swing.filechooser包下的FileFilter抽象类的功能非常相似,可以把FileFilter当成FilenameFilter实现类,但实际上没有实现该接口。

FilenameFilter接口包含一个accept(File dir,String name)方法,该方法对File所指定的目录或文件进行迭代,如果返回true,则list()方法会列出该子目录或文件。FilenameFilter接口内只有一个抽象方法,因此该接口也是一个函数式接口,则可使用Lambda表达式创建该接口对象。

File file = new File(".");
String[] nameList = file.list( (dir,name)->name.endsWith(".java")||new File(name).isDirectory());

Java的IO流

Java输入/输出源抽象表述为“流”stream,然后通过流的方法访问不同的输入/输出源。stream是从起源到接收sink的有序数据。所有的传统流的类都在java.io包下,以实现输入/输出功能。

  1. 输入输出流
  2. 输入流:只能从中读取数据,而不能写入数据

  3. 输出流:只能向其写入数据,不能读数据。

Java的输入流主要由InputStreamReader作为基类,输出流由OutputStreamWriter作为基类。

2.字节流和字符流

两者区别在于所操作的数据单元不同,字节流操作的数据单元是8位字节,而字符是16位的字符。字节流主要由InputStreamOutputStream作为基类,字符流由ReaderWriter作为基类。

3.节点流和处理流

可以向一个特定的IO设备读写数据的流称为节点流low level stream;处理流则对一个已存在的流进行连接或封装,通过封装后的流来实现数据读写功能,不会连接到实际的数据源,同时它被称作高级流。Java使用处理流来包装节点流是一种典型的装饰器设计模式,通过来包装不同的节点流来消除节点间的差异,以通过更多方法完成输入输出,也叫包装流

IO流涉及40多个类,这些类非常有规则,它们都是从以下4个抽象基类派生而成。

IuputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流。

OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。

此外,处理流的功能体现在以下两个方面:

  • 性能提高:增加缓冲的方式提高IO效率。
  • 操作便捷:处理流提供大量方法输入输出大批内容。

字节流和字符流

InputStreamReader

InputStream包含如下三个方法:

  • int read():从输入流读取单个字节,并返回数据
  • int read(byte[] b):从输入流中最多读取b.length个字节并存储在数组中,返回实际读取的字节数。
  • int read(byte[] b,int off,int len):从off开始读,最多读取len个字节数据,放入b中,返回实际读取字节。

Reader也有三个类似方法,但是读取字符数据。最后要显式关闭IO流,回收资源。

OutputStreamWriter
  • void witer(int c):将指定字节/字符输出到输出流中,c可以是字节或字符。
  • void writer(byte[]/char[] buf):将字节或字符数据输出到指定输出流中
  • void writer(byte[]/char[] buf,int off,int len):从off开始,将长度为len的数据输出到输出流。

Writer还包含void writer(String str),void writer(String str,int off,int len)方法,用字符串代替字符数组。


文章作者: 流浪舟
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 流浪舟 !
评论
 上一篇
Java-IO(二)输入输出流体系 Java-IO(二)输入输出流体系
输入输出流体系处理流的用法使用处理流来包装节点流,程序通过处理流来执行输入输出,让节点流与底层I/O设备、文件交互。如通过PrintStream处理流来包装OutputStream,使用处理流后的输出流更加方便。 输入输出流体系提供了近40
2020-11-04
下一篇 
Java反射篇 Java反射篇
Java反射对象在运行时会有两种类型,编译时类型和运行时类型,例如:String a = new Name(),编译时为String,运行时为Name。为了准确知道该对象的类型,可以通过instanceof()方法,但是在什么都不知道的情况
2020-10-21
  目录