一,IO流
1.IO流介绍
以前我们是通过变量,数组,或者集合存储数据,都是不能永久化存储,数据都是存储在内存中,只要代码运行结束,所有数据都会丢失
IO流的目的:
- 将数据写到文件中,实现数据永久化存储
- 把文件中的数据读取到内存中(Java程序)
I 表示intput ,是数据从硬盘进内存的过程,称之为读数据。
O 表示output ,是数据从内存到硬盘的过程。称之为写数据。
2.IO的分类
根据数据的流向分为:输入流和输出流
- 输入流:把数据从硬盘上读取到内存中的流。
- 输出流:把数据从内存 中写出到硬盘上的流。
根据数据的类型分为:字节流和字符流
- 字节流:以字节为单位,操作所有类型的文件,包括音频视频图片等
- 字符流:以字符为单位,只能操作纯文本文件。能用windows记事本打开并能读的懂。
3.IO的顶层父类
- 字节输入流:顶层父类 InputStream 抽象类
- 字节输出流:顶层父类 OutputStream 抽象类
- 字符输入流:顶层父类 Reader 抽象类
- 字符输出流:顶层父类 Writer 抽象类
二.字节流
节流可以传输任意文件数据。在操作流的时候,要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。
1.字节输出流OutputStream
java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。
- public abstract void write(int b):一次写一个字节数据。
- public void write(byte[] b):一次写一个字节数组数据。
- public void write(byte[] b, int off, int len) :一次写一个字节数组的部分数据
- public void close():关闭此输出流并释放与此流相关联的任何系统资源。
2.FileOutputStream类
java.io.FileOutputStream类是OutputStream类的子类,用来表示是文件输出流,用于将数据写出到文件。
FileOutputStream类的构造方法
- public FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。
- public FileOutputStream(String name): 创建文件输出流以指定的名称写入文件。
当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件的数据。
3 数据换行与追加
以上的演示,每次程序运行,创建输出流对象,都会清空目标文件中的数据。
保留目标文件中数据,还能继续添加新数据:
public FileOutputStream(File file, boolean append): 创建文件输出流以指定的名称写入文件。如果第二个参数为true ,不会清空文件里面的内容。
public FileOutputStream(String name, boolean append): 创建文件输出流以指定的名称写入文件。如果第二个参数为true ,不会清空文件里面的内容。
换行(windows:\r\n)
4 字节输入流InputStream
java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。
- public abstract int read(): 每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回 -1。
- public int read(byte[] b): 每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回 -1。
- public void close():关闭此输入流并释放与此流相关联的任何系统资源
5. FileInputStream类
概述:java.io.FileInputStream 类是InputStream类的子类 , 用来表示文件输入流,从文件中读取字节。
构造方法:
- FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的文件对象 file命名。
- FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
当创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException
6 读取字节
nt read(),每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1。
7 IO资源的处理
8 读字节数组
int read(byte[] b) 每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1
三.字节缓冲流
缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类:
- 字节缓冲流:BufferedInputStream,BufferedOutputStream
- 字符缓冲流:BufferedReader,BufferedWriter
字节缓冲流的构造方法:
字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作
- public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
- public BufferedOutputStream(OutputStream out): 创建一个新的缓冲输出流。
四.Properties集合
1. Properties类的概述
java.util.Properties 继承于Hashtable,来表示一个持久的属性集。它使用键值结构存储数据,每个键及其对应值都是一个字符串。
2. Properties类的构造方法
public Properties() :创建一个空的属性列表。
3 .Properties类存储方法
- public Object setProperty(String key, String value): 保存一对属性。
- public String getProperty(String key) :使用此属性列表中指定的键搜索属性值。
- public Set stringPropertyNames() :获取所有键的名称的集合。
4 Properties类与流相关的方法
作用:通过流对象,可以关联到配置文件上,这样就能够加载配置文件中的数据了。
- public void load(InputStream inStream):以字节流形式 , 把文件中的键值对, 读取到集合中
- public void load(Reader reader):以字符流形式 , 把文件中的键值对, 读取到集合中
- public void store(OutputStream out, String comments):把集合中的键值对,以字节流形式写入文件中 , 参数二为注释
- public void store(Writer writer, String comments):把集合中的键值对,以字符流形式写入文件中 , 参数二为注释
注意事项:文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔
如果配置文件中有中文,那么加载文件文件时,使用字符流,但是开发中一般配置文件中不要写中文
5 .ResourceBundle工具类
java.util.ResourceBundle它是一个抽象类我们可以使用它的子类PropertyResourceBundle来读取以.properties结尾的配置文件。
通过静态方法直接获取对象:static ResourceBundle getBundle(String baseName) 可以根据名字直接获取默认语言环境下的属性资源。参数注意: baseName
属性集名称不含扩展名。
属性集文件是在src目录中的
ResourceBundle中常用方法:String getString(String key) : 通过键,获取对应的值