目录
1.概述
字节流:
2.分类
3.输入文件数据
1.创建对象
2.写出数据
3.释放资源
4.读出文件数据
1.创建对象
2.读取数据
3.释放资源
5.字符集
a.ASCII
b.GBK
c.Unicode
6.乱码
7.编码、解码常见方法
a.编码方法
1.默认方式编码
2.指定方式编码
b.解码方式
1.默认方式解码
2.指定方式解码
字符流:
8.概述
8.读取文件数据
a.创建字符输入流对象
b.读取数据
c.释放资源
9.输入文件数据
a.创建字符输出流对象
b.写入数据
c.释放资源
10.字符输入流原理
a.创建字符输入流对象
c.读取数据
11.字符输出流原理
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多字节拷贝
单字节拷贝
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);}
}
运行结果
多字节拷贝
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()关流