操作系统负责管理软件资源,往往会把这些资源统一抽象成“文件”来进行管理。本文主要记录与文件操作相关的基本知识。
(1)绝对路径:文件的完整路径,例如test.txt的路径,如:
D:\Picture\bbb\test.txt
(2)相对路径
(3)基准路径
如果基准路径是D:/Picture,那么相对路径就是./bbb/test.txt
(1)创建文件(示例):
public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("test.txt");
System.out.println(file.isFile());//是否是一个普通文件
System.out.println(file.isDirectory());//是否是一个目录
System.out.println(file.isAbsolute());//是否是绝对路径
//创建文件
file.createNewFile();
System.out.println();
System.out.println(file.isFile());//是否是一个普通文件
System.out.println(file.isDirectory());//是否是一个目录
System.out.println(file.isAbsolute());//是否是绝对路径
}
}
(2)删除文件(示例):
File file = new File("test.txt");
//删除文件
file.delete();
//进程退出时删除文件
file.deleteOnExit();
(3)创建目录(示例):
public class Demo2 {
public static void main(String[] args) {
File file = new File("Test/AAA/BBB");
System.out.println(file.isDirectory());
//创建一个目录
file.mkdir();
//创建多级目录
file.mkdirs();
System.out.println(file.isDirectory());
}
}
(5)重命名文件(示例):
File file1 = new File("Test/AAA/BBB/src.txt");
File file2 = new File("Test/AAA/BBB/des.txt");
file1.createNewFile();
System.out.println(file1.exists());//file1要存在
System.out.println(file2.exists());//file2需要不存在
System.out.println(file1.renameTo(file2));
文件一般简单的划分为文本文件和二进制文件。通过流对文件进行读写,分别是字节流和字符流。
(1)FileInputStream(示例):
public static void main(String[] args) throws IOException {
//InputStream是一个抽象类,不能实例化
InputStream inputStream = new FileInputStream("test.txt");
while (true) {
int b = inputStream.read();
if(b == -1) {
break;
}
System.out.println(b);
}
//一定要记住关闭资源,否则会造成资源泄漏
inputStream.close();
}
(2)FileOutputStream(示例):
public static void main(String[] args) throws IOException {
OutputStream outputStream = new FileOutputStream("test.txt");
//新写入的会覆盖掉原有的数据
outputStream.write(97);
outputStream.write(98);
outputStream.write(99);
outputStream.close();
}
(3)使用Scanner
(4)使用PrintWriter
FileReader和FileWriter(示例):
public static void main(String[] args) throws IOException {
Reader reader = new FileReader("./test.txt");
while (true) {
int b = reader.read();
if(b == -1) {
break;
}
char c = (char) b;
System.out.println(c);
}
reader.close();
Writer writer = new FileWriter("./test.txt");
writer.write("hello world");
writer.close();
}
该处使用的url网络请求的数据。
使用Scanner(示例):
//try结束后会自动调用对应对象的close
try (InputStream inputStream = new FileInputStream("./test.txt")){
Scanner scanner = new Scanner(inputStream);
while (scanner.hasNext()) {
System.out.println(scanner.next());
}
} catch (IOException e) {
e.printStackTrace();
}
使用PrintWriter(示例):
public static void main(String[] args) throws IOException {
try(OutputStream outputStream = new FileOutputStream("./test.txt");
PrintWriter writer = new PrintWriter(outputStream);){
writer.println();
writer.println("aaaa");
writer.printf("a = %d\n",10);
}
/*OutputStream outputStream = new FileOutputStream("./test.txt");
PrintWriter writer = new PrintWriter(outputStream);
writer.println("第一行");
writer.println("第二行");
writer.close();*/
}
扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件。
代码如下(示例):
public class Test1 {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
//1.输入指定目录
System.out.println("请输入目录:");
String dic = sc.next();
File rootDic = new File(dic);
//2.输入包含的字符
System.out.println("请输入包含的字符:");
String str = sc.next();
//3、查找包含的字符
scanDir(rootDic,str);
}
private static void scanDir(File rootDic, String str) throws IOException {
//列出该目录的所有文件夹
File[] files = rootDic.listFiles();
//不存在则直接返回
if (files == null) {
return;
}
//扫描文件夹
for(File file : files) {
//如果是文件夹则继续进行递归
if(file.isDirectory()) {
scanDir(file,str);
}else {
//核查是否需要删除
check(file,str);
}
}
}
private static void check(File file, String str) throws IOException {
if(file.getName().contains(str)) {
System.out.println("找到了包含 "+str+"的文件 "+file.getCanonicalPath()+" 是否需要删除?(y/n)");
Scanner scanner = new Scanner(System.in);
String choice = scanner.next();
if(choice.equals("Y")||choice.equals("y")) {
file.delete();
}
}
}
}
普通文件的复制。
代码如下(示例):
public class Test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//1、输入源文件与目标文件
System.out.println("请输入源文件:");
File srcFile = new File(sc.next());
System.out.println("请输入目标文件:");
File desFile = new File(sc.next());
//2、保证源文件是文件,目标文件的地址是有效的
if(!srcFile.isFile()) {
System.out.println("输入源文件有误");
return;
}
if(!desFile.getParentFile().isDirectory()) {
System.out.println("输入的目标文件有误");
return;
}
//3、进行读写
try(InputStream inputStream = new FileInputStream(srcFile);
OutputStream outputStream = new FileOutputStream(desFile)) {
while (true) {
int ret = inputStream.read();
if(ret == -1) {
break;
}
outputStream.write(ret);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码如下(示例):
public class Test3 {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
//1.输入指定目录
System.out.println("输入指定目录:");
File dic = new File(sc.next());
//2.输入需要搜索的字符
System.out.println("输入关键词:");
String toFind = sc.next();
//3.扫描文件夹
scanDic(dic,toFind);
}
private static void scanDic(File dic, String toFind) throws IOException {
File[] files = dic.listFiles();
if(files == null) {
return;
}
for (File f : files) {
if(f.isDirectory()) {
//是文件夹继续递归
scanDic(f,toFind);
}else {
//查看该文件是不是符合
checkFile(f,toFind);
}
}
}
private static void checkFile(File f, String toFind) throws IOException {
//1.检查文件是否包含toFind
if(f.getName().contains(toFind)) {
System.out.println(f.getCanonicalPath()+" 中包含 "+toFind);
}
//2.检查文件中的内容是否包含toFind
try (InputStream inputStream = new FileInputStream(f);
Scanner scanner = new Scanner(inputStream)) {
StringBuilder string = new StringBuilder();
while (scanner.hasNextLine()) {
string.append(scanner.nextLine());
}
if (string.indexOf(toFind) > -1) {
System.out.println(f.getCanonicalPath() + " 中包含:" + toFind);
}
}
}
}