字节流
字节流,OutputStream,InputStream

IO 即 Input/Output
,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。
Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。
InputStream
/Reader
: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。OutputStream
/Writer
: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
Java为什么要区分字节流和字符流?
字节流用于处理 8 位的字节数据。它们主要用于处理二进制数据,例如图片、音频、视频文件或其他任何类型的非文本文件。
字节流的主要特点:
- 不处理编码问题:字节流直接处理原始的字节数据,不进行任何字符编码转换。这使得它们非常适合处理二进制数据。
- 性能:由于不进行编码转换,字节流在处理原始数据时可能比字符流更高效。
字符流用于处理 16 位的字符数据。它们主要用于处理文本数据(如文本文件、字符串)。字符流是由 Reader
和 Writer
及其子类来实现的。
字符流的主要特点:
- 处理编码问题:字符流会根据指定的字符编码(如 UTF-8、ISO-8859-1)对字节数据进行编码和解码,从而正确地处理文本数据。
- 方便文本处理:字符流提供了更高级的文本处理功能,例如按行读取、读取指定长度的字符等。
OutputStream: 字节输出流
此抽象类是表示输出字节流的所有类的超类
定义了一些子类共性的成员方法:
public void close() :关闭此输出流并释放与此流相关联的任何系统资源
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出
**public void write(byte[] b)**:将 b.length字节从指定的字节数组写入此输出流
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流
public abstract void write(int b) :将指定的字节输出流
FileOutputStream:文件字节输出流
java.io.FileOutputStream extends OutputStream
作用:把内存中的数据写入到硬盘的文件中
构造方法:
FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流,String name目的地是一个文件的路径
FileOutputStream(File file):创建一个向指定 File 对象表示的文件中写入数据的文件输出流,File file目的地是一个文件
写入数据的原理(内存–>硬盘)
Java程序–>JVM(java虚拟机)–>OS(操作系统)–>OS调用写数据的方法–>把数据写入到文件中
字节输出流的使用步骤(重点):
- 创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
- 调用FileOutputStream对象中的方法write,把数据写入到文件中
- 释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提供程序的效率)
1 |
|
**public void write(byte[] b)**:将 b.length字节从指定的字节数组写入此输出流
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流
1 |
|
数据追加续写
**FileOutputStream(String name, boolean append)**:创建一个向具有指定 name 的文件中写入数据的输出文件流。
FileOutputStream(File file, boolean append) :创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
append:一个 boolean
参数,用于指示是否以追加模式打开文件。如果为 true
,则在文件末尾追加数据;如果为 false
,则清除文件内容,从头开始写入。
1 |
|
写换行符号
windows:\r\n
linux:/n
mac:/r
InputStream:字节输入流
此抽象类是表示字节输入流的所有类的超类
定义了所有子类共性的方法:
int read():从输入流中读取数据的下一个字节,返回字节的ASCII,如果未读取任何字节,则代码返回 -1
,表示文件结束。
int read(byte[] b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中,返回读取字节个数
void close():关闭此输入流并释放与该流关联的所有系统资源
FileInputStream:文件字节输入流
java.io.FileInputStream extends InputStream
作用:把硬盘文件中的数据,读取到内存中使用
构造方法
FileInputStream(String name):String name文件的路径
FileInputStream(File file):File file文件
读取数据的原理(硬盘–>内存)
Java程序–>JVM–>OS–>OS读取数据的方法–>读取文件
字节输入流的使用步骤(重点):
- 创建FileInputStream对象,构造方法中绑定要读取的数据源
- 使用FileInputStream对象中的方法read,读取文件
- 释放资源
1 |
|
int read(byte[] b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组中,返回数组长度
明确两件事情:
- 方法的参数byte[]的作用?起到缓冲作用,存储每次读取到的多个字节数组的长度,一般定义为1024(1kb)或者1024的整数倍
- 方法的返回值int是什么? 每次读取的有效字节个数
1 |
|