IO流

北城以北 提交于 2020-01-17 13:32:45

一、概念介绍

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();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!