io流用来读写文件中的数据 i:input o:output
1、按流的方法分为:输入流、输出流
2、按操作文件的类型分为:字节流、字符流
其中字节流能处理所有类型的文件 字符流只能处理纯文本文件
纯文本文件可以通过windows自带的记事本能打开且内容可以看得懂 包括txt、md文件
总结:
(1)、概念
操作本地文件的字节输出流 可以将程序中的数据写到本地文件
(2)、步骤
1、创建对象(让程序和文件之间建立一个通道)
2、写数据
3、释放资源(断开程序和文件之间建立一个通道)
防止java程序占用资源 使得在其它程序中可以打开
(3)、细节
细节1:
细节2:
(4)、写数据的三种方式
FileOutputStream对象.write(int b) 一次写一个字节数据
FileOutputStream对象.write(byte [] b) 一次写一个字节数组数据
FileOutputStream对象.write(byte [] b,int off,int len) 一次写一个字节数组部分数据
off表示起始索引 len表示写入的总个数
方式一:
方式二:
方式三:
(5)、换行写、续写
换行写:添加
续写:在创建FileOutputStream对象是 添加参数true
(6)、小结
(1)、概念
操作本地文件的字节输入流 可以将本地文件的数据输入到程序中
(2)、步骤
1、创建对象(让程序和文件之间建立一个通道)
2、读数据
3、释放资源(断开程序和文件之间建立一个通道)
防止java程序占用资源 使得在其它程序中可以打开
(3)、细节
细节1:
(4)、循环读取
(5)、读数据的两种方式
一次读取一个字节在之前我们已经学习了 现在我们重点学习一次读取多个字节
步骤:
1、创建对象(让程序和文件之间建立一个通道)
2、创建动态数组 数组的长度决定了每次最多读取的个数
3、通过对象.read(数组);存放读到的数据 并通过int len存放返回值
4、创建字符串 String str=new String(bytes,0,len);
5、输出字符串 即可输出读到的数据
防止java程序占用资源 使得在其它程序中可以打开
通过边读边写的思想,先将文件读取到程序中,再将程序中的数据写到另一个文件中
当拷贝的文件过大时 我们可以通过一次读取多个数据进行读取 提高速度
无论是图片、word、excel、视频等都可以进行复制
如果是文件则直接拷贝 如果是文件夹则需要递归
通过字节流读取文件和写入文件 都是写入对应的编码值
对文件进行加密时 我们就可以将读取文件a得到的字节数据(编码值)进行改变写入文件b
对文件b进行解密时我们就可以将读取文件b得到的字节数据(编码值)进行改变使之变成与读取文件a得到的字节数据一样的数据写入文件c
如何实现?
之间我们学习过异或运算 数1与另一个数2异或两次即可得到原来的数1
我们就可以将数1与另一个数2异或一次看成加密过程
将数1与另一个数2的结果再与数2异或的过程看成解密过程
加密:
解密:
io流字符集包括ASCII字符集、GBK字符集、Unicode字符集
数据存储在计算机的形式都是补码!!!
(1)、ASCII字符集
ASCII字符集没有中文的编码
(2)、GBK字符集
存储英文和ASCII字符集存储英文的格式一样
(3)、Unicode字符集
为了统一各个国家的编码 创建了Unicode字符集
Unicode字符集包含了以下三种编码规则:UTF-8、UTF-16、UTF-32
现在我们详细介绍UTF-8的编码规则:
在UTF-8的编码规则下,英文占一个字节,中文占3个字节(且第一个字节的首位是1)
如果是英文,找到Unicode字符集下的编码值后在前面加0即可得到它存储在计算机的值
如果是中文,找到Unicode字符集下的编码值后将其按4 6 6 分成3部分,第一部分前面加1110,第二部分前面加10,第三部分前面加10,即可得到它存储在计算机的值
(4)、字符集小结
(5)、产生乱码的原因
1、读取数据时没有读完整个汉字
因为一个汉字按GBK字符集需要2个字节的存储空间、按Unicode字符集需要3个字节的存储空间,而字节流每次读取一个字节,就会导致汉字未读完
2、解码规则和编码规则不一致
因为一个汉字按GBK字符集需要2个字节的存储空间、按Unicode字符集需要3个字节的存储空间,如果按Unicode字符集中UTF-8编码而用GBK字符集进行解码就会将3个字节拆分成2个字节、1个字节进行解码
(6)、解决乱码
(7)、编码
在idea中默认的编码方式是UTF-8,在eclipse默认的编码方式是GBK
语法1:
字符串.getBytes();
语法2:
字符串.getBytes(指定字符集); 使用指定字符集进行编码
(8)、解码
在idea中默认的解码方式是UTF-8,在eclipse默认的解码方式是GBK
语法1:
new 字符串(字节数组);
语法2:
new 字符串(字节数组,指定字符集); 使用指定字符集进行编码
(1)、概念
操作本地文件的字符输入流 可以将本地文件的数据读取到程序中
(2)、步骤+细节
1、创建对象(让程序和文件之间建立一个通道)
细节:如果文件不存在则会报错
语法1:
FileReader fr=new FileReader(字符串表示的路径);
语法2:
FileReader fr=new FileReader(文件对象表示的路径);
2、读数据
语法1:无参read方法 一次读取一个数据,返回值为读取的数据(是数据对应的码值),读到末尾返回-1
字符流对象.read();
语法2:有参read方法 一次读取多个数据,返回值为读取的数据(是数据对应的码值),读到末尾返回-1
字符流对象.read(字符数组);
细节:
而字节流通通都是一个字节一个字节读取
3、释放资源(断开程序和文件之间建立一个通道)
防止java程序占用资源 使得在其它程序中可以打开
语法:
字符流对象.close();
(3)、无参read方法读取数据
(4)、有参read方法读取数据
(1)、构造方法
当append为true 表示打开续写开关 默认情况下是关闭续写开关
(2)、成员方法(写入数据的5种方式)
写一个字符:
写一个字符串:
写一个字符串的一部分:
写一个字符数组:
(3)、书写细节
为了提高字节流和字符流的效率 java设计了缓冲流
但是缓冲流是对字节流和字符流进行包装 真正读取和写入数据的还是字节流和字符流
字节缓冲流的使用与字节缓冲流的使用很相似
(1)、构造方法
利用字节缓冲流进行拷贝:
一次读取一个字节
利用字节缓冲流进行拷贝:
一次读取多个字节:
(1)、构造方法
(2)、特有方法
细节:
readLine()方法读取数据 是一次读取一行数据 遇到回车换行就停止
且不会将回车换行读取到内存中 如果使用println进行打印则会一行一行输出
如果使用print进行打印则不会一行一行输出 会粘在一起
细节2:
换行 这是BufferedWriter特有的方法 在之前通过字节流或字符流换行 对于不同的操作系统书写的方式不一样
而BufferedWriter只需要通过newLine方法即可在不同的操作系统下实现换行
细节3:
如果要实现续写 则需要在创建FileWriter时加上true 不是在创建BufferedWriter时添加true
字节基本流 一次读取一个字节:
字节基本流 一次读取一个字节数组:
字节缓冲流 一次读取一个字节:
字节缓冲流 一次读取一个字节数组:
(1)、概念
转化流是字节流和字符流之间的桥梁
(2)、利用转化流按照指定的字符编码读取数据
语法:FileReader 对象名=new FileReader(路径, Charset.forName("字符集"));
为了解决这个问题 我们可以指定字符输入流的字符集 使之与文本文件的字符集保持一致
(3)、利用转化流按照指定的字符编码写入数据
语法:FileWriter 对象名=new FileWriter(路径, Charset.forName("字符集"));
为了解决这个问题 我们可以指定字符输出流的字符集 使之与文本文件的字符集保持一致
(4)、利用字节流读取文本文件中的每一行数据
语法:
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(路径)));
详细写法:
简便写法:
(5)、小结
只有字节流才有序列化流,字符流没有序列化流
(1)、概念
通过序列化流可以将java对象写在本地文件中
(2)、构造方法/成员方法
通过序列化流可以将java对象写在本地文件中
构造方法语法:
ObjectOutputStream 对象名称=new ObjectOutputStream(new FileOutputStream(路径));
成员方法语法:
序列化流对象.writeObject(要写入的java对象);
细节:
要写入的java对象必须实现Serializable接口才能被写入本地文件
只有字节流才有反序列化流,字符流没有反序列化流
(1)、概念
通过序列化流可以将本地文件中的java对象读取到程序中
(2)、构造方法/成员方法
构造方法语法:
ObjectInputStream 对象名称=new ObjectInputStream(new FileInputStream(路径));
成员方法语法:
序列化流对象.readObject();
打印流是高级流,只有输出流才有打印流
因此打印流不能从文件读取数据 只能打印数据到文件中
(1)、构造方法
重点掌握第1、2种方法
(2)、特有方法
特有方法可以将数据原样打印在文件上
常规方法是将码值为该数字对应的字符打印在文件中
字符打印流与字节打印流的用法很相似
(1)、构造方法
(2)、特有方法
特有方法可以将数据原样打印在文件上
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/24752.html