目录
1.概述
存储和读取数据的解决方案,用于读写文件,或网络中的数据
字节流:
2.分类
流的方向:
操作文件类型:
**纯文本文件:**用windows系统自带的记事本打开并且能读懂的文件
3.输入文件数据
1.创建对象
续写:
**注意:**如果想续写,打开续写开关即可,第二个参数为开关的位置,默认false为关闭续写,反之,true为打开续写,此时创建对象不会清空文件
不续写:
注意:
1.参数是字符串表示的路径或者是File对象都是可以的
2.如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
3.如果文件已经存在,则会清空文件
2.写出数据
off:起始索引 len:个数
**注意:**write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
换行符:
windows: \r\n
Linux: \n
Mac: \r
3.释放资源
**注意:**每次使用完流之后都要释放资源
4.读出文件数据
1.创建对象
**注意:**如果文件不存在,就直接报错
2.读取数据
**注意:**一次读一个字节数组的数据,每次读取会尽可能把数组填满
注意:
1.一次读一个字节,读出来的是数据在ASCII上对应的数字
2.读到文件末尾了,read方法返回-1
3.释放资源
单字节拷贝vs多字节拷贝
单字节拷贝
java
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
//输出文件对象
FileInputStream fileInputStream = new FileInputStream("D:\\bbbb\\975a37e67072125d093411fa609c7ef9.mp4");
//输入文件对象
FileOutputStream fileOutputStream = new FileOutputStream("D:\\aaaa\\新建.mp4");
int b;//取出数据
long l = System.currentTimeMillis();
while ((b=fileInputStream.read())!=-1){
fileOutputStream.write(b);
}
long l1 = System.currentTimeMillis();
fileOutputStream.close();
fileInputStream.close();
System.out.println(l1-l);
}
}
运行结果
多字节拷贝
java
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
//输出文件对象
FileInputStream fileInputStream = new FileInputStream("D:\\bbbb\\975a37e67072125d093411fa609c7ef9.mp4");
//输入文件对象
FileOutputStream fileOutputStream = new FileOutputStream("D:\\aaaa\\新建.mp4");
int len;//取出数据
byte [] b1=new byte[1024*1024*5];
long l = System.currentTimeMillis();
while ((len=fileInputStream.read(b1))!=-1){
fileOutputStream.write(b1,0,len);
}
long l1 = System.currentTimeMillis();
fileOutputStream.close();
fileInputStream.close();
System.out.println(l1-l);
}
}
运行结果
5.字符集
a.ASCII
b.GBK
注意:
1.汉字两个字节存储
2.高位字节二进制一定以1开头,转成十进制之后是一个负数
3.英文一个字节存储,兼容ASCII,二进制前面补0
c.Unicode
UTF-8(编码方式):
ASCII 1个字节
拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文 2字节
中日韩文字、东南亚文字、中东文字 3字节
**注意:**编码中文时,第一个字节的首位是1
6.乱码
产生原因:
1.读取数据时未读完整个汉字
**字节流:**一次读取一个字节
2.编码和解码时的方式不统一
处理方法:
1.不要用字节流读取文本文件
2.编码解码时使用同一个码表,同一个编码方式
7.编码、解码常见方法
a.编码方法
1.默认方式编码
2.指定方式编码
b.解码方式
1.默认方式解码
2.指定方式解码
字符流:
8.概述
**字符流:**字符流的底层其实就是字节流
特点:
**输入流:**一次读一个字节,遇到中文时,一次读多个字节
**输出流:**底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中
**使用场景:**对于纯文本文件进行读写操作
8.读取文件数据
a.创建字符输入流对象
b.读取数据
**字符读入数组:**进行了强制类型转换
注意:
1.按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数
2.读到文件末尾了,read方法返回-1
c.释放资源
9.输入文件数据
a.创建字符输出流对象
注意:
1.参数是字符串表示的路径或者File对象都是可以的
2.如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
3.如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关
b.写入数据
**注意:**如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符
c.释放资源
10.字符输入流原理
a.创建字符输入流对象
**底层:**关联文件,并创建缓冲区(长度为8192的字节数组)
c.读取数据
底层:
1.判断缓冲区中是否有数据可以读取
**2.缓冲区没有数据:**就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区
如果文件中也没有数据了,返回-1
**3.缓冲区有数据:**就从缓冲区中读取。
空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回
有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中
11.字符输出流原理
内存中也存在一个缓冲区(长度为8192的字节数组),从内存中的缓冲区向目的地文件中写出数据需要满足三种情况之一:
**情况一:**缓存区装满了
**情况二:**flush()刷新
**情况三:**close()关流