IO的概述
- 当需要把内存中的数据存储到持久化设备上这个动作称之为输出(写)Output操作。
- 当把持久设备上的数据读取到内存中的这个动作称之为输入(读)Input操作。
这种输入输出操作称之为IO操作
File与Stream的关系
IO也可以称作是File(文件)与Stream(流)。
输入流输出流
- Java程序得到数据,称为输入流。
-
Java程序对外提供数据,称为输出流。
File简述
File存放数据与文件夹。
API的解释:File类是文件和目录路径名的抽象表示。
File可以代表:
- 文件
- 目录
- 磁盘
File类的构造函数
File类的方法
返回值 | 方法名 | 描述 |
---|---|---|
boolean |
canExecute() |
测试应用程序是否可以执行此抽象路径名表示的文件。 |
boolean |
canRead() |
测试应用程序是否可以读取由此抽象路径名表示的文件。 |
boolean |
canWrite() |
测试应用程序是否可以修改由此抽象路径名表示的文件。 |
boolean |
createNewFile() |
当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 |
boolean |
delete() |
删除由此抽象路径名表示的文件或目录。 |
File |
getAbsoluteFile() |
返回此抽象路径名的绝对形式。 |
String |
getAbsolutePath() |
返回此抽象路径名的绝对路径名字符串。 |
long |
getFreeSpace() |
返回分区未分配的字节数 named此抽象路径名。 |
String |
getName() |
返回由此抽象路径名表示的文件或目录的名称。 |
String |
getParent() |
返回此抽象路径名的父 null 的路径名字符串,如果此路径名未命名为父目录,则返回null。 |
File |
getParentFile() |
返回此抽象路径名的父,或抽象路径名 null 如果此路径名没有指定父目录。 |
String |
getPath() |
将此抽象路径名转换为路径名字符串。 |
long |
getTotalSpace() |
通过此抽象路径名返回分区 named的大小。 |
long |
getUsableSpace() |
返回上的分区提供给该虚拟机的字节数 named此抽象路径名。 |
boolean |
isDirectory() |
测试此抽象路径名表示的文件是否为目录。 |
boolean |
isFile() |
测试此抽象路径名表示的文件是否为普通文件。 |
boolean |
isHidden() |
测试此抽象路径名命名的文件是否为隐藏文件。 |
long |
lastModified() |
返回此抽象路径名表示的文件上次修改的时间。 |
long |
length() |
返回由此抽象路径名表示的文件的长度。 |
String[] |
list() |
返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 |
String[] |
list(FilenameFilter filter) |
返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
File[] |
listFiles() |
返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 |
File[] |
listFiles(FileFilter filter) |
返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 |
File[] |
listFiles(FilenameFilter filter) |
返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 |
static File[] |
listRoots() |
列出可用的文件系统根。 |
boolean |
mkdir() |
创建由此抽象路径名命名的目录。 |
boolean |
mkdirs() |
创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 |
boolean |
renameTo(File dest) |
重命名由此抽象路径名表示的文件。 |
获取文件信息
public class FileTest {
public static void main(String[] args) {
//创建文件对象
File file = new File("FileTest.java");
//获取文件的绝对路径,即全路径
String absPath = file.getAbsolutePath();
//File中封装的路径是什么获取到的就是什么。
String path = file.getPath();
//获取文件名称
String filename = file.getName();
//获取文件大小
long size = file.length();
System.out.println("absPath="+absPath);
System.out.println("path="+path);
System.out.println("filename="+filename);
System.out.println("size="+size);
}
}
文件和目录操作
public class FileTest {
public static void main(String[] args) throws IOException {
// 对文件或者文件加进行操作。
File file = new File("d:\\file.txt");
// 创建文件:如果文件不存在,创建 返回 true; 如果文件存在,则不创建 返回 false; 如果路径错误,IOException。
boolean b1 = file.createNewFile();
System.out.println("b1=" + b1);
//-----------删除文件操作-------注意:不去回收站。慎用------
boolean b2 = file.delete();
System.out.println("b2="+b2);
//-----------需要判断文件是否存在------------
boolean b3 = file.exists();
System.out.println("b3="+b3);
//-----------对目录操作 创建,删除,判断------------
File dir = new File("d:\\abc\\def");
//mkdir()创建单个目录。//dir.mkdirs();创建多级目录
boolean b4 = dir.mkdir();
System.out.println("b4="+b4);
//删除目录时,如果目录中有内容,无法直接删除。
boolean b5 = dir.delete();
//只有将目录中的内容都删除后,保证该目录为空。这时这个目录才可以删除。
System.out.println("b5=" + b5);
//-----------判断文件,目录------------
File f = new File("d:\\java");// 要判断是否是文件还是目录,必须先判断存在。
if(f.exists()) {
System.out.println(f.isFile());
System.out.println(f.isDirectory());
}else{
// f.createNewFile();
// f.mkdirs();
}
}
}
注意:空目录才可删除
注意:判断文件是否是目录应该先判断是否存在
磁盘操作
public class FileTest {
public static void main(String[] args) throws IOException {
//获取当前所有的磁盘
File []disks = File.listRoots();
for (int i = 0; i < disks.length; i++) {
System.out.println("盘符" + disks[i]);
System.out.println(String.format("%s的容量是%d", disks[i], disks[i].getTotalSpace()
/ 1024 / 1024 / 1024));
System.out.println(String.format("%s的已用的容量是%d", disks[i], disks[i].getFreeSpace()
/ 1024 / 1024 / 1024));
System.out.println(String.format("%s的已用的容量是%d", disks[i], disks[i].getUsableSpace()
/ 1024 / 1024 / 1024));
}
}
}
实现dir操作
public class FileTest {
public static void main(String[] args) throws IOException {
File dir = new File("d:\\tools");
//获取的是目录下的当前的文件以及文件夹的名称。
String[] names = dir.list();
for(String name : names){
System.out.println(name);
}
//获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息
File[] files = dir.listFiles();
for(File file : files){
System.out.println(file);
}
}
}
注意:在获取指定目录下的文件或者文件夹必须满足如下条件:
- 指定目录必须存在
- 指定的必须是目录否则容易返回数组为null,出现NullPointerException。
文件过滤
通过listFiles()方法,我们可以获取到一个目录下的所有文件和文件夹,但能不能对其进行过滤呢?比如我们只想要一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹呢?
我们是可以先把一个目录下的所有文件和文件夹获取到,并遍历当前获取到所有内容,遍历过程中在进行筛选,但是这个动作有点麻烦,好在Java给我们提供相应的功能来解决这个问题。
查阅File类的API,发现File类中重载的listFiles方法,并且接受指定的过滤器。
过滤器有两种:
(1)FilenameFilter:通过文件名过滤
(2)FileFilter:通过文件对象过滤
显示D盘根目录下的所有Java源文件
public class FileTest {
//定义类实现文件名称FilenameFilter过滤器
static class MyFileNameFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith("java");
}
}
public static void main(String[] args) throws IOException {
//获取扩展名为.java所有文件
//创建File对象
File file = new File("d:\\");
//获取指定扩展名的文件,由于要对所有文件进行扩展名筛选,因此调用方法需要传递过滤器
File[] files = file.listFiles(new MyFileNameFilter());
//遍历获取到的所有符合条件的文件
for (File f : files) {
System.out.println(f);
}
}
}
显示D盘根目录下的所有目录
public class FileTest {
//定义类实现文件名称FilenameFilter过滤器
static class MyFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
public static void main(String[] args) throws IOException {
//显示D盘下的所有目录
File file = new File("d:\\");
File[] files = file.listFiles(new MyFileFilter());
//遍历获取到的所有符合条件的文件
for (File f : files) {
System.out.println(f);
}
}
}
打印D盘下所有的文件
public class FileTest {
public static void main(String[] args) {
File file = new File("d:\\");
getAllFile(file);
}
//获取指定目录以及子目录中的所有的文件
public static void getAllFile(File file) {
File[] files = file.listFiles();
//遍历当前目录下的所有文件和文件夹
if(files!=null) {
for (File f : files) {
if (f != null) {
//判断当前遍历到的是否为目录
if (f.isDirectory()) {
//是目录,继续获取这个目录下的所有文件和文件夹
getAllFile(f);
} else {
//不是目录,说明当前f就是文件,那么就打印出来
System.out.println(f);
}
}
}
}
}
}
打印指定目录下的所有java文件
public class FileTest {
//文件名过滤器
static class MyFilenameFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".java");
}
}
public static void main(String[] args) {
File file = new File("d:\\");
getAllFile(file);
}
//获取指定目录以及子目录中的所有的文件
public static void getAllFile(File file) {
//根据文件名过滤器获取文件
File[] files = file.listFiles(new MyFilenameFilter());
//遍历当前目录下的所有文件和文件夹
if(files!=null) {
for (File f : files) {
if (f != null) {
//判断当前遍历到的是否为目录
if (f.isDirectory()) {
//是目录,继续获取这个目录下的所有文件和文件夹
getAllFile(f);
} else {
//不是目录,说明当前f就是文件,那么就打印出来
System.out.println(f);
}
}
}
}
}
}