JAVA_SE_笔记整理(流)
流
1、IO流概述
IO流用来处理设备之间的数据传输
上传文件和下载文件
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
IO流分类:
按照数据流向:
输入流、读入数据 (针对于内存而言)
输出流、写出数据
按照数据类型:
字节流
字符流
什么情况下使用哪种流呢?
如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。如果不知道是什么文件,默认使用字节流。
IO流常用基类
字节流的抽象基类:InputStream,OutputStream,
字符流的抽象基类:Reader,Writer
注意:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀
如:InputStream的子类FileInputStream
如:Reader的子类FileReader
2、字节流写入数据
写入数据:将数据从内存写入到硬盘。OutputStream
FileOutputStream
往一个文本文件中写入一句话:“HelloWorld”
构造方法:
FileOutputStream(File file)
FileOutputStream(String name)
成员方法:
public void write(int b) // 写入一个int类型的数据
public void write(byte[] b) // 写入一个byte[] 类型的数据
public void write(byte[] b,int off,int len) // 写入一个byte[]类型的数据,这里指定开始位置,和长度。
数据写成功后,为什么要close()? 释放资源
如何实现数据的换行?
Windows:\r\n
Linux:\n
Mac:\r
如何实现数据的追加写入?
构造方法:FileOutputStream(String name, boolean append) // 参数二,为true追加到末尾
3、字节流读取数据
将其他位置的数据读入到内存。InputStream
FileInputStream 读入文件
把刚才写的数据读出显示到控制台
FileInputStream的构造方法
FileInputStream(File file)
FileInputStream(String name)
成员方法:
public int read()
public int read(byte[] b)
4、字节缓冲流
BufferedOutputStream // 需要OutputStream
BufferedInputStream // 需要 InputStream
IO流
1、转换流(OutputStreamWriter、InputStreamReader)
为什么是转换流:字符流由字节流转换而来所以outputStreamWriter称为转换流。
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。
OutputStreamWriter
构造方法:
public OutputStreamWriter(OutputStream out) // 需要输出字节流
public OutputStreamWriter(OutputStream out,String charsetName) // 需要输出字节流、编码方式
成员方法:
public void write(int c)
public void write(char[] cbuf)
public void write(char[] cbuf,int off,int len)
public void write(String str)
public void write(String str,int off,int len)
字符流操作注意问题:
flush()的作用
flush()和close()的区别
缓冲区中的数据保存直到缓冲区满后才写出,也可以使用flush方法将缓冲区中的数据强制写出或使用close()方法关闭流,关闭流之前,缓冲输出流将缓冲区数据一次性写出。flush ()和close()都使数据强制写出,所以两种结果是一样的,如果都不写的话,会发现不能成功写出。
InputStreamReader
构造方法:
public InputStreamReader(InputStream in) // 需要输出字节流
public InputStreamReader(InputStream in,String charsetName) // 需要输出字节流、编码方式
成员方法:
public int read()
public int read(char[] cbuf)
字节流与字符流的区别
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的,一个操作字符,一个操作字节。
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区(即强制输出缓冲区内容),这时才能在不close的情况下输出内容
二者使用:如果有字符操作,用字符流,否则用字节流。
2、字符流
转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类。
FileWriter 写出
FileReader 读入
FileWriter
构造方法:
FileWriter(File file) |
FileWriter(File file, boolean append) |
FileWriter(FileDescriptor fd) |
FileWriter(String fileName) |
FileWriter(String fileName, boolean append) |
成员方法与OutputStreamWriter相同
FileReader
构造方法:
FileReader(File file) |
FileReader(FileDescriptor fd) |
FileReader(String fileName) |
成员方法与OutputStreamReader相同
3、字符缓冲流
BufferedWriter
BufferedReader
特殊功能:
BufferedWriter
void newLine() // 写出一个换行符
BufferedReader
String readLine() // 读入一行数据
BufferedWriter
构造方法:
BufferedWriter(Writer out) |
BufferedWriter(Writer out, int sz) |
成员方法:
void newLine() // 写出一个换行符
BufferedReader
构造方法:
BufferedReader(Reader in) |
BufferedReader(Reader in, int sz) |
成员方法:
String readLine() // 读入一行数据
4、小结:
字节流
字节输入流 InputStream
FileInputStream
BufferedInputStream
字节输出流 OutputStream
FileOutputStream
BufferedOutputStream
字符流
字符输入流 Reader
InputStreamReader(FileReader)
BufferedReader
字符输出流 Writer
OutputStreamWriter(FileWriter)
BufferedWriter
5、对象序列化
概念
序列化:把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
ObjectOutputStream
代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。只有实现了Serializable和Externalizable接口的类的对象才能被序列化。
概述ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。
代码样例:
FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(12345);
oos.writeObject("Today");
oos.writeObject(new Date());
oos.close();
ObjectInputStream
代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
代码样例:
FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
int i = ois.readInt();
String today = (String) ois.readObject();
Date date = (Date) ois.readObject();
ois.close();