0


操作系统 --- 文件操作和IO

文章目录

1. 文件路径

## 绝对路径

绝对路径

绝对路径 (absolute path) : 以一个盘符开头的路径,就是绝对路径

例如这里的

D:\java\IntelliJ IDEA Community Edition 2021.2.2\bin\idea64.exe

就是绝对路径

相对路径

相对路径 (relative path) 一般是以

.

或者

..

开头的路径.一般会有一个基准,去找对应的路径.

.

就是当前目录

..

当前目录的上一目录

例如

  • D:\java\IntelliJ IDEA Community Edition 2021.2.2\bin作为基准 相对路径可以写成.\idea64.exe
  • D:\java\IntelliJ IDEA Community Edition 2021.2.2作为基准 相对路径可写成.\bin\idea64.exe
  • D:\java\IntelliJ IDEA Community Edition 2021.2.2\bin\idea64.exe作为基准 相对路径可用写成..\idea64.exe

2. Java中操作文件

Java 中通过

java.io.File

类来对一个文件(包括目录)进行抽象的描述。

2.1 File 的常用属性,方法和构造方法

属性

修饰符及类型属性说明static StringpathSeparator依赖于系统的路径分隔符,String 类型的表示static charpathSeparator依赖于系统的路径分隔符,char 类型的表示

构造方法

签名说明File(File parent, String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径File(String parent, String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示

方法

方法签名说明String getParent()返回 File 对象的父目录文件路径String getName()返回 FIle 对象的纯文件名称String getPath()返回 File 对象的文件路径String getAbsolutePath()返回 File 对象的绝对路径String getCanonicalPath()返回 File 对象的修饰过的绝对路径boolean exists()判断 File 对象描述的文件是否真实存在boolean isDirectory()判断 File 对象代表的文件是否是一个目录boolean isFile()判断 File 对象代表的文件是否是一个普通文件boolean createNewFile()根据 File 对象,自动创建一个空文件。成功创建后返回 trueboolean delete()根据 File 对象,删除该文件。成功删除后返回 truevoid deleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行String[] list()返回 File 对象代表的目录下的所有文件名File[] listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象表示boolean mkdir()创建 File 对象代表的目录boolean mkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录boolean renameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操作boolean canRead()判断用户是否对文件有可读权限boolean canWrite()判断用户是否对文件有可写权限
注意: 这里的有File对象,不代表这个文件一定真实存在

使用示例1: get相关方法的使用

importjava.io.File;importjava.io.IOException;publicclassFileDemo1{publicstaticvoidmain(String[] args)throwsIOException{File file =newFile("./test.txt");//这里的test.txt不一定存在System.out.println(file.getParent());System.out.println(file.getName());System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.getCanonicalPath());}}

运行结果截图:
在这里插入图片描述

使用示例2: 普通文件的创建和删除

importjava.io.File;importjava.io.IOException;publicclassFileDemo2{publicstaticvoidmain(String[] args)throwsIOException{File file =newFile("./test.txt");System.out.println("创建前:");System.out.println("文件是否真实存在: "+file.exists());System.out.println("文件是否是一个目录: "+file.isDirectory());System.out.println("文件是否是一个普通文件: "+file.isFile());System.out.println("创建后:");System.out.println("文件创建是否成功: "+file.createNewFile());System.out.println("文件是否真实存在: "+file.exists());System.out.println("文件是否是一个目录: "+file.isDirectory());System.out.println("文件是否是一个普通文件: "+file.isFile());System.out.println("再次创建:");System.out.println("文件创建是否成功: "+file.createNewFile());}}

运行结果截图:
在这里插入图片描述

使用示例3: deleteOnExit 的使用

importjava.io.File;importjava.io.IOException;publicclassFileDemo3{publicstaticvoidmain(String[] args)throwsIOException,InterruptedException{File file =newFile("./test.txt");System.out.println(file.exists());System.out.println(file.createNewFile());System.out.println(file.exists());Thread.sleep(3000);
        file.deleteOnExit();System.out.println(file.exists());}}

代码截图:
发现运行过程中,三秒之后,输出文件存在之后,文件被删除
在这里插入图片描述

使用示例4: 单级目录的创建

importjava.io.File;publicclassFileDemo4{publicstaticvoidmain(String[] args){File file =newFile("test");System.out.println(file.isDirectory());System.out.println(file.isFile());System.out.println(file.mkdir());System.out.println(file.isDirectory());System.out.println(file.isFile());}}

运行截图:
在这里插入图片描述

使用示例5: 多级目录的创建

importjava.io.File;publicclassFileDemo5{publicstaticvoidmain(String[] args){File file =newFile("aaa/bbb/ccc");System.out.println(file.isDirectory());System.out.println(file.isFile());System.out.println(file.mkdirs());System.out.println(file.isDirectory());System.out.println(file.isFile());}}

运行截图:
在这里插入图片描述

使用示例6: 文件的重命名

importjava.io.File;importjava.io.IOException;publicclassFileDemo6{publicstaticvoidmain(String[] args)throwsIOException{File file1 =newFile("./test.txt");File file2 =newFile("./test2.txt");System.out.println(file1.exists());System.out.println(file1.createNewFile());System.out.println(file1.exists());System.out.println(file1.renameTo(file2));}}

运行截图:
在这里插入图片描述

使用示例7: 文件的移动

importjava.io.File;publicclassFileDemo7{publicstaticvoidmain(String[] args){File file1 =newFile("./test2.txt");File file2 =newFile("./aaa/test2.txt");
        file1.renameTo(file2);}}

运行截图:
在这里插入图片描述

使用示例8: 打印当前目录下所有的文件名

importjava.io.File;importjava.util.Arrays;publicclassFileDemo8{publicstaticvoidmain(String[] args){File file =newFile(".");String[] files = file.list();System.out.println(Arrays.toString(files));}}

运行截图:
在这里插入图片描述

2.2 面试题(遍历一个目录下所有的文件,包含子目录的文件)

importjava.io.File;importjava.util.ArrayList;importjava.util.List;publicclassFileDemo9{// 这里的result 用来记录每一个目录里面的路径publicstaticList<String> result =newArrayList<>();publicstaticvoidgetAllFiles(String basePath){File file =newFile(basePath);if(file.isFile()){//如果是一个文件就之间add
            result.add(basePath);return;}elseif(file.isDirectory()){//这里是一个目录 就需要递归String[] files = file.list();for(String f : files){getAllFiles(basePath+"/"+f);}}else{//非普通文件,暂不考虑}}publicstaticvoidmain(String[] args){getAllFiles(".");for(String s : result){System.out.println(s);}}}

运行结果:
在这里插入图片描述

3. 文件内容的读写 – 数据流

3.1 InputStream — — 读

方法

方法说明int read()读取一个字节的数据,返回 -1 代表已经完全读完了int read(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了int read(byte[] b,int off, int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了void close()关闭字节流
注:

InputStream

是一个抽象类.可用使用

FileInputStream

来实现.

FileInputStream 的构造方法

构造方法说明FileInputStream(File file)利用 File 构造文件输入流FileInputStream(String name)利用文件路径构造文件输入流

使用示例1: 一次读写一个字符

importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;publicclassFileDemo10{publicstaticvoidmain(String[] args)throwsIOException{try(InputStream inputStream =newFileInputStream("test.txt")){while(true){int b = inputStream.read();if(b ==-1){break;}System.out.printf("%c",b);}}}}

运行结果:
在这里插入图片描述

使用示例2: 一次读多个字符

importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;publicclassFileDemo11{publicstaticvoidmain(String[] args)throwsIOException{try(InputStream inputStream =newFileInputStream("test.txt")){byte[] bytes =newbyte[1024];while(true){int len = inputStream.read(bytes);if(len ==-1){break;}for(int i =0; i < len; i++){System.out.printf("%c",bytes[i]);}}}}}

在这里插入图片描述
注: 示例2比示例1更好,因为IO次数少,性能也就更好

使用示例3: 当文件中的内容是中文时

importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;publicclassFileDemo12{publicstaticvoidmain(String[] args)throwsIOException{try(InputStream inputStream =newFileInputStream("test.txt")){byte[] bytes =newbyte[1024];while(true){int len = inputStream.read(bytes);if(len ==-1){break;}// 中文是占3个字节的for(int i =0; i < len; i+=3){String s =newString(bytes,i,3,"UTF-8");System.out.printf("%s",s);}}}}}

在这里插入图片描述
注: 这里只是适用于全是中文的情况,这个只是了解,并不适用

使用示例4: 使用Scanner进行字符读取

构造方法说明Scanner(InputStream is, String charset)使用 charset 字符集进行 is 的扫描读取

importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.util.Scanner;publicclassFileDemo13{publicstaticvoidmain(String[] args)throwsIOException{try(InputStream inputStream =newFileInputStream("test.txt")){Scanner scanner =newScanner(inputStream,"UTF-8");while(scanner.hasNext()){String s = scanner.nextLine();System.out.print(s);}}}}

3.2 OutputStream — — 写

方法

方法说明void write(int b)写入要给字节的数据void write(byte[] b)将 b 这个字符数组中的数据全部写入 os 中int write(byte[] b, int off,int len)将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个void close()关闭字节流void flush()重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。
注:

OutputStream

也是一个抽象类,可以使用

FileOutputStream

来实现

使用示例1: 一次写入一个字符

importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStream;publicclassFileDemo14{publicstaticvoidmain(String[] args)throwsIOException{try(OutputStream outputStream =newFileOutputStream("test.txt")){
            outputStream.write('h');
            outputStream.write('e');
            outputStream.write('l');
            outputStream.write('l');
            outputStream.write('o');
            outputStream.flush();}}}

在这里插入图片描述

使用示例2: 一次写入多个字符

importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStream;publicclassFileDemo15{publicstaticvoidmain(String[] args)throwsIOException{try(OutputStream outputStream =newFileOutputStream("test.txt")){byte[] bytes =newbyte[]{(byte)'h',(byte)'e',(byte)'y'};
            outputStream.write(bytes);
            outputStream.flush();}}}

在这里插入图片描述

使用示例3: 使String来辅助写入字符

importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStream;publicclassFileDemo15{publicstaticvoidmain(String[] args)throwsIOException{try(OutputStream outputStream =newFileOutputStream("test.txt")){String str ="hello world";
            outputStream.write(str.getBytes());
            outputStream.flush();}}}

在这里插入图片描述

使用示例4: 利用 PrintWriter 类来辅助写入字符

importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStream;importjava.io.PrintWriter;publicclassFileDemo16{publicstaticvoidmain(String[] args)throwsIOException{try(OutputStream outputStream =newFileOutputStream("test.txt")){try(PrintWriter writer =newPrintWriter(outputStream)){
                writer.println("hello 你好");}}}}

在这里插入图片描述

4. 实现一些案例

案例1:

扫描一个指定的目录,并找到名称中包含指定字符的所有普通文件,并且根据用户的选择来判断是否要删除文件.

importjava.io.File;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassDelete{publicstaticvoidmain(String[] args)throwsIOException{// 1. 用户输入路径Scanner sc =newScanner(System.in);System.out.print("请输入需要扫描的根路径: ");String rootDirPath = sc.nextLine();// 2. 如果输入的根目录不存在,之间返回File file =newFile(rootDirPath);if(!file.isDirectory()){System.out.println("您输入的目录错误!退出程序!");return;}// 3. 用户输入需要查找的文件名中的内容System.out.print("请输入要查找的文件名中含有的字符: ");String name = sc.nextLine();// 4. 递归遍历目录,并把满足条件的路径存入 result 中List<File> result =newArrayList<>();scanDir(file,name,result);// 5. 打印result中的内容 由用户决定是否删除if(result.size()==0){System.out.println("没有要找的文件!");return;}for(File f : result){System.out.println(f.getCanonicalFile());System.out.println("请问是否删除这个文件(Y/N)");String decision = sc.nextLine();if(decision.equals("Y")){
                f.delete();System.out.println("删除成功!");return;}}}privatestaticvoidscanDir(File file,String name,List<File> result){File[] files = file.listFiles();// 判断一下 files 是不是空或者files是不是没有东西if(files ==null|| files.length ==0){//空目录return;}for(File f:files){if(f.isDirectory()){//是目录就进行查找scanDir(f,name,result);}else{// 不是目录就判断名字是否带有需要查找的关键字 使用contains方法if(f.getName().contains(name)){
                    result.add(f.getAbsoluteFile());}}}}}

在这里插入图片描述

案例2:

进行普通文件的复制

importjava.io.*;importjava.util.Scanner;publicclassCopy{publicstaticvoidmain(String[] args)throwsIOException{// 1. 让用户输入要复制的文件路径Scanner sc =newScanner(System.in);System.out.print("请输入要复制文件的路径: ");String srcPath = sc.nextLine();File srcFile =newFile(srcPath);// 2. 判断输入的是否是文件,不是就返回if(!srcFile.isFile()){System.out.println("输入的文件路径错误!程序结束!");return;}// 3. 是文件 就输入要复制到的路径System.out.print("请输入要复制到的目标路径: ");String destPath = sc.nextLine();File destFile =newFile(destPath);// 4. 判断是否存在复制后的文件,如果有就返回复制失败if(destFile.exists()){System.out.println("该目录已有该文件,复制失败!");return;}// 5. 判断父级目录存不存在 不存在就创建目录if(!destFile.getParentFile().exists()){
            destFile.getParentFile().mkdirs();}// 6. 复制文件try(InputStream inputStream =newFileInputStream(srcFile);OutputStream outputStream =newFileOutputStream(destFile)){while(true){byte[] bytes =newbyte[1024];int len = inputStream.read(bytes);if(len ==-1){break;}
                outputStream.write(bytes,0,len);}
            outputStream.flush();}System.out.println("复制完成!!!");}}

在这里插入图片描述
在这里插入图片描述

案例3:

扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)

importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassSearch{publicstaticvoidmain(String[] args)throwsIOException{// 1. 用户输入要扫描的目录路径Scanner sc =newScanner(System.in);System.out.print("请输入要查找的文件的目录的路径: ");String searchPath = sc.nextLine();File file =newFile(searchPath);// 2. 判断是否存在目录if(!file.isDirectory()){System.out.println("输入的目录路径错误!程序结束!");return;}// 3. 用户输入要查找的内容System.out.print("请输入你要查找的内容: ");String str = sc.nextLine();List<File> result =newArrayList<>();// 4. 用递归的方式遍历 符合的存入resultscanResult(file,str,result);// 5. 遍历结果System.out.println("找到了"+result.size()+"个符合条件的内容");for(File file1 : result){System.out.println(file1.getCanonicalFile());}}publicstaticvoid scanResult (File file,String str,List<File> result)throwsIOException{// files里都是目录File[] files = file.listFiles();// files为空或者长度为0就是没有内容 直接返回if(files ==null|| files.length ==0){return;}// 遍历for(File f : files){// 是目录就递归if(f.isDirectory()){scanResult(f,str,result);}else{// 不是目录就判断是否准则符合要求的内容if(isContains(f,str)){
                    result.add(f);}}}}publicstaticbooleanisContains(File f,String s)throwsIOException{StringBuilder sb =newStringBuilder();try(InputStream inputStream =newFileInputStream(f)){try(Scanner sc =newScanner(inputStream,"UTF-8")){// 读取数据// 每一行的读// 并添加到sb中while(sc.hasNextLine()){String str = sc.nextLine();
                    sb.append(str+"/n");}}}// 如果和-1相等就是没有要找的内容return sb.indexOf(s)==-1;}}

在这里插入图片描述

标签: java 数据库 mysql

本文转载自: https://blog.csdn.net/wwzzzzzzzzzzzzz/article/details/123760326
版权归原作者 wwzzzzzzzzzzzzz 所有, 如有侵权,请联系我们删除。

“操作系统 --- 文件操作和IO”的评论:

还没有评论