一、概念介绍
1、什么是IO流?
- I: InputStream,输入,读取,从硬盘到内存,读进来
- O: Output,输出,写入,从内存到硬盘,写出去
2、IO流的分类
(1)按照流的方向:
输入流:字节输入流/字符输入流
输出流:字节输出流/字符输出流
(2)按照流中的内容
- 字节流:计算机中的一切都是字节,可以一次操作一个/多个字节,可以操作任意类型的文件。
- 字符流:只能操作纯文本文件,用记事本打开,可以看得懂的文件。
(PS:.java、.txt、.html、.css 是纯文本文件;.doc、.xls不是纯文本文件)
3、文件的续写与换行
(1)文件的续写
构造方法:
FileOutputStream(File path, boolean append)
FileOutputStream(String path, boolean append)
其中,
参数一:String/File类型的文件路径;
参数二:boolean append(true就是追加写入,继续写;false就是重新写,覆盖写。不写默认为false)。
(2)换行
- \r\n 适用于Windows系统,每行结尾是“回车+换行”;
- \n 适用于Unix系统里,每行结尾只有“换行”;
- \r 适用于Mac系统,每行结尾是“回车”,即 “\r” 。从 Mac OS X 开始与Linux统一。
二、IO流
1、字节流
1.1、InputStream类
字节输入流的顶层抽象父类,以字节的方式读取内容的,读进来。
(1)常用方法:
public void close(): 关闭流释放资源
public int read()
- 读取一个字节byte,int接收的是单个字节的byte形式,遇到文件结束标志,返回-1,不用继续读取文件了
public int read(byte[] bs)
- 读取一些字节的内容,把读取到的多个字节的内容存储到方法参数字节数组bs中,返回的是读取到的字节的个数,遇到文件结束标志,返回-1,不用继续读取文件了
- 参数:
byte[] bs:字节数组,用来存储读取到的多个字节的内容的 - 返回值:
int:返回的是读取到的字节的个数
把字节数组变成字符串:
new String(byte[] bs): 把构造方法参数字节数组bs转换成String
new String(char[] chs): 把构造方法参数字符数组chs转换成String
把字符串变成字节数组:
public byte[] getBytes(): 把String转换成字节数组(直接用字符串.getBytes()即可得到字符数组)
(2)常用子类:
FileInputStream类:
文件字节输入流,以字节的形式读取文件内容,构造方法参数传递File/String类型的文件路径。
- read():每次读取一个字节(byte),但是返回值类型,为int类型
- read(byte[] b):每次读取多个字节,将内容放入字节数组b中,返回读取到字节的数量
BufferedInputStream类:
字节输入缓冲流,内部封装了一个1024*8的字节数组,构造方法参数传递InputStream的子类对象。
- read():每次读取一个字节(byte),但是返回值类型,为int类型
- read(byte[] b):每次读取多个字节,将内容放入字节数组b中,返回读取到字节的数量
注意:
1、对于缓冲流,千万不要自己调用flush方法
2、只需要关闭缓冲流,自动关闭缓冲流所关联的其它流对象
ObjectInputStream类:
反序列化流,从文件中的对象读取出来,构造方法参数传递InputStream的子类对象
- readObject():从文件读取一个对象出来,该对象被提升为Object类型
1.2、OutputStream类
字节输出流的抽象父类,以字节的方式写出内容的
(1)常用方法:
public void close() :关闭流对象,释放资源。
public void write(int b) :写出一个字节的内容。
public void write(byte[] b):写出一个字节数组的内容。
public void write(byte[] b, int startIndex, int len) :写出一个字节数组的一部分内容。
- 参数:
byte[] b: 字节数组
int startIndex: 起始索引
int len: 写出多少个字节
字节流写出字符串的方法:将字符串变成字符数组,可用String的成员方法:
- public byte[] getBytes(): 把String转换成字节数组(直接用字符串.getBytes()即可得到字符数组)
(2)常用子类:
FileOutputStream类:
文件字节输出流,就是以字节的形式将内容写入到文件中,构造方法参数传递File/String类型的文件路径。
- write(int b):一次写出一个字节
- write(byte[] b):将字节数组b里的内容写入到文件中
- write(byte[] b, int off, int len):将字节数组b里的内容,从索引为off的位置开始,总共写len个
BufferedOutputStream类:
字节输出缓冲流,内部封装了一个1024*8的字节数组,构造方法参数传递OutputStream的子类对象。
ObjectOutputStream类:
序列化流,将对象写入到文件,要求对象所属的类实现Serializable接口,该接口里面没有内容,只是一个标记,构造方法参数传递InputStream的子类对象。
- writeObject():将对象写入文件
2、字符流
2.1、Reader类
字符输入流的抽象父类,以字符的方式读取内容的。
(1)常用方法:
public void close(): 关闭流释放资源
public int read(): 读取一个字符,返回字符的int型数字。使用时,需要将int型数字转换成char类型字符来显示。
- 方法–> char ch =(char)int; 遇到文件结束标志,返回-1,不用继续读取文件了
public int read(char[] chs): 读取一个字符数组,把读取到的多个字符的内容存储到方法参数字符数组chs中,返回的是读取到的字符的个数。遇到文件结束标志,返回-1,不用继续读取文件了
- 参数:
char[] chs:字符数组,用来存储读取到的多个字符的内容的 - 返回值:
int:返回的是读取到的字符的个数
(2)常用子类:
FileReader类:
文件字符输入流,就是以字符的形式读取文件中的内容。
- read():每次读取一个字符,即可以按照字符大小读取,返回值类型提升为int类型
- read(char[] b):每次读取多个字符,将内容放入字符数组b中,返回读取字符的数量
BufferedReader类:
字符输入缓冲,内部封装了一个1024*8的字符数组,构造方法参数传递Reader的子类对象。
- readLine():可以读取一行字符(不包含换行符号)
InputStreamReader类:
字节输入流到字符输入流的桥梁,是一个字符流,以字符的方式读取内容的创建对象时构造方法,传递InputStream的子类对象并指定编码表。
2.2、Writer类
字符输出流的顶层抽象父类,以字符的方式写出内容的。
(1)常用方法:
public abstract void close() :关闭流,释放资源。
public abstract void flush() :把缓冲区中的内容,刷新到目的地。
public void write(int c) :写出一个字符。
public void write(char[] chs):写出去一个字符数组。
- String类方法:
char[] ch = (String s).toCharArray();
public abstract void write(char[] chs, int startIndex, int len) :写出去一个字符数组的一部分。
- 参数:
char[] chs:字符数组
int startIndex:起始索引
int len:写出多少个字符
public void write(String str) :写出一个字符串。
public void write(String str, int startIndex, int len) :写出一个字符串的一部分。
- 参数:
String str:字符串
int startIndex:起始索引
int len:写出多少个字符
(2)常用子类:
FileWriter类:
文件字符输出流,就是以字符的形式将内容写入到文件中。
- write(int c):写出一个字符。
- write(char[] cbuf):写出一个字符数组
- write(char[] b, int off, int len):将字符数组b里的内容,从所以为off的位置开始,总共写len个
- write(String str):写出一个字符串
- write(String str, int off, int len):写出一个字符串的一部分
BufferedWriter类:
字符输出缓冲流,内部封装了一个1024*8的字符数组,构造方法参数传递Writer的子类对象。
- newLine():可以输出一个跨平台的换行符号"\r\n",该换行符会根据平台自动选择合适的换行符
OutputStreamWriter类:
字符输出流到字节输出流的桥梁,是一个字符流,以字符的方式写出内容的创建对象时构造方法,传递OutputStream的子类对象并指定编码表。
三、流的转换
1、InputStream >> BufferedReader
给一个InputStream,转换成BufferedReader,实现文件的按行复制:readLine()
InputStream is = new FileInputStream("file\\GBK.txt");
// InputStreamReader字节输入流到字符输入流的桥梁
// 把InputStream 转换成 InputStreamReader(Reader的子类)
Reader R = new InputStreamReader(is, "GBK");
// InputStreamReader(Reader的子类) --> BufferedReader
BufferedReader br = new BufferedReader(R);
2、OutputStream >> BufferedWriter
给一个OutputStream,转换成BufferedWriter,实现换行操作(newLine)
OutputStream os = new FileOutputStream("file\\UTF-8.txt");
// OutputStreamWriter字符输出流到字节输出流的桥梁
// 把OutputStream 转换成 OutputStreamWriter(Writer的子类)
Writer w = new OutputStreamWriter(os, "UTF-8");// OutputStreamWriter(Writer的子类) --> BufferedWriter
BufferedWriter bw = new BufferedWriter(w);
3、转换后的演示:
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
br.close();
bw.close();
四、序列化与反序列化
1、序列化(serialize)
1.1、概念:
把对象保存到文件中,写出的是一个对象的完整的字节内容,就是序列化。
1.2、java.io.ObjectOutputStream类:
该类可以完成对象的序列化,把对象保存到文件中。
1.3、构造方法:
- public ObjectOutputStream(OutputStream out)
参数:
OutputStream out:字节输出流抽象父类,传递子类对象
1.4、常用方法:
- public void writeObject(Object obj):把方法参数中指定的对象obj,写出到文件中
1.5、注意事项:
序列化操作中,对象的类一定要实现Serializable接口,Serializable为标记型接口(接口中没有任何内容)。
2、反序列化
2.1、概念:
从文件中读取出一个对象,读取出对象的完整的字节内容,就是反序列化。
2.2、java.io.ObjectInputStream类:
该类可以完成反序列化,从文件中读取一个对象。
2.3、构造方法:
- public ObjectInputStream(InputStream in)
参数:
InputStream in:字节输入流抽象父类,传递子类对象
2.4、常用方法:
- public Object readObject():从文件中读取出一个对象,该对象被提升为Object类型
五、打印流
1、java.io.PrintStream类
1.1、构造方法:
- public PrintStream(File/String path):传递File/String类型的文件路径
1.2、特有方法:
做的是原样输出
- print(xxx):原样输出,不带换行
- println(xxx):原样输出,带换行
2、java.lang.System类
2.1、静态方法:
- public static void setOut(PrintStream out):重新分配“标准”输出流。
参数:
PrintStream out:打印流对象,而打印流的输出目的地可以设置成文件 - public static long nanoTime():获取系统的纳秒值。
演示:
long val = System.nanoTime();
来源:CSDN
作者:卸甲
链接:https://blog.csdn.net/weixin_44975741/article/details/104008473