IO流
文章目录
File(表示一个文件或者目录)
File类是io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建、删除、重命名文件等。
File类的对象主要用来获取文件本身的一些信息,如文件所在目录、文件的长度、文件读写权限等。数据流可以将数据写入到文件中,而文件也是数据流最常用的数据媒体。
常用方法
- 在windows中filename不区分大小写。
- 在windows中路径分隔符是‘\’,‘\’是转义字符,所以要写为‘\\’。如果写‘/’则不用转义。
- 删除目录时如果目录下有文件要递归删除。
方法 | 说明 |
---|---|
构造函数 | |
File(String fileName); | 使用绝对路径。 |
File(String parent, String child); | 使用父路径和相对路径。 |
File(File parent, String child); | 使用目录和文件名称。 |
创建 | |
boolean createNewFile(); | 创建一个文件。 |
boolean mkdirs(); | 创建多级目录。 |
boolean mkdir(); | 创建单个目录。 |
删除(目录不为空要递归删除) | |
boolean delete(); | 删除一个文件或者空目录。 |
获取 | |
String getAbsolutePath() | 获取绝对路径。 |
String getPath() | 获取创建时路径。 |
String getName() | 获取名称。 |
String getParent() | 获取上级目录名称。 |
String getLength() | 获取文件大小。 |
判断 | |
boolean exists() | 判断是否存在。 |
boolean isFile(); | 判断是否是文件。 |
boolean isDirectory(); | 判断是否是目录。 |
目录遍历 | |
String[] list() | 返回目录下的内容 |
File[] listFile() | 返回目录下的文件对象。 |
IO概述
Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。
顶级父类
输入流 | 输出流 | |
---|---|---|
字节流 | InputStream | OutputStream |
字符流 | Reader | Writer |
字节流
OutputStream
java.io.OutputStream
抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。
方法名称 | 方法说明 |
---|---|
public void close() | 关闭此输出流并释放与此流相关联的任何系统资源。 |
public void flush() | 刷新此输出流并强制任何缓冲的输出字节被写出。 |
public void write(byte[] b) | 将 b.length字节从指定的字节数组写入此输出流。 |
public void write(byte[] b, int off, int len) | 从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。 |
public abstract void write(int b) | 将指定的字节输出流。 |
FileOutputStream
java.io.FileOutputStream
是文件输出流,OutputStream的子类。用于将数据写出文件。
构造方法
public FileOutputStream(File file)
:创建文件输出流以写入由指定的 File对象表示的文件。public FileOutputStream(String name)
: 创建文件输出流以指定的名称写入文件。
上面两个构造方法,如果原文件不存在会新建,如果存在则会清空原文件,对其进行覆盖。如果想追加续写,要使用下面的构造方法。
public FileOutputStream(File file, boolean append)
: 创建文件输出流以写入由指定的 File对象表示的文件。public FileOutputStream(String name, boolean append)
: 创建文件输出流以指定的名称写入文件。
InputStream
java.io.InputStream
抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。
方法名称 | 方法说明 |
---|---|
public void close() | 关闭此输入流并释放与此流相关联的任何系统资源。 |
public abstract int read() | 从输入流读取数据的下一个字节。 |
public int read(byte[] b) | 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。 |
FileInputStream
java.io.FileInputStream
类是文件输入流,从文件中读取字节。
FileInputStream(File file)
: 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。FileInputStream(String name)
: 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。
字符流
Writer
java.io.Writer
抽象类是表示用于读取字符流的所有类的超类,可以写出字符信息到内存中。它定义了字符输出流的基本共性功能方法。
方法名称 | 方法说明 |
---|---|
public abstract void close() | 关闭此输出流并释放与此流相关联的任何系统资源。 |
public abstract void flush() | 刷新此输出流并强制缓冲的输出字符被写出。 |
public void write(int c) | 写出一个字符。 |
public void write(char[] cbuf) | 将 b.length个字符从字符数组写出此输出流。 |
public abstract void write(char[] b, int off, int len) | 从指定的字符数组写出 len字符,从偏移量off开始输出到此输出流。 |
public void write(String str) | 写出一个字符串。 |
FileWriter
java.io.FileWriter
类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
构造方法
FileWriter(File file)
: 创建一个新的 FileWriter,给定要读取的File对象。FileWriter(String fileName)
: 创建一个新的 FileWriter,给定要读取的文件的名称。
Reader
java.io.Reader
抽象类是表 示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。
方法名称 | 方法说明 |
---|---|
public void close() | 关闭此流并释放与此流相关联的任何系统资源。 |
public int read() | 从输入流读取一个字符。 |
public int read(char[] cbuf) | 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。 |
FileReader
java.io.FileReader
类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
小贴士:
字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。idea中UTF-8
字节缓冲区:一个字节数组,用来临时存储字节数据。
构造方法
FileReader(File file)
: 创建一个新的 FileReader ,给定要读取的File对象。FileReader(String fileName)
: 创建一个新的 FileReader ,给定要读取的文件的名称。
缓冲流
缓冲流,也称为高效流,对于四个FileXXX进行增强。
缓冲流内部有一个数组缓冲区(8192),真正操作文件的是底层的输入流。
输入流 | 输出流 | |
---|---|---|
字节缓冲流 | BufferedInputStream | BufferedOutputStream |
字符缓冲流 | BufferedReader | BufferedWriter |
字节缓冲流
构造函数
BufferedOutputStream(OutputStream out);
BufferedInputStream(InputStream in)
FileOutputStream fos = new FileOutputStream("文件路径");
BufferedOutputStream bos = new BuffferedOutputStream(fos);
FileInputStream fis = new FileInputStream("文件路径");
BufferedInputStream bos = new BuffferedInputStream(fis);
字符缓冲流
构造方法
BufferedReader(Reader in)
BufferedWriter(Writer out)
FileReader fr = new FileReader("文件路径");
BufferedReader br = new BufferedReader(fr);
br.readLine(); //特有方法:读一行文字
FileWriter fw = new FileWriter("文件路径");
BufferedWriter bw = new BUfferedWriter(fw);
bw.newLine(); //特有方法:写一行分隔符。与系统无关
字符编码和字符集
- 字符编码:就是一套自然语言的字符和二进制数之间的对应规则。
- 字符集:编码表,是一个系统支持的所有字符的集合,包括各国文字,标点符号,图形,数字等。
- 常见的字符集
ASCII字符集、GBK字符集、Unicode字符集
转换流
InputStreamReader
转换流 java.io.InputStreamReader
,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。
构造方法
InputStreamReader(InputStream in)
: 创建一个使用默认字符集的字符流。InputStreamReader(InputStream in, String charsetName)
: 创建一个指定字符集的字符流
OutputStreamWriter
转换流 java.io.OutputStreamWriter
,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
构造方法
OutputStreamWriter(OutputStream in)
: 创建一个使用默认字符集的字符流。OutputStreamWriter(OutputStream in, String charsetName)
: 创建一个指定字符集的字符流。
序列化
Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该 对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
序列化和反序列操作
-
想要序列化的类必须实现 java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出 NotSerializableException 。
-
该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态或者静态,使用transient 或者static 关键字修饰。
-
**当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个 InvalidClassException 异常。**通过手写serialVesionID可以避免。
ObjectOutputStream
java.io.ObjectOutputStream
类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。
构造方法
public ObjectOutputStream(OutputStream out)
: 创建一个指定OutputStream的ObjectOutputStream
ObjectInputStream
java.io.ObjectInputStream
反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。
构造方法
public ObjectInputStream(InputStream in)
: 创建一个指定InputStream的ObjectInputStream。
打印流
PrintStream
java.io.PrintStream
类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。
构造方法
public PrintStream(String fileName)
: 使用指定的文件名创建一个新的打印流。
特殊方法
print()
不换行打印,原样输出。println()
换行打印,原样输出。
System.out就是一个打印流。可以通过System.setOut(PrintStream ps) 方法设置打印流的输出流向。