Java IO流
流介绍
在Java中所有的数据都是使用流读写的,流是一组有顺序的,由起点和终点的字节集合,是对数据传输的总称或者抽象;
流本质是数据的传输,根据数据传输的特性将流抽象为各种类,方便更直观的进行数据操作;
作用:在数据源和程序之间建立通道。
IO流体系结构
流的实现类
Java中流的划分
按照方向划分:
输入流:输入就是将数据从各种输入设备(文件、键盘等)中读取到内存中
输出流:将数据写入到各种输出设备(比如:文件、显示器、磁盘等)
按照数据传输单元划分:
字节流:以字节为单位传输数据的流 InputStream,OutputStream
字符流:以字符为单位传输数据的流 Reader、writer
按照功能划分:
节点流:用于直接操作目标设备的流,低级流 例如:FileInputStream(D:\text.txt)
过滤流:对一个已存在流进行包装,以提供更强大和灵活的读写功能,高级流/处理流
例如:BufferedInputStream(new FileInputStream(D:\text.txt) )
Java中IO流的超类
字节流顶层抽象类
InputStream:字节输入流超类
OutputStream:字节流输出超类
字节流传输的单位是字节(8bit)
InputStream和OutputStream都属于字节流的超类,他们是抽象类,不能直接使用,需要用他们相应的子类来实例化,在Java API中所有以这两个类为后缀的类均属于字节流
例如:FileInputStream、FieldOutputStream分别属于文件字节输入流和文件字节输出流
字符流顶层抽象类
Reader:字符输入流超类
Writer:字符输出流超类
字符流传输单位是字符(16bit)
Reader和Writer都属于字节流的超类,也是抽象类,需要子类来实现实例化,Java API中所有以这两个类为后缀名的类都属于字符流
例如:FileReader、FileWriter:分别为文件字符输入流和文件字符输出流
常见的源设备和目的设备
源设备: 1、硬盘(文件)
2、内存(字节数组、字符串)
3、网络(socket)
4、键盘(System.in)
目的设备:1、硬盘(文件)
2、内存(字节数据、字符串)
3、网络(socket)
4、显示器
File类介绍
File类主要是对文件或者目录的抽象表示;
文件可以简单的理解为,在硬盘设备上保存数据的一种形式;
文件一共可以分为两部分组成:属性(文件大小,文件名、文件类型)和内容(文件中存放内容)
File类提供了对文件的 创建、删除、查找等操作,主要特点如下:
1、文件和目录在Java中抽象为File类
2、对于File而言,封装的并不是真正的文件,封装非仅仅是一个路径名,磁盘文件本身是可以存在的,也可以不存在
3、文件的内容不能用File读取,而是通过流来读取,File对象可以作为流的来源地和目的地
File类的构造函数
File(String pathname) //将路径字符串抽象为File实例,路径字符串可以是相对路径,也可以是绝对路径
File(File parent, String child) //给定一个父路径File实例和子路径名来构建file实例
File(String parent, String child) //给定一个父路径名和子路径名来构建file实例
public File(URI uri) //通过uri来创建一个file实例
//File(String pathname) //将路径字符串抽象为File实例,路径字符串可以是相对路径,也可以是绝对路径
String pathName = "C:/Users/lyy0721/Desktop/IO/test.txt";
File file = new File(pathName);
//获取绝对路径
System.out.println(file.getAbsolutePath());
//File(File parent, String child) //给定一个父路径File实例和子路径名来构建file实例
String parentName = "C:/Users/lyy0721/Desktop/IO";
String child = "test1.txt";
//目录
File file1 = new File(parentName);
File file2 = new File(file1,child);
System.out.println(file2.getAbsolutePath());
//File(String parent, String child) //给定一个父路径名和子路径名来构建file实例
File file3 = new File(parentName,child);
System.out.println(file3.getAbsolutePath());
相对路径和绝对路径
绝对路径:从盘符开始的路径,表示一个完整的路径。 Windows:c盘,d盘,比如:c:\java\test\test.txt
Linux:‘/’ 盘符 根路径
相对路径:不带盘符的路径即是相对路径 '.'表示当前路径 '…'表示父路径
例如:./test/test1.txt …/test/test1.txt
//绝对路径
String path = "C:/Users/lyy0721/Desktop/IO";
File file = new File(path);
//获取绝对路径
System.out.println(file.getAbsolutePath());
//相对路径使用
File file1 = new File("./Lesson1-5");
System.out.println(file1.getAbsolutePath());
路径分隔符:
1、Windows下分隔符:
2、Linux下分隔符:/
使用Java中File提供了常量separator表示路径分隔符,根据当前系统自动生成对应分隔符
public static final String separator = "" + separatorChar;
File类的基本操作
//当该名称的文件不存时,创建空的文件并返回true,当文件存在时,返回false
file.createNewFile();
//boolean delete() 立即删除文件或目录
file.delete();
//void deleteOnExit() 在程序退出时删除文件或目录 (tmp临时文件)
file.deleteOnExit();
//boolean exists() false:路径不存在 true:文件或者目录存在
file.exists();
//boolean isDirectory() true:当前是目录
file.isDirectory();
//boolean isFile() true:当前是文件
file.isFile();
//boolean isHidden() true:是隐藏文件
file.isHidden();
//boolean mkdir() 创建一个空目录 true:创建成功
file.mkdir();
//boolean mkdirs() 创建多级目录
file.mkdirs();
// String getParent() 获取父目录
file.getParent();
//File getParentFile() 获取父目录file实例
file.getParentFile();
创建目录需要注意问题:
创建多级目录,mkdir创建失败,返回false,mkdirs创建成功,返回true
删除目录时,目录内不为空时,删除会失败,返回去false,删除只能删除文件后者空目录
//String getAbsolutePath() 获取file对象的绝对路径名称
file.getAbsolutePath();
//String getPath( 获取路径名称
file.getPath();
//String getName() 获取文件名称或者目录名称
file.getName();
//long length()返回file表示的文件的字节数
file.length();
//String[] list() 返回目录中的文件和目录的名称的字符串数组
file.list();
//File[] listFiles() 返回目录中的文件和目录的名称的file实例数组
file.listFiles();
FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
//返回非隐藏文件
boolean hidden = new File(dir, name).isHidden();
//只获取文件
boolean file1 = new File(dir, name).isFile();
//只获取目录
boolean directory = new File(dir, name).isDirectory();
//只获取含有"t"开头的文件或目录
boolean startsWitht = name.startsWith("t");
return startsWitht;
}
};
//File[] listFiles(FilenameFilter filter) 返回过滤后需要的文件和目录的名称的file实例数组数组
file.listFiles(filter);
//String[] list(FilenameFilter filter) 返回过滤后需要的文件和目录的名称的字符串数组
file.list(filter);
返回目录下指定内容时,需要实现FilenameFilter类
public interface FilenameFilter {
//需要实现accept方法 根据当前的文件或者目录name以及dir作出处理
满足为true时返回,否则过滤
参数:dir表示父目录file实例 name:表示当前文件或者目录的名称
boolean accept(File dir, String name);
}
* 1、指定起始路径下包含指定词的所有文件(非隐藏文件)
* 2、打印出全路径
* 列如:
* 目录结构如下:
* /user/a/a1.java
* /user/a/a2.java
* /user/java/j1.java
* /user/java/a.txt
* /user/java/b.mp4
* /user/file/java11.txt
* /user/file/.java34.txt
*
* 打印/user目录下含Java的文件,搜索结果如下
* /user/a/a1.java
* /user/a/a2.java
* /user/java/j1.java
* /user/file/java11.txt
*
* @param path:指定路径
* @param filter:过滤关键词
*/
public static void searchFile(String path, String filter) {
}
public static void main(String[] args) {
String path = "C:/Users/lyy0721/Desktop/IO";
String filter = "test";
searchFile(path,filter);
}
public static void searchFile(String path, String filter) {
/**
* 1、判断给定的路径合法性,是否存在,必须是目录,是文件(直接是否是满足要求)
* 2、在当前路径下可能包含有目录和文件,文件直接判断,目录需要继续深入,
* 继续第二步判断(递归处理)
* 3、文件自通过过滤关键字匹配是否满足要求
*/
File file = new File(path);
if (!file.exists()){
System.out.println("路径不合法");
return;
}
//是文件
if (file.isFile()) {
//是文件需要判断是否满足要求
String fileName = file.getName();
if (fileName.contains(filter)){
System.out.println(file.getAbsolutePath());
}
return;
}
//是目录
filterFile(file,filter);
}
//递归方法,处理目录
public static void filterFile(File file,String filter) {
//是目录,获取其二级目录中所有非隐藏文件
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return true;
// return !(new File(dir, name).isHidden());
}
});
for (File f:files) {
if (f.isFile()) {
//文件
String fileName = f.getName();
if (fileName.contains(filter)){
System.out.println(f.getAbsolutePath());
}
} else {
//目录
filterFile(f,filter);
}
}
}
2、指定目录,将该目录下的文件按照树形结构打印
dos:tree
/*
* 树形结构打印
* @param filePath
*/
public static void printTree(String filePath) {
/**
* 1、路径的合法性
* 2、需要表示出当前文件的层级关系,每一层前加一个"-"
* 在不同层级中需要考虑当前层级,利用递归,参数需要包含层级
*/
File file = new File(filePath);
if (!file.exists()) {
System.out.println("指定路径不存在");
return;
}
String level ="|";
System.out.println(level+file.getName());
if (file.isDirectory()) {
//目录
printTreeLevel(file,level+"-");
}
}
//递归打印层级关系
public static void printTreeLevel(File file,String level) {
File[] files = file.listFiles();
for (File f:files) {
System.out.println(level+f.getName());
if (f.isDirectory()) {
printTreeLevel(f,level+"-");
}
}
}