IO流的相关概念 【了解】
IO流-字节基本流 【重点】
IO流-字节缓冲流 【重点】
IO流-字节流读中文的问题 【了解】
IO流的相关概念 【了解】
IO流的概述
什么是IO流
I:input,输入
O:output,输出
IO流就是输入输出流
IO流的作用
可以处理设备(硬盘、内存、控制台和打印机等...)之间的数据传输
我们学习IO流主要研究的是硬盘和内存之间的数据传输
IO流的使用场景
文件的读取
文件的写出
文件的复制
文件的上传
文件的下载
...
IO流的注意事项
1、IO流涉及的类都在java.io包下,不要导错包
2、IO流的每一个操作都有编译时异常,编译时期必须处理
3、IO流会占用系统资源,使用完必须关闭流
IO流的分类
按照流向分
输入流
输出流
按照流向分,到底是输入还是输出,参照物是内存
按照操作的数据的类型分
字节流
字符流
字节:byte
字符:char
计算机底层所有的数据都是0和1这样的二进制位的数据组成,8个二进制数称为一个字节
字符是由一个或者多个字节组成
体系结构
字节输入流
InputStream抽象类
|-FileInputStream类 字节基本流
|-FilterInputStream
|-BufferedInputStream类 字节缓冲流
字节输出流
OutputStream抽象类
|-FileOutputStream类 字节基本流
|-FilterOutputStream
|-BufferedOutputStream类 字节缓冲流
字符输入流
Reader抽象类
|-BufferedReader类 字符缓冲流
|-InputStreamReader类 转换流
|-FileReader类 字符基本流
字符输出流
Writer抽象类
|-BufferedWriter类 字符缓冲流
|-OutputStreamWriter类 转换流
|-FileWriter类 字符基本流
IO流的学习非常简单,因为IO流其实就是在学习6行代码
输入:3行
输出:3行
输入和输出这分别3行的代码对应的是IO流操作的三个步骤:
1、创建流对象,关联要操作的文件
2、读或者写操作
3、关闭流
IO流-字节基本流 【重点】
FileOutputStream类
它的父类是OutputStream抽象类,父类中定义了所有的字节输出流的共性方法:
void write(byte[] b):一次写出一个字节数组(多个字节)
void write(byte[] b, int off, int len):一次写出一个字节数组的一部分(多个字节)
void write(int b):一次写出一个字节
void close() :关闭流,释放资源
FileOutputStream名称解析:
File:操作的设备类型,File表示操作的是文件(硬盘)
OutputStream:表示该流是字节输出流
所以这个类可以让我们将内存中的数据输出(写)到文件中。
构造方法
FileOutputStream(String name)
FileOutputStream(File file)
* 参数
要关联的文件,可以传递文件的全路径名,也可以传递文件的File对象
一次写出多个字节的操作
void write(byte[] b):一次写出一个字节数组(多个字节)
void write(byte[] b, int off, int len):一次写出一个字节数组的一部分(多个字节)
* 参数
int off:起始索引
int len:写出的个数
两个小问题
如何换行写
windows \r\n
mac \r
linux \n
如何追加写
FileOutputStream(String name, boolean append)
FileOutputStream(File file, boolean append)
* boolean append是否追加的开关
如果传递的true,表示追加
FileInputStream类
它的父类是InputStream抽象类,父类中定义了所有的字节输入流的共性方法:
int read():一次读取一个字节,如果读取到文件末尾则返回-1
int read(byte[] b):一次读取一个字节数组(多个字节),
返回的是读取到数组中的有效字节个数
如果读取到文件末尾则返回-1
void close() :关闭流,释放资源
FileInputStream名称解析:
File:操作的设备类型,File表示操作的是文件(硬盘)
InputStream:表示该流是字节输入流
所以这个类可以让我们从文件中输入(读取)数据到内存中。
IO流-字节缓冲流 【重点】
字节缓冲流:也可以称为字节高效流,可以提高读写的效率
缓冲流,原因是底层有缓冲区(其实就是数组)
BufferedOutputStream类
它的父类是OutputStream抽象类,父类中定义了所有的字节输出流的共性方法:
void write(byte[] b):一次写出一个字节数组(多个字节)
void write(byte[] b, int off, int len):一次写出一个字节数组的一部分(多个字节)
void write(int b):一次写出一个字节
void close() :关闭流,释放资源
构造方法
BufferedOutputStream(OutputStream out)
BufferedInputStream类
它的父类是InputStream抽象类,父类中定义了所有的字节输入流的共性方法:
int read():一次读取一个字节,如果读取到文件末尾则返回-1
int read(byte[] b):一次读取一个字节数组(多个字节),
返回的是读取到数组中的有效字节个数
如果读取到文件末尾则返回-1
void close() :关闭流,释放资源
构造方法
BufferedInputStream(InputStream in)
注:缓冲流不能直接关联文件
BufferedInputStream
内置了一个默认长度为8192的字节数组(缓冲区)
IO流-字节流读中文的问题 【了解】
出现乱码问题
编码表
什么是编码表
是一张计算机能识别的内容(二进制/字节)和人类能识别的内容(字符)的对应关系表
01100001 a
01100010 b
常见的编码表
ASCII码表:第一张码表,只有美国/英国常用的文字、数字和符号的对应关系表
内部不包含中文的对应关系
GBK码表:内置ASCII码表,包含中文
1个英文字母、数字这些字符占1个字节
1个中文占2个字节
Unicode码表:统一、万国码表,类似于联合国,里面包含大部分主要国家的文字、符号
当然里面也包含中文
UTF-8编码格式:
1个英文字母、数字这些字符占1个字节
1个中文占3个字节
IOS-8859-1码表:西欧/拉丁编码,里面不包含中文
编码和解码操作
编码:字符->字节
解码:字节->字符
编码和解码操作都需要查询编码表,并且要保证编码和解码使用的编码表是相同的,否则会出现乱码问题
字符串的编码和解码操作
针对字符串(String)
编码
byte[] getBytes():使用idea的默认编码表(utf-8)进行编码操作
byte[] getBytes(String charsetName) :使用指定的编码表进行编码操作
解码
String(byte[] bytes) :使用idea的默认编码表(utf-8)进行解码操作
String(byte[] bytes, String charsetName) :使用指定的编码表进行解码操作