流是一组有顺序的,有起点和终点的字节/字符集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
输入input 文件——》程序======输入流
输出output 文件《——程序======输出流
(站在程序角度来看是输出还是输入)
一、IO的分类
按照数据单位分类:
字节流(8bit 传输视频、图片)
字符流(16bit 传输文本文件)
按照角色分类:
1.节点流:直接操作文件的流
2.处理流:将传输进行操作处理,可作用于处理流和节点流上
2.IO的体系
抽象基类 :
InputStream OutputStream Reader Writer
- java.io.File类:文件和目录路径名的抽象表示形式,与平台无关
- File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
- File对象可以作为参数传递给流的构造函数
File类构造方法
1.public File(String pathname)
以pathname为路径创建File对象
2.public File(String parent,String child)
以parent为父路径,child为子路径创建File对象
3.注意:File的静态属性String separator存储了当前系统的路径分隔符。
在UNIX中,此字段为‘/’,在Windows中,为‘\\’
File类常见的方法
IO流传输文件的demo
package org.jcq.main;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
/**
* 使用IO流的节点流和处理流进行复制 1.创建File类实例,src是源文件路径,dest是目标传输文件路径(这个文件是没有的)
* 2.将File实例做为FileInputStream或者FileOutputStream处理流的形参,因为效率问题,非文本文件使用FileInputStream和FileOutputStream
* 3.创建缓冲流BufferInputStream 4.进行方法调用,并操作 5.清空缓冲留flush 6.关闭IO流
*/
public void testCopy(String src, String dest) {
// 创建File实例
File fs = new File(src);
File fd = new File(dest);
// 创建节点流
FileInputStream fis= null;
FileOutputStream fos = null;
// 创建处理流
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
fis = new FileInputStream(fs);
fos = new FileOutputStream(fd);
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//调用方法,设置字节数组,设置字节数组每次装多少个字节(通过返回值查看是否全部读取完)
byte [] b=new byte[20];
int len;
while((len=bis.read(b))!=-1) {
//不等于-1则说明未读取完
bos.write(b, 0, len);//b写入字节,0从头开始写入,len每次循环写入多少字节
}
bos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//为了防止空指针问题,先进行判空
if(bis!=null) {bis.close();}
if(bos!=null) {bos.close();}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
四、套路说明
步骤:
1、创建File的对象,指明路径,
2、创建FileInputStream对象,即节点流
4、创建BufferInputStream对象,构造器参数为FileInputStream对象,即处理流
3、调用BufferInputStream、BufferOutputStream对象的方法
/*read() :读取一个字节,当执行到文件结尾返回-1
*read(byte [ ]):读取一段字节,然后返回该段byte的字节长度,若未读取到字节,即到文档末尾,则返回-1
如:一个字符串abcdef,byte[4]
第一次byte={a,b,c,d},第二次byte={e,f,c,d},第二次读取将第一次读取的byte[0]/byte[1]替换e/f
*/
4、关闭相应的流(无论报错与否,都要保证关闭)