一、File 类
- 是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
- Java 把电脑中的文件和文件夹(目录)封装为了一个 File 类。
- Java 把电脑中的文件和文件夹(目录)封装为了一个 File 类。
- File 类是与系统无关的类,任何操作系统都可以使用这个类中的方法。
- 静态成员变量
- static String pathSeparator
- 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
- 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
- static char pathSeparatorChar
-
-
- 与系统有关的路径分隔符。
- File.pathSeparator 和 File.pathSeparatorChar 返回的结果相同。
- 返回的是路径的分隔符。
- windows
- ;
- 配置环境变量path中的 ;
- Linux
- :
- static String separator
- 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
- 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
- static char separatorChar
- 与系统有关的默认名称分隔符。
- 与系统有关的默认名称分隔符。
- File.separator 和 File.separtorChar 返回的结果相同。
- 返回的是文件名称分隔符。
- windows
- linux
- /
- 从这里可以看出项目中路径不能写死了。
-
- 路径
- 绝对路径
- 是一个完整路径,以盘符开始的路径。
- C:\Usersitcast\IdeaProjects\shungyuan\123.txt
- 相对路径
- 是一个简化路径。
- 相对指的是相对当前项目的根目录(C:\Usersitcast\IdeaProjects\shungyuan)。
- 路径可以写成:123.txt
- 注意事项
- 路径不区分大小写。
- 路径中文件名称分隔符 windows 使用反斜杠。
- 反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠。
- 绝对路径
- 构造方法
- File(String pathname)
- 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
- 参数
- String pathname:字符串的路径名称。
- 路径可以是以文件结尾,也可以是以文件夹结尾。
- 路径可以是相对路径,也可以是绝对路径。
- 路径可以是存在,也可以是不存在。
- 创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况。
- String pathname:字符串的路径名称。
- 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
- File(String parent, String child)
- 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
- 参数:把路径分成了两部分。
- String parent:父路径。
- String child:子路径。
- 父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化。
- 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
- File(File parent, String child)
- 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
- 参数
- 把路径分成了两部分。
- File parent:父路径
- String child:子路径
- 把路径分成了两部分。
- 父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化。
- 父路径是 File 类型。可以使用 File 的方法对路径进行一些操作,再使用路径创建对象。
- 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
- File(String pathname)
- 常用方法
- public String getAbsolutePath()
- 返回此 File 的绝对路径名字符串。
- 无论构造方法中路径是绝对的还是相对的,getAbsolutePath 方法返回的都是绝对路径。
- 返回此 File 的绝对路径名字符串。
- public String getPath()
- 将此File转换为路径名字符串。
- 对象的toString 方法调用的就是 getPath 方法。
- 将此File转换为路径名字符串。
- public String getName()
- 返回由此File表示的文件或目录的名称。
- 获取的就是构造方法传递路径的结尾部分(文件或文件夹)。
- 返回由此File表示的文件或目录的名称。
- public long length()
- 返回由此 File 表示的文件的长度(大小,以字节为单位)。
- 文件夹是没有大小概念的,不能获取文件夹的大小。
- 如果构造方法中给出的路径不存在,那么 length 方法返回 0 。
- 文件夹是没有大小概念的,不能获取文件夹的大小。
- 返回由此 File 表示的文件的长度(大小,以字节为单位)。
- public String getAbsolutePath()
- 判断功能的方法
- public boolean exists()
- 判断此 File 表示的文件或目录是否实际存在。
- 存在:true;不存在:false 。
- 存在:true;不存在:false 。
- 判断此 File 表示的文件或目录是否实际存在。
- public boolean isDirectory()
- 判断构造方法中给定的路径是否以文件夹结尾。
- 是:true ; 否:false 。
- 判断构造方法中给定的路径是否以文件夹结尾。
- public boolean isFile()
- 判断构造方法中给定的路径是否以文件结尾。
- 是:true;否:false 。
- 判断构造方法中给定的路径是否以文件结尾。
- 注意事项
- 电脑的硬盘中只有文件/文件夹,两个方法是互斥。
- 这两个方法使用前提,路径必须是存在的,否则都返回 false 。
- 电脑的硬盘中只有文件/文件夹,两个方法是互斥。
- public boolean exists()
- 创建删除功能的方法
- public boolean createNewFile()
- 当且仅当具有该名称的文件尚不存在时,创建一个新的空文件,创建文件的路径和名称在构造方法中给出(构造方法的参数)。
- 返回值:布尔值。
- true:文件不存在,创建文件,返回 true 。
- false:文件存在,不会创建,返回 false 。
- 注意事项
- 此方法只能创建文件,不能创建文件夹。
- 创建文件的路径必须存在,否则会抛出异常。
- 此方法只能创建文件,不能创建文件夹。
- 当且仅当具有该名称的文件尚不存在时,创建一个新的空文件,创建文件的路径和名称在构造方法中给出(构造方法的参数)。
- public boolean delete()
- 删除构造方法路径中给出的文件/文件夹。
- 返回值:布尔值。
- true:文件/文件夹删除成功,返回 true 。
- false:文件夹中有内容,不会删除,返回false;构造方法中路径不存在 false 。
- 注意事项
- 该方法是直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎。
- true:文件/文件夹删除成功,返回 true 。
- 删除构造方法路径中给出的文件/文件夹。
- public boolean mkdir()
- 创建单级空文件夹。
- 创建单级空文件夹。
- public boolean mkdirs()
- 既可以创建单级空文件夹,也可以创建多级文件夹。
- 既可以创建单级空文件夹,也可以创建多级文件夹。
- 上面这两个方法的返回值:布尔值。
- true:文件夹不存在,创建文件夹,返回 true 。
- false:文件夹存在,不会创建,返回false;构造方法中给出的路径不存在返回 false 。
- 注意事项
- 此方法只能创建文件夹,不能创建文件。
- 此方法只能创建文件夹,不能创建文件。
- true:文件夹不存在,创建文件夹,返回 true 。
- public boolean createNewFile()
- 遍历目录
- public String[] list()
- 遍历构造方法中给出的目录,会获取目录中所有文件/文件夹的名称,把获取到的多个名称存储到一个 String 类型的数组中。
- 遍历构造方法中给出的目录,会获取目录中所有文件/文件夹的名称,把获取到的多个名称存储到一个 String 类型的数组中。
- public File[] listFiles()
- 遍历构造方法中给出的目录,会获取目录中所有的文件/文件夹,把文件/文件夹封装为 File 对象,多个 File 对象存储到 File 数组中。
- 遍历构造方法中给出的目录,会获取目录中所有的文件/文件夹,把文件/文件夹封装为 File 对象,多个 File 对象存储到 File 数组中。
- 注意事项
- list 方法和 listFiles 方法遍历的是构造方法中给出的目录。
- 如果构造方法中给出的目录的路径不存在,会抛出空指针异常。
- 如果构造方法中给出的路径不是一个目录,也会抛出空指针异常。
- list 方法和 listFiles 方法遍历的是构造方法中给出的目录。
- public String[] list()
二、递归
- 递归:指在当前方法内调用自己的这种现象。
- 递归的分类
- 递归分为两种,直接递归和间接递归。
- 直接递归:方法自身调用自己。
- 间接递归:A 方法调用 B 方法,B 方法调用 C 方法,C 方法调用 A 方法。
- 递归分为两种,直接递归和间接递归。
- 注意事项
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归。
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 递归的使用前提
- 当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归。
- 当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归。
三、IO 概述
- 一切皆为字节
- 一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
- 一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
- OutputStream
- 字节输出流。
- 此抽象类是表示输出字节流的所有类的超类。
- 共性方法
- public void close()
- 关闭此输出流并释放与此流相关联的任何系统资源。
- 关闭此输出流并释放与此流相关联的任何系统资源。
- public void flush()
- 刷新此输出流并强制任何缓冲的输出字节被写出。
- 刷新此输出流并强制任何缓冲的输出字节被写出。
- public void write(byte[] b)
- 将 b.length字节从指定的字节数组写入此输出流。
- 将 b.length字节从指定的字节数组写入此输出流。
- public void write(byte[] b, int off, int len)
- 从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
- 从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
- public abstract void write(int b)
- 将指定的字节输出流。
- 将指定的字节输出流。
- public void close()
- 字节输出流。
- FileOutputStream
- 文件字节输出流.
- 作用
- 把内存中的数据写入到硬盘的文件中。
- 把内存中的数据写入到硬盘的文件中。
- 构造方法
- FileOutputStream(String name)
- 创建一个向具有指定名称的文件中写入数据的输出文件流。
- 创建一个向具有指定名称的文件中写入数据的输出文件流。
- FileOutputStream(File file)
- 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
- 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
- 以上两个构造方法
- 参数:写入数据的目的地。
- String name:目的地是一个文件的路径。
- File file:目的地是一个文件。
- 构造方法的作用
- 创建一个 FileOutputStream 对象。
- 会根据构造方法中传递的文件/文件路径,创建一个空的文件。
- 会把 FileOutputStream 对象指向创建好的文件。
- 创建一个 FileOutputStream 对象。
- 写入的原理(内存 --> 硬盘)
- java程序-->JVM(java虚拟机)-->OS(操作系统)-->OS调用写数据的方法-->把数据写入到文件中
- java程序-->JVM(java虚拟机)-->OS(操作系统)-->OS调用写数据的方法-->把数据写入到文件中
- 字节输出流的使用步骤(重点)
- 创建一个 FileOutputStream 对象,构造方法中传递写入数据的目的地。
- 调用 FileOutputStream 对象中的方法 write ,把数据写入到文件中。
- 释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提供程序的效率)。
- 创建一个 FileOutputStream 对象,构造方法中传递写入数据的目的地。
- 追加写/续写:使用两个参数的构造方法
- FileOutputStream(String name, boolean append)
- 创建一个向具有指定 name 的文件中写入数据的输出文件流。
- 创建一个向具有指定 name 的文件中写入数据的输出文件流。
- FileOutputStream(File file, boolean append)
- 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
- 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
- 以上两个构造方法
- 参数
- String name,File file:写入数据的目的地。
- boolean append:追加写开关。
- true:创建对象不会覆盖源文件,继续在文件的末尾追加写数据。
- false:创建一个新文件,覆盖源文件。
- true:创建对象不会覆盖源文件,继续在文件的末尾追加写数据。
- String name,File file:写入数据的目的地。
- 参数
- FileOutputStream(String name, boolean append)
- 换行写:写换行符号
- windows:
- linux:/n
- FileOutputStream(String name)
- 常用方法
- void write(int b)
- 每次可以写出一个字节数据。
- void write(byte[] b)
- 将 b.length 字节从指定的字节数组写入此输出流。
- 如果写的第一个字节是正数(0-127),那么显示的时候会查询 ASCII 表。
- 如果写的第一个字节是负数,那第一个字节会和第二个字节,两个字节组成一个中文显示,查询系统默认码表 (GBK)。
- 如果写的第一个字节是正数(0-127),那么显示的时候会查询 ASCII 表。
- 将 b.length 字节从指定的字节数组写入此输出流。
- void write(byte[] b, int off, int len)
- 从指定的字节数组写入 len字节,从偏移量 off 开始输出到此输出流。
- 参数
- int off:数组的开始索引。
- int len:写几个字节。
- int off:数组的开始索引。
- 参数
- 从指定的字节数组写入 len字节,从偏移量 off 开始输出到此输出流。
- void write(int b)
- 文件字节输出流.
- InputStream
- 字节输入流
- 此抽象类是表示字节输入流的所有类的超类。
- 共性方法
- int read()
- 读取文件中的一个字节并返回,读取到文件的末尾返回 -1。
- int read(byte[] b)
- 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
- void close()
- 关闭此输入流并释放与该流关联的所有系统资源。
- int read()
- FileInputStream
- 作用
- 把硬盘文件中的数据,读取到内存中使用。
- 构造方法
- FileInputStream(String name)
- FileInputStream(File file)
- 以上两个构造方法
- 参数:读取文件的数据源。
- String name:文件的路径
- File file:文件
- 构造方法作用
- 会创建一个 FileInputStream 对象。
- 会在 FileInputStream 对象指定构造方法中要读取的文件。
- 读取数据的原理(硬盘-->内存)
- java 程序 --> JVM --> OS --> OS 读取数据的方法 --> 读取文件
- 字节输入流的使用步骤(重点)
- 创建 FileInputStream 对象,构造方法中绑定要读取的数据源。
- 使用 FileInputStream 对象中的方法 read ,读取文件。
- 释放资源。
- 常用方法
- int read(byte[] b)
- 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
- 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
- 明确两件事情
- 方法的参数 byte[] 的作用?
- 起到缓冲作用,存储每次读取到的多个字节。
- 数组的长度一把定义为 1024(1kb) 或者 1024 的整数倍。
- 起到缓冲作用,存储每次读取到的多个字节。
- 方法的返回值 int 是什么?
- 每次读取的有效字节个数
- 每次读取的有效字节个数
- 方法的参数 byte[] 的作用?
- 读取是一个重复的过程,可以使用循环优化,使用 while 循环,循环结束的条件,读取到 -1 为止。
- int read(byte[] b)
- 文件的复制
- 使用数组读取,每次读取多个字节,减少了系统间的 IO 操作次数,从而提高了读写的效率,建议开发中使用。
- byte[] bytes = new byte[1024];
- byte[] bytes = new byte[1024];
- 步骤
- 创建一个字节输入流对象,构造方法中绑定要读取的数据源。
- 创建一个字节输出流对象,构造方法中绑定要写入的目的地。
- 使用字节输入流对象中的方法 read(byte[] b) 读取文件。
- 使用字节输出流中的方法 write(byte[] b, int off, int len) ,把读取到的字节写入到目的地的文件中。
- 释放资源。
- 创建一个字节输入流对象,构造方法中绑定要读取的数据源。
- 使用数组读取,每次读取多个字节,减少了系统间的 IO 操作次数,从而提高了读写的效率,建议开发中使用。
- 作用
五、字符流
- java.io.Reader
- 字符输入流,是字符输入流的最顶层的父类,定义了一些共性的成员方法,是一个抽象类。
- 共性方法
- int read()
- 读取单个字符并返回。
- 读取单个字符并返回。
- int read(char[] cbuf)
- 一次读取多个字符,将字符读入数组。
- 一次读取多个字符,将字符读入数组。
- void close()
- 关闭该流并释放与之关联的所有资源。
- 关闭该流并释放与之关联的所有资源。
- int read()
- 字符输入流,是字符输入流的最顶层的父类,定义了一些共性的成员方法,是一个抽象类。
- FileReader
- 文件字符输入流
- 作用:把硬盘文件中的数据以字符的方式读取到内存中。
- 构造方法
- FileReader(String fileName)
- FileReader(File file)
- 以上两个构造方法
- 参数:读取文件的数据源
- String fileName:文件的路径。
- File file:一个文件。
- String fileName:文件的路径。
- 参数:读取文件的数据源
- 构造方法的作用
- 创建一个 FileReader 对象。
- 会把 FileReader 对象指向要读取的文件。
- 创建一个 FileReader 对象。
- 字符输入流使用步骤
- 创建 FileReader 对象,构造方法中绑定要读取的数据源。
- 使用 FileReader 对象中的方法 read 读取文件。
- 释放资源
- 创建 FileReader 对象,构造方法中绑定要读取的数据源。
- FileReader(String fileName)
- java.io.Writer
- 字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类。
- 共性方法
- void write(int c)
- 写入单个字符。
- 写入单个字符。
- void write(char[] cbuf)
- 写入字符数组。
- 写入字符数组。
- abstract void write(char[] cbuf, int off, int len)
- 写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
- 写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
- void write(String str)
- 写入字符串。
- 写入字符串。
- void write(String str, int off, int len)
- 写入字符串的某一部分,off 字符串的开始索引,len 写的字符个数。
- 写入字符串的某一部分,off 字符串的开始索引,len 写的字符个数。
- void flush()
- 刷新该流的缓冲。
- 刷新该流的缓冲。
- void close()
- 关闭此流,但要先刷新它。
- 关闭此流,但要先刷新它。
- void write(int c)
- 字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类。
- FileWrite
- 文件字符输出流.
- 作用:把内存中字符数据写入到文件中。
- 构造方法
- FileWriter(File file)
- FileWriter(String fileName)
- 以上两个构造方法
- 参数:写入数据的目的地。
- String fileName:文件的路径。
- File file:是一个文件。
- 构造方法的作用
- 会创建一个 FileWriter 对象。
- 会根据构造方法中传递的文件/文件的路径,创建文件。
- 会把 FileWriter 对象指向创建好的文件。
- 会创建一个 FileWriter 对象。
- 字符输出流的使用步骤(重点):
- 创建 FileWriter 对象,构造方法中绑定要写入数据的目的地。
- 使用 FileWriter 中的方法 write,把数据写入到内存缓冲区中(字符转换为字节的过程)。
- 使用 FileWriter 中的方法 flush,把内存缓冲区中的数据,刷新到文件中。
- 释放资源(会先把内存缓冲区中的数据刷新到文件中)。
- 创建 FileWriter 对象,构造方法中绑定要写入数据的目的地。
- flush 方法和 close 方法的区别
- flush:刷新缓冲区,流对象可以继续使用。
- close:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
- flush:刷新缓冲区,流对象可以继续使用。
- 追加写/续写:使用两个参数的构造方法
- FileWriter(String fileName, boolean append)
- FileWriter(File file, boolean append)
- 参数
- String fileName,File file:写入数据的目的地。
- boolean append:续写开关。
- true:不会创建新的文件覆盖源文件,可以续写。
- false:创建新的文件覆盖源文件。
- String fileName,File file:写入数据的目的地。
- 参数
- FileWriter(String fileName, boolean append)
- FileWriter(File file)
- 常用方法
- void write(char[] cbuf)
- 写入字符数组。
- 写入字符数组。
- abstract void write(char[] cbuf, int off, int len)
- 写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
- 写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
- void write(String str)
- 写入字符串。
- 写入字符串。
- void write(String str, int off, int len)
- 写入字符串的某一部分,off 字符串的开始索引,len 写的字符个数。
- 写入字符串的某一部分,off 字符串的开始索引,len 写的字符个数。
- void write(char[] cbuf)
- 文件字符输出流.
六、IO 异常的处理
- JDK 7 以前
- 使用 try...catch...finally
- 流对象定义在 try 之前,提高变量作用域,让 finally 可以使用。
- try 中对流对象赋值。
- finally 中先对流对象进行非 null 检验,再 close 。
- 使用 try...catch...finally
- JDK 7 处理
- 使用 try()...catch
- try 后面加一个 (),再括号中定义流对象并赋值。
- 流对象有多个中间用 ; 分隔,最后的流对象后也有 ;。
- 流对象的作用域在 try 中有效。
- try 中代码执行完毕后,会自动释放流对象,不用写 finally 。
- try 后面加一个 (),再括号中定义流对象并赋值。
- 使用 try()...catch
- JDK 9 处理
- 使用 try()...catch
- try 的前边可以定义流对象并赋值。
- 在 try 后边的 () 中可以直接引入流对象的名称(变量名)。
- 有多个变量名中间用 ; 分隔,最后一个变量名后没有 ; 。
- try 代码执行完毕后,会自动释放流对象,不用写 finally 。
- try 的前边可以定义流对象并赋值。
- 使用 try()...catch
七、缓冲流
- 字符编码和字符集
- 计算机中储存的信息都是用二进制数表示的。
- 编码:按照某种规则,将字符存储到计算机中。
- 解码:将存储在计算机中的二进制数按照某种规则解析显示出来。
- 字符编码
- 就是一套自然语言的字符与二进制数之间的对应规则。
- 字符集
- 也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。
- 编码引出的问题
-
- 在IDEA中,使用 FileReader 读取项目中的文本文件。由于IDEA的设置,都是 UTF-8 编码,所以没有任何问题。但是,当读取 Windows 系统中创建的文本时,由于 Windows 默认是 GBK 编码,就会出现乱码。
- 在IDEA中,使用 FileReader 读取项目中的文本文件。由于IDEA的设置,都是 UTF-8 编码,所以没有任何问题。但是,当读取 Windows 系统中创建的文本时,由于 Windows 默认是 GBK 编码,就会出现乱码。
-
- OutputStreamWriter
- extends Writer
- 是字符流通向字节流的桥梁。
- 可使用指定的 charset 将要写入流中的字符编码成字节
- 构造方法
- OutputStreamWriter(OutputStream out)
- 创建使用默认字符编码的 OutputStreamWriter。
- OutputStreamWriter(OutputStream out, String charsetName)
- 创建使用指定字符集的 OutputStreamWriter。
- 参数
- OutputStream out:字节输出流,可以用来写转换之后的字节到文件中。
- String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8。
- OutputStreamWriter(OutputStream out)
- 使用步骤
- 创建 OutputStreamWriter 对象,构造方法中传递字节输出流和指定的编码表名称。
- 使用 OutputStreamWriter 对象中的方法 write,把字符转换为字节存储缓冲区中(编码)。
- 使用 OutputStreamWriter 对象中的方法 flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)。
- 释放资源。
- InputStreamReader
- extends Reader
- 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
- 构造方法
- InputStreamReader(InputStream in)
- 创建一个使用默认字符集的 InputStreamReader。
- 创建一个使用默认字符集的 InputStreamReader。
- InputStreamReader(InputStream in, String charsetName)
- 创建使用指定字符集的 InputStreamReader。
- 创建使用指定字符集的 InputStreamReader。
- 参数
- InputStream in:字节输入流,用来读取文件中保存的字节。
- String charsetName:指定的编码表名称,不区分大小写,可以是 utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8。
- InputStream in:字节输入流,用来读取文件中保存的字节。
- InputStreamReader(InputStream in)
- 使用步骤
- 创建 InputStreamReader 对象,构造方法中传递字节输入流和指定的编码表名称。
- 使用 InputStreamReader 对象中的方法 read 读取文件。
- 释放资源。
- 创建 InputStreamReader 对象,构造方法中传递字节输入流和指定的编码表名称。
- 注意事项
- 构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码。
- 构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码。
- extends Reader
九、序列化
- ObjectOutputStream
- extends OutputStream
- 对象的序列化流,把对象以流的方式写入到文件中保存。
- 构造方法
- ObjectOutputStream(OutputStream out)
- 创建写入指定 OutputStream 的 ObjectOutputStream。
- 创建写入指定 OutputStream 的 ObjectOutputStream。
- 参数
- OutputStream out:字节输出流。
- OutputStream out:字节输出流。
- ObjectOutputStream(OutputStream out)
- 特有的成员方法
- void writeObject(Object obj)
- 将指定的对象写入 ObjectOutputStream。
- 将指定的对象写入 ObjectOutputStream。
- void writeObject(Object obj)
- 使用步骤
- 创建 ObjectOutputStream 对象,构造方法中传递字节输出流。
- 使用 ObjectOutputStream 对象中的方法 writeObject,把对象写入到文件中。
- 释放资源。
- 创建 ObjectOutputStream 对象,构造方法中传递字节输出流。
- ObjectInputStream
- extends InputStream
- 反序列化流,将之前使用 ObjectOutputStream 序列化的原始数据恢复为对象。
- 构造方法
- ObjectInputStream(InputStream in)
- 创建从指定 InputStream 读取的 ObjectInputStream。
- 参数
- InputStream in:字节输入流。
- ObjectInputStream(InputStream in)
- 特有的成员方法
- Object readObject()
- 从 ObjectInputStream 读取对象。
- Object readObject()
- 使用步骤
- 创建 ObjectInputStream 对象,构造方法中传递字节输入流。
- 使用 ObjectInputStream 对象中的方法 readObject 读取保存对象的文件。
- 释放资源。
- 使用读取出来的对象(打印)。
- 反序列化的前提
- 类必须实现 Serializable
- 必须存在类对应的 class 文件。
- readObject方法声明抛出了ClassNotFoundException(class文件找不到异常)。
- 类必须实现 Serializable
十、打印流
- PrintStream
- extends OutputStream
- 打印流。
- 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
- 特点
- 只负责数据的输出,不负责数据的读取。
- 与其他输出流不同,PrintStream 永远不会抛出 IOException。
- 有特有的方法:print,println 。
- void print(任意类型的值)。
- void println(任意类型的值并换行)
- 构造方法
- PrintStream(File file)
- 输出的目的地是一个文件。
- 输出的目的地是一个文件。
- PrintStream(OutputStream out)
- 输出的目的地是一个字节输出流。
- 输出的目的地是一个字节输出流。
- PrintStream(String fileName)
- 输出的目的地是一个文件路径。
- PrintStream(File file)
- 注意事项
- 如果使用继承自父类的 write 方法写数据,那么查看数据的时候会查询编码表。 97->a
- 如果使用自己特有的方法 print/println 方法写数据,写的数据原样输出。 97->97
- 改变打印流向
- 可以改变输出语句的目的地(打印流的流向)。
- 输出语句,默认在控制台输出。
- 使用 System.setOut 方法改变输出语句的目的地改为参数中传递的打印流的目的地。
- static void setOut(PrintStream out)
- 重新分配“标准”输出流。
- 重新分配“标准”输出流。
- static void setOut(PrintStream out)
- 可以改变输出语句的目的地(打印流的流向)。
十一、File 类与 IO 完结