——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、IO流之字节流
1、IO流概述及其分类
按操作的数据类型分:
字节流 – 可以操作任何文件。
字符流 – 只能操作用windows自带记事本打开不乱码的文件。(文本文件)
按数据的流向来分;(站在程序的角度)
输入流 -- 从文件读取数据
输出流 -- 向文件写入数据
2、FileInputStream
操作步骤:
A: 创建输入流对象 -- 从文件读取数据,这个文件必须存在
FileInputStream(File file)
FileInputStream(String name)
B: 从文件中读取数据
一次读取一个字节
int read()
重点代码:
int ch = 0;
while((ch = fis.read()) != -1){
// 获取到了每一个字节
}
C: 释放资源
3、InputStream的read()方法返回值为什么是int
4、FileOutputStream
操作步骤:
A: 创建输出流对象
-- 如果文件不存在,会自动创建。
使用如下构造:
FileOutputStream(File file)
FileOutputStream(String name)
-- 如果存在,会把数据清空,从头再写。
如果想追加写入,请使用下面带两个参数的构造:
FileOutputStream(File file, boolean append)
FileOutputStream(String name, boolean append)
B: 向文件中写入数据(因为文件的基本单位就是字节,所以数据可以直接写进去)
一次写入一个字节:
void write(int b)
C: 释放资源
5、FileOutputStream追加
6、字节流练习 - 拷贝图片
操作步骤:
创建输入流对象 -- 封装数据源
创建输出流对象 -- 封装目的地
读写操作
释放资源
一次读写一个字节的方式
7、字节流练习 - 拷贝音频文件画原理图
8、字节数组拷贝之available()方法
一次读写一个字节数组:
int read(byte[] bys)
void write(byte[] bys)
9、字节数组拷贝之定义长度较小的数组
// 读写操作
byte[] bys = new byte[1024 * 8]; // 开发中,一般使用1024的整数倍。
int len;
// 读是读一个字节数组
while((len = fis.read(bys)) != -1) { // len 表示实际读取到的字节数,如果到达流结尾,返回-1
// 写是写入一个字节数组的一部分
fos.write(bys, 0, len);
}
10、字节数组拷贝之定义数组的标准格式
11、BufferedInputStream和BufferOutputStream拷贝
没涉及缓冲流一次读写一个字节数组的方式
12、flush和close方法的区别
flush方法,刷新缓冲区,把流里面的数据写到文件中去,流对象还是可以继续使用的。
close方法,关闭流对象,并释放与此流有关的所有系统资源。流对象不可再使用。并且关闭之前要先刷新一下缓冲区。
13、字节流读写中文
字节流读取中文,打印到控制台显示,有可能会乱码。
字节流写出中文,需要把字符串转换成字节数组。
14、JDK1.6版本及其以前的版本中流的标准处理异常代码
流操作是底层操作,异常最好抛出。(告知调用者)。将异常抛出,但保证流可以关闭掉。
使用try{}finally{} 的格式,将代码做异常处理。
15、JDK1.7版本流的标准处理异常代码
try(
// 创建流对象的代码 -- 自动关闭(实现了AutoCloseable接口)
) {
// 读写操作
}
-- 上述格式将自动关闭流对象
一、字符流
1、字符流FileReader
一次读取一个字符:
int read()
2、字符流FileWriter
写一个字符:
void write(int c)
写一个字符串:
void write(String str)
3、字符流的拷贝
字符流必须刷新缓冲区。(文件的基本单位是字节)
int c;
while((c = fr.read()) != -1){
fw.write(c); // 到这一步还没有写到文件上。
// fw.flush();
}
fw.close(); // 关闭流,但要先刷新它。
4、什么情况下使用字符流
字符流 – 只能文本文件
如果是拷贝文件,效率稍稍不如字节流
如果读取或者写入一段文本数据,使用字符流
字节流 -- 操作任何文件
图片、音视频、可运行文件等等
5、字符流是否可以拷贝非纯文本的文件
6、自定义字符数组的拷贝
char[] chs = new char[1024];
int len;
while((len = fr.read(chs)) != -1) {
fw.write(chs, 0, len);
fw.flush(); // 在合适的时候刷新缓冲区
}
7、带缓冲的字符流
String line;
while((line = br.readLine()) != null){
bw.write(line);
bw.newLine();
}
8、readLine()和newLine()方法
9、练习 – 将一个文本文档的文本反转,第一行和倒数第一行换,第二行和倒数第二行换。
10、LineNumberReader – 统计行号
int getLineNumber()
void setLineNumber()
二、字符流其他内容
1、装饰设计模式
研究设计模式 – 面向对象(封装、继承、多态)
2、使用指定的码表读写字符
转换流:
InputStreamReader(InpiutStream is, String charSet) – 字节流通向字符流的桥梁
OutputStreamWriter(OutputStream os, String charSet) – 字符流通向字节流的桥梁
谁到谁的桥梁按数据流向去理解。但是,实际操作的时候都是讲字节流传入转换流的构造方法,转变为字符流。
字符流 = 字节流 + 编码表(理解)