IO:I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分。 在POSIX兼容的系统上
java_IO:Java IO 是一套Java用来读写数据(输入和输出)的API。大部分程序都要处理一些输入,并由输入产生一些输出。Java为此提供了java.io包。
java_IO的原理图:
上面的java程序通过i/o传递给JVM,JVM传给WINDOWS,最后WINDOWS操作。
想要对这些数据进行持久化等操作,需要一些技术完成其它设备上的数据操作。就需要用到I/O技术,而我们使用的是java中提供的I/O技术。
数据保存在硬盘上最终的体现都是文件,所有我们最先了解I/O对文件的操作:File类。
File类只能对操作文件或目录本身,不能操作文件里面的内容,如果要操作文件中的内容,需要用到后面的内容,流的思想。
File的一些常见的方法:
·public File(String pathname):【创建文件对象,pathName是文件夹+[文件名]组成】
·public boolean createNewFile() throws IOException 【创建一个文件,不是文件夹】
·public boolean delete():【删除文件,删除的是当前文件对象的子文件对象】
·public boolean exists():【判断当前文件对象所对饮的目录在磁盘中是否存在】
·public String getName():【获取文件对象的名称】
·public String getParent():【获取文件所在的目录】
·public boolean isDirectory():【判断当前对象是否是一个文件夹】
·public boolean isFile():【判断当前对象是否是文件】
·public long length():【获取文件的大小,以字节为单外返回】
·public String[] list():【获取当前文件目录下的所有文件对象的名称(第一目录)】
·public File[] listFiles():【获取当前文件目录下所有文件对象(第一目录)】
·public boolean mkdir():【新建一个文件夹,该文件夹不能有子文件目录】
·public boolean mkdirs();【创建一个文件夹,可以包括子文件目录】
·public static final String separator【该属性可以根据不同的操作系统取得不同的文件分割符】
示例:
package com.zhaoqiang.file;
import java.io.File;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws Exception {
// 创建一个File对象
File f = new File("d:\\Demo\\demo.txt");
/* // File.separator是自动获取当前系统的分隔符
* // 将demo文件封装成对象
* 注意:如果d盘中不存在Demo目录。File也可以封装不存在的文件对象
* */
File f2 = new File("d:"+File.separator+"Demo"+File.separator+"demo.txt");
// 父目录和子目录分开写。在子目录不确定的情况下可以这样写
File f3 = new File("\"d:"+File.separator+"Demo\"","demo.txt");
/*
* exists:判断当前文件对象是否在磁盘中存在
* getParentFile()获取父目录对象。
* mkdirs():创建文件夹
* */
if (!f2.getParentFile().exists()) {
f2.getParentFile().mkdirs();
f2.createNewFile();
}
// 获取文件所在目录
System.out.println(f2.getParent());
// 判断当前对象是否是一个文件夹
System.out.println(f2.getParentFile().isDirectory());
// 判断当前对象是否是一个文件
System.out.println(f2.isFile());
// 获取文件的大小,大小以字节返回
System.out.println(f2.length());
// 获取当前文件目录下的所有文件对象名称(第一目录(同级目录))
String[] list = f2.list();
// 获取当前文件目录下的所有文件对象
File[] file = f2.listFiles();
// 删除文件
f2.delete();
// 删除文件夹中所有文件
f2.getParentFile().delete();
}
}
过滤器:public File[] listFiles(FilenameFilter filter)
package com.zhaoqiang.file;
import java.io.File;
public class Demo3 {
public static void main(String[] args) {
/*
* 过滤器:
*
* 需求:获取目录中的内容,但是只要.java文件
* */
File dir = new File("D:"+File.separator+"Demo");
File[] file = dir.listFiles();
for(File f:file){
// if (f.getName().endsWith(".java")) {
// System.out.println(f.getName());
// }
getFile(f,".java");
}
}
// 自定义一个简单的过滤器
public static void getFile(File file,String str){
if (file.getName().endsWith(str)) {
System.out.println(file.getName());
}
}
}
通过实现FilenameFilter接口,创建一个比较器对象
package com.zhaoqiang.file;
import java.io.File;
import java.io.FilenameFilter;
class Filename implements FilenameFilter{
private String str;
public Filename(String str) {
this.str = str;
}
@Override
public boolean accept(File dir, String name) {
// if (dir.getName().endsWith(name))
// return true;
// else
// return false;
return name.endsWith(str);
}
}
public class Demo3 {
public static void main(String[] args) {
/*
* 过滤器:
*
* 需求:获取目录中的内容,但是只要.java文件
* */
File dir = new File("D:"+File.separator+"Demo");
// File dic = new File(dir,"demo.txt");
// File[] file = dir.listFiles();
File[] file = dir.listFiles(new Filename(".java"));
/*
public File[] listFiles(FilenameFilter filter) {
String ss[] = list(); 调用了File中list方法,获取所有的名称数组
if (ss == null) return null; // 判断目录中是否有文件
ArrayList<File> files = new ArrayList<>(); // 创建一个集合,用于存放文件对象
for (String s : ss) // 遍历数组里面文件对象名称
if ((filter == null) || filter.accept(this, s)) //对遍历的名称进行过滤器的判断,将当期目录this,遍历到的名称传递给了过滤器
files.add(new File(s, this)); // 把满足条件的文件添加进集合中
return files.toArray(new File[files.size()]); // 将集合转化成数组返回
}
*/
for(File f:file){
// if (f.getName().endsWith(".java")) {
System.out.println(f.getName());
// }
// getFile(f,".java");
}
}
// 自定义一个简单的过滤器
public static void getFile(File file,String str){
if (file.getName().endsWith(str)) {
System.out.println(file.getName());
}
}
}
示例:获取d盘下所有目录
package com.zhaoqiang.file;
import java.io.File;
public class Demo2 {
public static void main(String[] args) {
File f = new File("D:"+File.separator);
File[] file = f.listFiles();
for(File f1:file){
System.out.println(f1);
}
}
}
上面的方法只能获得d盘下的一级目录,并不能获取到D盘下所有的目录,所以我们需要用到递归:
package com.zhaoqiang.file;
import java.io.File;
public class Demo2 {
public static void main(String[] args) {
File f = new File("D:"+File.separator);
printDirs(0,f);
}
public static void printDirs(int level,File f){
for (int i = 0; i < level; i++) {
System.out.print(" ");
}
// 获取文件名
System.out.println(f.getName());
if (f.isDirectory()) { // 如果文件是文件夹
File fs[] = f.listFiles();
for(File f1:fs){
// 递归调用
printDirs(level+1,f1);
}
}
}
}