JAVA_SE_笔记整理(流)

1IO流概述

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:

Linux:

Mac:

如何实现数据的追加写入?

构造方法: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、转换流(OutputStreamWriterInputStreamReader

为什么是转换流:字符流由字节流转换而来所以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) 
          根据给定的 File 对象构造一个 FileWriter 对象。

FileWriter(File file, boolean append) 
          根据给定的 File 对象构造一个 FileWriter 对象。

FileWriter(FileDescriptor fd) 
          构造与某个文件描述符相关联的 FileWriter 对象。

FileWriter(String fileName) 
          根据给定的文件名构造一个 FileWriter 对象。

FileWriter(String fileName, boolean append)

成员方法与OutputStreamWriter相同

FileReader

构造方法:

FileReader(File file) 
          在给定从中读取数据的 File 的情况下创建一个新 FileReader。

FileReader(FileDescriptor fd) 
          在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。

FileReader(String fileName) 
          在给定从中读取数据的文件名的情况下创建一个新 FileReader。

成员方法与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();

原文地址:https://www.cnblogs.com/songliuzhan/p/12624144.html