知识点:
IO流:
概述:用来传输数据的
// 内存和硬盘之间进行数据交互的
分类:
流向:
输入流:读取数据
输出流:写数据
操作:
字节流:可以操作任意类型的数据,但是操作中文可能会出现乱码
字符流:专门用来操作纯文本文件
字节流的常用抽象父类:
InputStream:字节输入流.
继承类:
FileInputStream:
构造方法:
public FileInputStream(String name);
public FileInputStream(File file);
成员方法:
available(); //了解即可. 获取到要读取的文件的 所有字节数
read():一次读一个字节,读不到返回-1,读到就返回对应的码值
read(byte[] bys):一次读一个数组,读不到返回-1,读到就返回有效字节数,返回值:int
FileInputStream fls =newFileInputStream(放一个文件路径(file是一个封装路径的对象));
//int x = fls.read();从硬盘上读取一个字节
一般这样写:
int b;
while((b.read())!=-1){
system.out.println(b);
}
fls.close();关闭释放资源
文件结束标记是-1;
BufferedInputStream(字节缓冲输入流/字节高效输入流):封装的是普通流
OutputStream:字节输出流
继承类:
FileOutputStream:创建对象时,如果没有就会帮我们创建出来,如果有了,就会把文件清空,再写入数据
构造方法: //如果文件不存在,会自动创建.
public FileOutputStream(String name);
public FileOutputStream(File file);
public FileOutputStream(String name,boolean append);//往文件中追加数据
public FileOutputStream(File file,boolean append);
成员方法:
write(int a):
write(byte[] bys);
write(byte[] bys,int index,int len);
BufferedOutputStream: //字节缓冲输出流(字节高效输出流)
代码:
FileOutputStream fos = new FileOutputStream(放文件路径,如果没有就自己创建,boolean append//默认是false,不会在后面追加,只会覆盖,改成true就会续写);//创建字节流输出流对象,没有就自动创建
fos.write(内容);
fos.close()
字节流操作中文的问题:
读取中文: 可能会读取到中文的半个字节,造成乱码.
写出中文: 需要将中文转换成其对应的 字节数组,然后再写出.getbyte()
字符流的常见抽象父类:
Reader:字符输入流
Writer:字符输出流
拷贝图片
定义一个小数组来拷贝文件(推荐) 字节流一次读写一个指定长度的字节数组.
FileInputStream fis = new FileInputStream("ss.jpg");//创建输入流对象,封装的是数据源
FileOutputStream fis = new FileOutputStream("copy.jpg");//创建输出流,封装的的是目的地
byte[] arr = new byte[长度,一般是1024的整数倍];
int len ;
while((len=fis.read(arr))!=-1){//如果忘记加arr,返回的就不是字节个数了,而是字节码的值,
fos.rea(arr,0,len//有效的字节数);
}
fis.close();//关闭释放资源
fos.close()
代码:第一种拷贝
FileInputStream fis = new FileInputStream("ss.jpg");//创建输入流对象
FileOutputStream fis = new FileOutputStream("copy.jpg");//创建输出流
int b;
while((b=fis.read())!=-1){//不断读取每个字节
fos.write(b);//逐个字节拷贝
}
fis.close();//关闭释放资源
fos.close()
//fis.available获取文件大小(不推荐)
IO流的核心代码:
1: 创建输入流对象,封装数据源文件.
2: 创建输出流对象,封装目的地文件.
3: 定义变量,用来记录读取到的内容(或者是有效字节(符)数).
4: 定义循环开始读取,只要条件满足就一直读.
5: 将读取到的内容写入到目的地文件中.
6: 关闭关闭输入流对象和输出流对象.
面试题:
记忆:
1.集合的顶层都是接口,IO流是抽象类
2. 普通流封装的是文件,高效流封装的是普通流
3: 在try(){}格式中,写在小括号中的代码会在大括号中的代码执行完毕后,自动释放.
前提是: 必须实现 AutoCloseable 接口.
1.read()方法读取一个字节,为什么返回int,而不是byte?
防止中间出现11111111(-1的补码),这样的数据,后面的数据就读取不了啦
2: 字节缓冲流的内置缓冲区大小是多少?
8192个字节.
3.close() 和flush() 方法的区别?
* flush()方法:
具备刷新的功能,用来刷新缓冲区的,刷新之后,流对象可以继续使用.
* close()方法:
* 具备刷新的功能,用来关闭流,释放资源的,在关闭流之前,会刷新一次缓冲区,关闭时候,流对象不可以继续使用.