IO流概述
IO流就是从一个位置到另一个位置的用来传输数据的虚拟管道,分为读取操作(Input Read)和写入操作(Output Write),一般指的就是外部设备和内存之间的关系。
IO流的分类
按照流向分为:输入流和输出流
输入流:表示将数据读取到java程序(内存)中使用的流。
输出流:表示从java程序(内存)向外传输使用的流。
按照处理数据单位:字节流和字符流
字节流:按照二进制编码格式,一次性传输一个字节数据,将数据以字节(1byte = 8bit)的形式传输。
字符流(字符流 = 字节流 + 解码):一次性传输一个字符数据,将数据以字符的形式传输。属于一种包装过的字节流,即文件的读取或者写入操作仍然是按照字节流的方式来处理,但是在处理之前会根据【字符集】做一个解码操作。
按照功能:节点流和处理流
节点流:可以从或向一个特定的地方(节点)读写字节数据,直接与数据源相连,用于输入或者输出。
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写,在节点流的基础上对之进行加工,进行一些功能的扩展,处理流的构造器必须要传入节点流的子类。
IO流常用的流处理类
File类的使用
File类常用构造方法
//根据文件路径pathName创建对应的File类对象,这个路径可以是【相对路径】,也可以是【绝对路径】
File(String pathName);
File file = new File("D:/aaa/123.txt");
//根据文件的父路径名parent,以及当前路径下的一个子文件或者子文件夹名,创建File类对象
File(String parent, String child);
File file = new File("D:/aaa", "123.txt");
//根据提供的父目录File类对象,以及当前目录下的一个子文件或子文件夹创建File类对象
File(File parent, String child);
File file = new File(file, "123.txt");
pathName路径的书写格式一般分为三种:\\
,/
,File.separator
//从win操作系统复制的路径,开发工具会自动进行转义
File file = new File("C:\\aaa");
//系统提供的专门用于路径切割的常量,可以根据不同操作系统转变不同的分隔符,用于多平台系统的兼容开发
File file = new File("C:" + File.separator + "aaa");
//win和Linux通用的路径书写格式
File file = new File("C:/aaa");
File类常用的方法
一、创建
文件
/**
* 使用File类对象调用,创建File类对象里面保存的地址所指定的文件
* @return boolean类型,返回true表示创建成功,返回false表示创建失败
* 失败原因:
* 1.该文件已经存在
* 2.操作路径非法
* 3.当前操作的文件夹没有写入权限
* 4.硬盘坏道
* 要求:创建文件必须有文件的拓展名!!!!
*/
boolean createNewFile();
//案例:在aaa路径下创建123.txt文件
File file = new File("D:/aaa/123.txt");
file.createNewFile();
new File("D:/aaa/123.txt").createNewFile(); //匿名对象创建
文件夹
/**
* 使用File类对象调用,创建File类对象里面保存的路径所指定的文件夹
* @return boolean类型,返回true表示创建成功,返回false表示创建失败
* 失败原因:
* 1.该文件已经存在
* 2.操作路径非法
* 3.当前操作的文件夹没有写入权限
* 4.硬盘坏道
*/
boolean file.mkdir();
new File("C:/aaa/bbb").mkdir();
/**
* 使用File类对象调用,创建File类对象里面保存的路径所指定的文件夹,如果中间路径不存在一并自动创建
* @return boolean类型,返回true表示创建成功,返回false表示创建失败
* 失败原因:
* 1.该文件已经存在
* 2.当前操作的文件夹没有写入权限
* 3.硬盘坏道
*/
boolean file.mkdirs();
二、删除
/**
* 删除文件和文件夹,只能删除空文件夹,所以系统删除文件夹的过程是先删除里面的文件,清空文件夹后删除文件夹
* 这里的删除是【直接抹掉数据】,不可逆
*/
boolean delete();
/*
* 当JVM退出当前程序时,删除调用该方法的文件或者文件夹,而不是调用方法后立即删除
* 用于删除程序运行之后的缓存文件或者运行日志,节约磁盘空间
*/
void deleteOnExit();
三、重命名和剪切移动
重命名和剪切移动都可以通过renameTo()方法实现
//方法
boolean srcFile.renameTo(File dest);
//重命名案例
File srcFile = new File("C:/aaa/123.txt");
File destFile = new File("C:/aaa/456.txt");
srcFile.renameTo(destFile);
//剪切移动案例
File srcFile = new File("C:/aaa/123.txt");
File destFile = new File("C:/aaa/bbb/123.txt");
srcFile.renameTo(destFile);
四、获取
文件/文件夹信息
//【以下方法都是字符串操作方法,和文件是否存在无关!!!!】
String file.getName(); //获取路径最后的文件或者文件夹名
String file.getPath(); //获取当前路径
String file.getAbsolutePath(); //获取当前路径的绝对路径
String file.getParent(); //获取当前目标文件或者文件夹的父目录
//获取文件最后修改的实际Unix时间戳,从1970年1月1日0时0分0秒到当前的秒数
long lastModified();
//文件的大小,占的字节数,如果是文件夹或者不存在,返回0L
long length();
获取文件列表
//获取当前计算机中所有盘符,针对于win系统
File[] files = File.listRoots();
//获取指定【文件夹】内的所有子文件夹和子文件【名字】的字符串,返回一个字符串数组
String[] allFilesName = file.list(FilenameFilter filter); //文件过滤器
//获取指定【文件夹】内的所有子文件夹和子文件的File类对象【包含路径】,返回一个File类数组
File[] allFiles = file.listFiles(FilenameFilter filter); //文件过滤器
/*
* 【文件过滤器】是FilenameFilter接口,可以自定义过滤器,提供过滤发展,输出满足true的文件列表
*/
//创建类实现接口案例
Class MyFilter implements FilenameFilter {
@override
//dir是文件路径,name的父路径,该方法会遍历文件和文件夹,将名字依次写入name
//如果要判断是否为一个普通文件,需要有File类调用isFile()方法,所以必须创建匿名对象
public boolean accept(File dir, String name) {
return name.endsWith(".java") && new File(dir, name).isFile();
}
}
File[] allFiles = file.listFiles(new MyFilter()); //按照过滤器筛选文件
五、判断
boolean file.canExecute(); //文件是否可执行
boolean file.canRead(); //文件是否可读取
boolean file.canWrite(); //文件是否可写入
boolean file.exists(); //是否存在
boolean file.isAbsolute(); //是否为绝对路径
boolean file.isDirectory(); //是否为文件夹
boolean file.isFile(); //是否为普通文件
boolean file.isHidden(); //是否隐藏