Java中的IO流
0.io 流 : 读写文件内部的内容,上传下载,拷贝文件,拷贝文件夹...
1.流 : 就是管道
以先入先出的方式进行流动
作用 : 做数据传输
数据源 ------> 目的地
流的分类 :
按照流向分 : (以程序为中心)
输入流
输出流
按照操作单元 :
字节流 : 万能流
字符流 : 操作纯文本文件
按照功能划分 :
节点流 : 真实做读入写出的流
处理流|功能流 : 增强节点流的功能,提高节点流的性能
以上的所有分类之间都是相辅相成的
2.字节流
输入流 : InputStream
根据数据源选择节点流 : 节点流
数据源为字节数组 : ByteArrayInputStream字节数组输入流(了解)
数据源为文件 : FileInputStream文件字节输入流
操作
需求 : 从文件中读入数据到程序
文件 : 数据源 --> 程序 : 目的地
1)构建文件字节输入流
FileInputStream(File file)通过打开与实际文件的连接来创建FileInputStream ,该文件由文件系统中的File对象file命名。
FileInputStream(String name) 通过打开与实际文件的连接来创建FileInputStream ,该文件由文件系统中的路径名name命名。
2)读入数据
3).使用数据
System.out.println(is.read()); //如果读到文件末尾返回-1
4).关闭
优化 一:
之前使用字节流每次读入一个字节数据,重复读入多次,重复读入的代码过于冗余,不够精简
可以通过循环结构简化重复读入的操作
1.与文件建立联系(数据源文件|目的地文件
2.构建流(文件字节输入流)
3.读入数据
4.使用数据
5.关闭
优化二:
每次读入一个字节,循环读入多次,虽然代码简洁,但是效率较低
可以从每次读入一个字节数据变为每次读入一卡车字节数据
int read(byte[] b) 从输入流中读取一些字节并将它们存储到缓冲区数组b中。
返回值 : 为每次读入到字节数组中数据的个数
1.与文件建立联系(数据源文件|目的地文件)
2.构建流(文件字节输入流)
3.读入数据
int len; //记录每次读入的数据个数
byte[] car = new byte[1024];
while((len=is.read(car))!=-1)
4.使用数据
System.out.println(new String(car,0,len));
5.关闭
从输入流中读取所有剩余字节。
System.out.println((char)(is.read()));
System.out.println(new String(is.readAllBytes()));
异常捕获+资源关闭
jdk7下新增 : try-with-resources,对try中创建的资源在使用完毕之后进行关闭,要求资源的类型必须实现了AutoCloseable接口
jdk7之前 : try ..catch ..finally
jdk7新增 : try-with-resources
jdk9之前 :
jdk9新增 :
输出流 : OutputStream
这个抽象类是代表字节输出流的所有类的超类。
根据目的地选择节点流 :
当目的地为字节数组 : ByteArrayOutputStream 字节数组输出流
当目的地为文件 : FileOutputStream 文件字节输出流
注意 : 如果目的地文件存在并且包含内容,写出默认覆盖,可以调用重载构造器,boolean append-->true追加 false覆盖
如果目的地文件不存在,系统会自动创建目的地文件,但是目的地文件所在路径(文件夹)不会自动创建
操作
需求 : 将程序中的数据写出到输出流中,流向目的地文件
1)与目的地文件建立联系
2)构建文件字节输出流
FileOutputStream os = new FileOutputStream("D://AAA/test2.txt"); //默认覆盖
FileOutputStream os = new FileOutputStream("D://AAA/test.txt",true); //追加
3)准备数据
4)写出数据
5)刷出
6)关闭
//声明
FileInputStream is = null;
try{
//1.与文件建立联系(数据源文件|目的地文件)
//2.构建流(文件字节输入流)
is = new FileInputStream("D://AAA/test2.txt");
//3.读入数据
int len; //记录每次读入的数据个数
byte[] car = new byte[1024];
while((len=is.read(car))!=-1){
//4.使用数据
System.out.println(new String(car,0,len));
}
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//5.关闭
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}*/
try(
FileInputStream is =new FileInputStream("D://AAA/test2.txt");
){
//1.与文件建立联系(数据源文件|目的地文件)
//2.构建流(文件字节输入流)
//3.读入数据
int len; //记录每次读入的数据个数
byte[] car = new byte[1024];
while((len=is.read(car))!=-1){
//4.使用数据
System.out.println(new String(car,0,len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}*/
FileInputStream is =new FileInputStream("D://AAA/test2.txt");
/*try(
FileInputStream is2 = is;
){
//1.与文件建立联系(数据源文件|目的地文件)
//2.构建流(文件字节输入流)
//3.读入数据
int len; //记录每次读入的数据个数
byte[] car = new byte[1024];
while((len=is2.read(car))!=-1){
//4.使用数据
System.out.println(new String(car,0,len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}*/
try(is){
//1.与文件建立联系(数据源文件|目的地文件)
//2.构建流(文件字节输入流)
//3.读入数据
int len; //记录每次读入的数据个数
byte[] car = new byte[1024];
while((len=is.read(car))!=-1){
//4.使用数据
System.out.println(new String(car,0,len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}