一、引言
- 我们以前是如何存储数据的?
变量、数组和集合不能永久化存储数据
- 学习IO流的目的?
- 将数据写到文件中,实现数据永久化存储
- 读取文件中已经存在的数据
二、IO流概述与分类
在数据传输的过程中,是谁在读?是谁在写?这个参照物是谁?
IO的数据传输,可以看作是一种数据的流动,按照流动的方向,以内存为参照物,进行读写操作。
简单来说:内存在读,内存在写。
输入流:硬盘 ——>内存
输出流:内存——>硬盘
IO流的分类
IO流的使用场景
-
如果操作的是纯文本文件,优先使用字符流
-
如果操作的是图片、视频、音频等二进制文件,优先使用字节流
-
如果不确定文件类型,优先使用字节流.字节流是万能的流
什么是纯文本文件?
用windows记事本打开能读的懂的文件就是纯文本文件。
三、字节流 (读、写)
3.1 字节流写数据
package com.itheima.output;
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputDemo1 {
public static void main(String[] args) throws IOException {
//1.创建字节输出流的对象
//注意点:如果文件不存在,会帮我们自动创建出来(但是apple文件夹需要自己创建)
// 如果文件存在,会把文件清空
FileOutputStream fos=new FileOutputStream("D:\\apple\\a.txt");
//2.写数据 传递一个整数时,那么实际写到文件中都是整数在码表中对应的字符
fos.write(98);
//3.释放资源 告诉操作系统,我现在已经不要再用那个文件了
fos.close();
}
}
3.2字节流写数据的三种方式
package com.itheima.output;
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputDemo2 {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream("file_io\\a.txt");
/* byte [] bys={97,98,99};
fos.write(bys);
*/
byte[] bys={97,98,99,100,101,102,103};
fos.write(bys,1,2);//从此数组的1索引开始,长度为2
fos.close();
}
}
3.3字节流写数据的两个小问题
换行:fos.write("\r\n".getBytes());
3.4字节流写数据加异常处理
异常处理格式:try-catch-fianlly
package com.itheima.output;
import java.io.FileOutputStream;
import java.io.IOException;
public class OutputDemo3 {
public static void main(String[] args) {
FileOutputStream fos=null;
try{
fos=new FileOutputStream("D:\\a.txt");
fos.write(97);
}catch (IOException e){
e.printStackTrace();
}finally {//finally语句里面的代码一定会被执行
if(fos!=null){
try{
fos.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
}
3.5字节流读数据
示例代码:
package com.itheima.output;
import java.io.FileInputStream;
import java.io.IOException;
public class InputDemo1 {
public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fis=new FileInputStream("file_io\\a.txt");
//字节流读数据
int b;
while((b=fis.read())!=-1){
//读取字节时,返回值是本次读到的那个字节数据
//也就是字符在码表中对应的那个数字
//如果我们想要看到的是字符数据,那么一定要强转成char
System.out.println((char)b);
}
//释放资源
fis.close();
}
}
四、案例应用
4.1 案例一:字节流复制文件
package com.itheima.output;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class test1 {
public static void main(String[] args) throws IOException {
//创建字节输入流,准备读数据
FileInputStream fis=new FileInputStream("D:\\apple\\a.txt");
//创建字节输出流,准备写数据
FileOutputStream fos=new FileOutputStream("file_io\\b.txt");
int b;
while((b=fis.read())!=-1){
fos.write(b);
}
fis.close();
fos.close();
}
}
4.2 案例二:定义小数组拷贝(对案例一进行优化)
package com.itheima.output;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
//对案例:test1进行优化,提高效率,定义小数组拷贝
public class test2 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("D:\\apple\\a.txt");
FileOutputStream fos=new FileOutputStream("file_io\\b.txt");
byte [] bys=new byte[1024];
int len;//本次读到的有效字节个数----这次读了几个字节
while((len=fis.read(bys))!=-1){
fos.write(bys,0,len);
}
fis.close();
fos.close();
}
}