文章目录
Java IO流及文件操作
文件概念
文件:文件是
保存数据的地方,比如我们日常生活中经常使用的word文档,txt文本文件,excel文件,图片…这些都是文件。
流介绍
在Java中所有的数据都是使用流读写的,流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或者抽象。流的本质是数据的传输,作用在数据源和程序之间建立通道,根据数据传输的特性将流抽象为各种类,方便更直观的进行数据操作。
IO流体系结构

流的实现类

流的划分
按照方向划分
输入流:输入就是将数据从各种输入设备(文件、键盘等)中读取到内存中。
输出流:输出就是将数据写入到各种输出设备(比如:文件、显示器、磁盘等)。

按照数据传输单元划分
字节流:以字节为单位传输数据的流 InputStream,OutputStream
字符流:以字符为单位传输数据的流 Reader、Writer
按照功能划分
节点流:用于直接操作目标设备的流,也叫低级流, 例如:FileInputStream(D:\\text.txt)
过滤流:对一个已存在流进行包装,以提供更强大和灵活的读写功能,也叫高级流或者处理流,例如:
BufferedInputStream(new FileInpuStream(D:\\text.txt))
IO流的超类
字节流顶层抽象类
InputStream:字节输入流超类
OutputStream:字节输出流超类
字节流传输的单位是字节(8bit)
InputStream和OutputStream都属于字节流的超类,他们是抽象类,不能直接使用,需要用他们相应的子类来实例化,在Java API中所有以这两个类为后缀的类均属于字节流,
例如:FileInputStream、FileOutputStream分别属于文件字节输入流和文件字节输出流。
字符流顶层抽象类
Reader:字符输入流超类
Writer:字符输出流超类
字符流传输单位是字符(在UTF-8编码中一个中文字符占3个字节24bit)
Reader和Writer都属于字节流的超类,也是抽象类,需要子类来实现实例化,Java API中所有以这两个类为后缀名的类都属于字符流
例如:FileReader、FileWriter分别为文件字符输入流和文件字符输出流 。
File类介绍
File类主要是对文件和目录的抽象表示
文件可以简单的理解为,在硬盘设备上保存数据的一种形式
文件一共可以分为两部分组成:属性(文件大小,文件名、文件类型)和内容(文件中存放内容)
File类提供了对文件的的创建、删除、查找等操作,主要特点如下:
1、文件和目录在Java中抽象为File类
2、对于File而言,封装的并不是真正的文件,封装的仅仅是一个路径名,磁盘文件本身是可以存在的,也可以不存在
3、文件的内容不能用File读取,而是通过流来读取,File对象可以作为流的来源地和目的地
File类构造函数
1.将路径字符串抽象为File实例,路径字符串可以是相对路径,也可以是绝对路径。
public File(String pathname)
2.给定一个父路径File实例和子路径名来构建file实例
public File(File parent, String child)
3.通过uri来创建一个file实例
public File(URI uri)
代码示例
public class FileTest01 {
public static void main(String[] args) {
//File(String pathname)
//将路径字符串抽象为File实例,路径字符串可以是相对路径,也可以是绝对路径
String pathName = "e:\\hello.txt";
File file = new File(pathName);
//File(File parent, String child)
//给定一个父路径File实例和子路径名来构建File实例
String parentName = "e:";
String child = "test01.txt";
File file1 = new File(parentName);
File file2 = new File(file1, child);
//File(String parent, String child)
//给定一个父路径名和子路径名来构建File实例
File file3 = new File(parentName, child);
}
}
File类的基本操作
1.boolean createNewFile(); 当该名称的文件不存在时,创建空的文件并返回true,当文件存在时,返回false
代码示例
public class FileTest02 {
public static void main(String[] args) {
String pathname = "e:\\Java\\hello.txt";
File file = new File(pathname);
try {
boolean newFile = file.createNewFile();
System.out.println(newFile);
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
2.boolean delete() 立即删除文件或目录
代码示例
public class FileTest03 {
public static void main(String[] args) {
String pathname = "e:\\Java\\hello.txt";
File file = new File(pathname);
file.delete();
}
}
运行结果:
3.boolean exists(); 文件或者目录存在返回true,否则返回false
代码示例
public class FileTest04 {
public static void main(String[] args) {
String pathname = "e:\\Java\\hello.txt";
File file = new File(pathname);
try {
file.createNewFile();//创建文件
if (file.exists()) {//判断文件是否存在
System.out.println("文件存在");
} else {
System.out.println("文件不存在");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
4.boolean isDirectory() 返回true:当前是目录
当前文件夹
代码示例
public class FileTest05 {
public static void main(String[] args) {
String pathname = "e:\\Java\\a";
File file = new File(pathname);
if (file.isDirectory()) {
System.out.println("是目录");
}else {
System.out.println("不是目录");
}
}
}
运行结果:
5.boolean mkdir() true: 创建成功 false: 目录已经存在
代码示例
public class FileTest06 {
public static void main(String[] args) {
File file = new File("e:\\Java\\b");
if (file.mkdir()) {
System.out.println("目录创建成功");
}else {
System.out.println("目录已经存在");
}
}
}
运行结果:
6.boolean mkdirs() true: 创建多级目录
代码示例
public class FileTest08 {
public static void main(String[] args) {
File file = new File("e:\\Java\\b\\c\\d\\e");
file.mkdirs();
}
}
运行结果:
7.String getParent() 获取父目录
代码示例
public class FileTest09 {
public static void main(String[] args) {
File file = new File("e:\\hello.txt");
String parent = file.getParent();
System.out.println(parent);
}
}
运行结果:
8.String getAbsolutePath() 获取File对象的绝对路径名称
代码示例
public class FileTest10 {
public static void main(String[] args) {
String pathname = ".";
File file = new File(pathname);
String absolutePath = file.getAbsolutePath();
System.out.println(absolutePath);
}
}
运行结果:
9.String[] list() 返回目录中的文件和目录的名称的字符串数组
当前Java目录下的文件和目录:
?返回目录下指定内容时,需要实现FilenameFilter接口进行过滤
public interface FilenameFilter {
//需要实现accept方法 根据当前的文件或者目录name作出处理
//满足为true时返回,否则过滤
//参数:dir表示父目录File实例 name:表示当前文件或者目录的名称
boolean accept(File dir, String name);
}
代码示例
public class FileTest11 {
public static void main(String[] args) {
File file = new File("e:\\Java");
String[] list = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
boolean file1 = new File(dir, name).isFile();//过滤掉目录
return file1;
}
});
for (String s : list) {
System.out.print(s + " ");
}
}
}
运行结果:
10.File[] listFiles() 回目录中的文件和目录的名称的file实例数组
当前Java目录下的文件和目录:
代码示例
public class FileTest12 {
public static void main(String[] args) {
File file = new File("e:Java");
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.startsWith("t");//返回以 t 开头的文件或目录
}
});
for (File f : files) {
System.out.println(f.getName());
}
}
}
运行结果: