08.File类与IO流
一、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:\\Users\itcast\\IdeaProjects\\shungyuan\\123.txt
- 相对路径
- 是一个简化路径。
- 相对指的是相对当前项目的根目录(C:\\Users\itcast\\IdeaProjects\\shungyuan)。
- 路径可以写成:123.txt
- 注意事项
- 路径不区分大小写。
- 路径中文件名称分隔符 windows 使用反斜杠。
- 反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠。
- 绝对路径
- 构造方法
- File(String pathname)
- 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
- 参数
- String pathname:字符串的路径名称。
- 路径可以是以文件结尾,也可以是以文件夹结尾。
- 路径可以是相对路径,也可以是绝对路径。
- 路径可以是存在,也可以是不存在。
- 创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况。
- File(String parent, String child)
- 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
- 参数:把路径分成了两部分。
- String parent:父路径。
- String child:子路径。
- 父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化。
- File(File parent, String child)
- 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
- 参数
- 把路径分成了两部分。
- File parent:父路径
- String child:子路径
- 父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化。
- 父路径是 File 类型。可以使用 File 的方法对路径进行一些操作,再使用路径创建对象。
- File(String pathname)
- 常用方法
- public String getAbsolutePath()
- 返回此 File 的绝对路径名字符串。
- 无论构造方法中路径是绝对的还是相对的,getAbsolutePath 方法返回的都是绝对路径。
- public String getPath()
- 将此File转换为路径名字符串。
- 对象的toString 方法调用的就是 getPath 方法。
- 将此File转换为路径名字符串。
- public String getName()
- 返回由此File表示的文件或目录的名称。
- 获取的就是构造方法传递路径的结尾部分(文件或文件夹)。
- public long length()
- 返回由此 File 表示的文件的长度(大小,以字节为单位)。
- 文件夹是没有大小概念的,不能获取文件夹的大小。
- 如果构造方法中给出的路径不存在,那么 length 方法返回 0 。
- 返回由此 File 表示的文件的长度(大小,以字节为单位)。
- public String getAbsolutePath()
- 判断功能的方法
- public boolean exists()
- 判断此 File 表示的文件或目录是否实际存在。
- 存在: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 。
- 注意事项
- 该方法是直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎。
- public boolean mkdir()
- 创建单级空文件夹。
- public boolean mkdirs()
- 既可以创建单级空文件夹,也可以创建多级文件夹。
- 上面这两个方法的返回值:布尔值。
- true:文件夹不存在,创建文件夹,返回 true 。
- false:文件夹存在,不会创建,返回false;构造方法中给出的路径不存在返回 false 。
- 注意事项
- 此方法只能创建文件夹,不能创建文件。
- public boolean createNewFile()
- 遍历目录
- public String[] list()
- 遍历构造方法中给出的目录,会获取目录中所有文件/文件夹的名称,把获取到的多个名称存储到一个 String 类型的数组中。
- public File[] listFiles()
- 遍历构造方法中给出的目录,会获取目录中所有的文件/文件夹,把文件/文件夹封装为 File 对象,多个 File 对象存储到 File 数组中。
- 注意事项
- list 方法和 listFiles 方法遍历的是构造方法中给出的目录。
- 如果构造方法中给出的目录的路径不存在,会抛出空指针异常。
- 如果构造方法中给出的路径不是一个目录,也会抛出空指针异常。
- public String[] list()
二、递归
- 递归:指在当前方法内调用自己的这种现象。
- 递归的分类
- 递归分为两种,直接递归和间接递归。
- 直接递归:方法自身调用自己。
- 间接递归:A 方法调用 B 方法,B 方法调用 C 方法,C 方法调用 A 方法。
- 递归分为两种,直接递归和间接递归。
- 注意事项
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归。
- 递归的使用前提
- 当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归。
三、IO 概述
- 数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为
输入 input 和 输出 output
,即流向内存是输入流,流出内存的输出流。 - 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)
- 将指定的字节输出流。
- public void close()
- FileOutputStream
- 文件字节输出流.
- 作用
- 把内存中的数据写入到硬盘的文件中。
- 构造方法
- FileOutputStream(String name)
- 创建一个向具有指定名称的文件中写入数据的输出文件流。
- FileOutputStream(File file)
- 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
- 以上两个构造方法
- 参数:写入数据的目的地。
- String name:目的地是一个文件的路径。
- File file:目的地是一个文件。
- 构造方法的作用
- 创建一个 FileOutputStream 对象。
- 会根据构造方法中传递的文件/文件路径,创建一个空的文件。
- 会把 FileOutputStream 对象指向创建好的文件。
- 写入的原理(内存 --> 硬盘)
- java程序-->JVM(java虚拟机)-->OS(操作系统)-->OS调用写数据的方法-->把数据写入到文件中
- 字节输出流的使用步骤(重点)
- 创建一个 FileOutputStream 对象,构造方法中传递写入数据的目的地。
- 调用 FileOutputStream 对象中的方法 write ,把数据写入到文件中。
- 释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提供程序的效率)。
- 创建一个 FileOutputStream 对象,构造方法中传递写入数据的目的地。
- 追加写/续写:使用两个参数的构造方法
- FileOutputStream(String name, boolean append)
- 创建一个向具有指定 name 的文件中写入数据的输出文件流。
- FileOutputStream(File file, boolean append)
- 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
- 以上两个构造方法
- 参数
- String name,File file:写入数据的目的地。
- boolean append:追加写开关。
- true:创建对象不会覆盖源文件,继续在文件的末尾追加写数据。
- false:创建一个新文件,覆盖源文件。
- 参数
- FileOutputStream(String name, boolean append)
- 换行写:写换行符号
- windows:\r\n
- linux:/n
- FileOutputStream(String name)
- 常用方法
- void write(int b)
- 每次可以写出一个字节数据。
- void write(byte[] b)
- 将 b.length 字节从指定的字节数组写入此输出流。
- 如果写的第一个字节是正数(0-127),那么显示的时候会查询 ASCII 表。
- 如果写的第一个字节是负数,那第一个字节会和第二个字节,两个字节组成一个中文显示,查询系统默认码表 (GBK)。
- 将 b.length 字节从指定的字节数组写入此输出流。
- void write(byte[] b, int off, int len)
- 从指定的字节数组写入 len字节,从偏移量 off 开始输出到此输出流。
- 参数
- int off:数组的开始索引。
- int len:写几个字节。
- 参数
- 从指定的字节数组写入 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 中。
- 明确两件事情
- 方法的参数 byte[] 的作用?
- 起到缓冲作用,存储每次读取到的多个字节。
- 数组的长度一把定义为 1024(1kb) 或者 1024 的整数倍。
- 方法的返回值 int 是什么?
- 每次读取的有效字节个数
- 方法的参数 byte[] 的作用?
- 读取是一个重复的过程,可以使用循环优化,使用 while 循环,循环结束的条件,读取到 -1 为止。
- int read(byte[] b)
- 文件的复制
- 使用数组读取,每次读取多个字节,减少了系统间的 IO 操作次数,从而提高了读写的效率,建议开发中使用。
- 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:一个文件。
- 参数:读取文件的数据源
- 构造方法的作用
- 创建一个 FileReader 对象。
- 会把 FileReader 对象指向要读取的文件。
- 字符输入流使用步骤
- 创建 FileReader 对象,构造方法中绑定要读取的数据源。
- 使用 FileReader 对象中的方法 read 读取文件。
- 释放资源
- java.io.Writer
- 字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类。
- 共性方法
- void write(int c)
- 写入单个字符。
- void write(char[] cbuf)
- 写入字符数组。
- abstract void write(char[] cbuf, int off, int len)
- 写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
- void write(String str)
- 写入字符串。
- void write(String str, int off, int 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 中的方法 write,把数据写入到内存缓冲区中(字符转换为字节的过程)。
- 使用 FileWriter 中的方法 flush,把内存缓冲区中的数据,刷新到文件中。
- 释放资源(会先把内存缓冲区中的数据刷新到文件中)。
- flush 方法和 close 方法的区别
- flush:刷新缓冲区,流对象可以继续使用。
- close:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
- 追加写/续写:使用两个参数的构造方法
- FileWriter(String fileName, boolean append)
- FileWriter(File file, boolean append)
- 参数
- String fileName,File file:写入数据的目的地。
- boolean append:续写开关。
- true:不会创建新的文件覆盖源文件,可以续写。
- false:创建新的文件覆盖源文件。
- 参数
- 常用方法
- void write(char[] cbuf)
- 写入字符数组。
- abstract void write(char[] cbuf, int off, int len)
- 写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
- void write(String str)
- 写入字符串。
- void write(String str, int off, int 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()...catch
七、缓冲流
- 缓冲流,也叫高效流,是对 4 个基本的
FileXxx
流的增强,所以也是4个流,按照数据类型分类- 字节缓冲流
- BufferedInputStream,BufferedOutputStream
- 字符缓冲流
- BufferedReader,BufferedWriter
- 字节缓冲流
- 缓冲流的基本原理
- 在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统 IO 次数,从而提高读写的效率。
- BufferedOutputStream
- extends OutputStream
- 字节缓冲输出流。
- 构造方法
- BufferedOutputStream(OutputStream out)
- 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
- BufferedOutputStream(OutputStream out, int size)
- 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
- 参数
- OutputStream out:字节输出流。
- 我们可以传递 FileOutputStream,缓冲流会给 FileOutputStream 增加一个缓冲区,提高 FileOutputStream 的写入效率。
- int size:指定缓冲流内部缓冲区的大小,不指定默认。
- OutputStream out:字节输出流。
- BufferedOutputStream(OutputStream out)
- 使用步骤(重点)
- 创建 FileOutputStream 对象,构造方法中绑定要输出的目的地。
- 创建 BufferedOutputStream 对象,构造方法中传递 FileOutputStream 对象,提高 FileOutputStream 对象效率。
- 使用 BufferedOutputStream 对象中的方法 write,把数据写入到内部缓冲区中。
- 使用 BufferedOutputStream 对象中的方法 flush,把内部缓冲区中的数据刷新到文件中。
- 释放资源(会先调用 flush 方法刷新数据,第4部可以省略)
- BufferedInputStream
- extends InputStream
- 字节缓冲输入流
- 构造方法
- BufferedInputStream(InputStream in)
- 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
- BufferedInputStream(InputStream in, int size)
- 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
- 参数
- InputStream in:字节输入流。
- 我们可以传递 FileInputStream,缓冲流会给 FileInputStream 增加一个缓冲区,提高 FileInputStream 的读取效率。
- int size:指定缓冲流内部缓冲区的大小,不指定默认。
- InputStream in:字节输入流。
- BufferedInputStream(InputStream in)
- 使用步骤(重点)
- 创建 FileInputStream 对象,构造方法中绑定要读取的数据源。
- 创建 BufferedInputStream 对象,构造方法中传递 FileInputStream 对象,提高 FileInputStream 对象的读取效率。
- 使用 BufferedInputStream 对象中的方法 read,读取文件。
- 释放资源。
- BufferedWriter
- extends Writer
- 字符缓冲输出流。
- 构造方法
- BufferedWriter(Writer out)
- 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
- BufferedWriter(Writer out, int size)
- 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
- 参数
- Writer out:字符输出流。
- 我们可以传递 FileWriter,缓冲流会给 FileWriter 增加一个缓冲区,提高 FileWriter 的写入效率。
- int size:指定缓冲区的大小,不写默认大小。
- BufferedWriter(Writer out)
- 特有的成员方法
- void newLine()
- 写入一个行分隔符。会根据不同的操作系统,获取不同的行分隔符。
- void newLine()
- 使用步骤
- 创建字符缓冲输出流对象,构造方法中传递字符输出流。
- 调用字符缓冲输出流中的方法 write,把数据写入到内存缓冲区中。
- 调用字符缓冲输出流中的方法 flush,把内存缓冲区中的数据,刷新到文件中。
- 释放资源。
- BufferedReader
- extends Reader
- 字符缓冲输入流。
- 构造方法
- BufferedReader(Reader in)
- 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
- BufferedReader(Reader in, int size)
- 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
- 参数
- Reader in:字符输入流。
- 我们可以传递 FileReader,缓冲流会给 FileReader 增加一个缓冲区,提高 FileReader 的读取效率。
- int size:指定缓冲流内部缓冲区的大小,不指定默认。
- Reader in:字符输入流。
- BufferedReader(Reader in)
- 特有的成员方法
- String readLine()
- 读取一个文本行,读取一行数据。
- 行的终止符号:通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行 (\r\n)。
- 返回值
- 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null 。
- 读取一个文本行,读取一行数据。
- String readLine()
- 使用步骤
- 创建字符缓冲输入流对象,构造方法中传递字符输入流。
- 使用字符缓冲输入流对象中的方法 read/readLine 读取文本。
- 释放资源。
八、转换流
- 字符编码和字符集
- 计算机中储存的信息都是用二进制数表示的。
- 编码:按照某种规则,将字符存储到计算机中。
- 解码:将存储在计算机中的二进制数按照某种规则解析显示出来。
- 字符编码
- 就是一套自然语言的字符与二进制数之间的对应规则。
- 字符集
- 也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。
- 编码引出的问题
- 在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(InputStream in, String charsetName)
- 创建使用指定字符集的 InputStreamReader。
- 参数
- InputStream in:字节输入流,用来读取文件中保存的字节。
- String charsetName:指定的编码表名称,不区分大小写,可以是 utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8。
- InputStreamReader(InputStream in)
- 使用步骤
- 创建 InputStreamReader 对象,构造方法中传递字节输入流和指定的编码表名称。
- 使用 InputStreamReader 对象中的方法 read 读取文件。
- 释放资源。
- 注意事项
- 构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码。
九、序列化
- Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该
对象的数据
、对象的类
型
和对象中存储的属性
等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。
- ObjectOutputStream
- extends OutputStream
- 对象的序列化流,把对象以流的方式写入到文件中保存。
- 构造方法
- ObjectOutputStream(OutputStream out)
- 创建写入指定 OutputStream 的 ObjectOutputStream。
- 参数
- OutputStream out:字节输出流。
- ObjectOutputStream(OutputStream out)
- 特有的成员方法
- void writeObject(Object obj)
- 将指定的对象写入 ObjectOutputStream。
- void writeObject(Object obj)
- 使用步骤
- 创建 ObjectOutputStream 对象,构造方法中传递字节输出流。
- 使用 ObjectOutputStream 对象中的方法 writeObject,把对象写入到文件中。
- 释放资源。
- 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文件找不到异常)。
十、打印流
- 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 完结
08.File类与IO流的更多相关文章
- JavaSE学习笔记(14)---File类和IO流(字节流和字符流)
JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...
- File类与IO流
一.File类与IO流 数组.集合等内容都是把数据放在内存里面,一旦关机或者断电,数据就会立刻从内存里面消失.而IO主要讲文件的传输(输入和输出),把内存里面的数据持久化到硬盘上,如.txt .avi ...
- Java入门之File类和IO流
1.File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作 . 构造方法: public File(String pathname) :通过将 ...
- Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Properties集合、打印流)
1.IO简介 IO(输入输出)通过java.io包下的类和接口来支持,包下包括输入.输出两种IO流,每种输入输出流又可分为字符流和字节流两大类. 2.File类 File类是io包下与平台无关的文件和 ...
- Java File类与IO流
File 类 java.io.File 文件和目录路径名的抽象表示形式, 对文件或目录进行操作 构造方法: File(File parent, String child) : 根据 parent 抽象 ...
- 详谈JAVA中的file类与IO流
File类 位置于java.io包构造方法:File(String parent, String child)new file("d:\\","a.txt") ...
- IO流(File类,IO流的分类,字节流和字符流,转换流,缓冲流,对象序列化)
1.File类 File类可以在程序中 操作文件和目录.File类是通过建立File类对象,在调用File类的对象来进行相关操作的. 示例: public class Demo01 { public ...
- file类和io流
一.file类 file类是一个可以用其对象表示目录或文件的一个Java.io包中的类 import java.io.File; import java.io.IOException; public ...
- JavaSE复习(四)File类与IO流
File类 构造方法 public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例. public File(String parent ...
- 01 语言基础+高级:1-8 File类与IO流_day10【缓冲流、转换流、序列化流】
day10[缓冲流.转换流.序列化流] 主要内容 缓冲流 转换流 序列化流 打印流 教学目标 能够使用字节缓冲流读取数据到程序 能够使用字节缓冲流写出数据到文件 能够明确字符缓冲流的作用和基本用法 能 ...
随机推荐
- Windows支持多个远程连接
1.点击 开始-->运行-->输入"gpedit.msc",进入本地组策略编辑器 2.点击 计算机配置-->管理模板-->Windows组件-->远程 ...
- C# Visual Studio等,学习地址
Visual Studio 2022 学习地址 Visual Studio系列学习地址 Csharp11 学习地址 Csharp 学习地址 W3School公营,推广技术,免费学习 W3CSchool ...
- android 获取手机的唯一id,获取当前时间,获取两位随机数
//获取机器的唯一id public static String getDeviceID() { String deviceID= ""; try{ //一共13位 如果位数不够可 ...
- zabbix监控网络断网情况--初级版
zabbix初级监控,通过IMCP方式PING即可 添加网络网关IP地址,鉴于zabbix一般报警方式采取发送邮件.钉钉.微信报警需要网络环境支持,于是至少设置zabbix服务器双网通,建议有条件上三 ...
- P8201 [传智杯 #4 决赛] [yLOI2021] 生活在树上(hard version)
个人思路: 首先,题目可以转化为是否存在 \(a,b\) 路径上一点 \(u\),满足 \(w_u = dis{1,a} \oplus dis{1,b} \oplus w_{lca(a,b)} \op ...
- shr8.2视图配置注意点
- Java流程控制练习
练习 打印三角形及Debug的使用 public class TestDemo { public static void main(String[] args) { //打印三角形 5行 for(in ...
- (面试题)面试官为啥总是让我们手撕call、apply、bind?
引言 上一篇关于<面试官为啥总是喜欢问前端路由实现方式>的文章发布后,发现还是挺受欢迎的.这就给我造成了一定的困惑 之前花了很长时间,实现了一个自认为创意还不错的关于前端如何利用node+ ...
- maven工程运行环境修改 maven的java工程取mysql数据库数据
maven工程运行环境修改 <plugins> <plugin> <!-- https://mvnrepository.com/artifact/org.apache. ...
- 【Java】dto转json
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifac ...