今天这篇博客就是总结Java对于文件操作的一些知识点,一起来看
目录
2.复制一个普通文件
3.遍历目录,看输入的词是否在文件中出现(文件名或者文件内容)
文件
硬盘VS内存
1.内存的存储空间小于硬盘
2.内存访问速度快过硬盘
3.内存的成本高于硬盘
4.内存数据掉电丢失,硬盘数据掉电还存在
Java操作文件
文件是被操作系统管理的,操作系统内核有专门的模块,文件系统,Java针对文件系统/文件进行了封装,Java提供了File类表示一个文件
文件路径(path)
绝对路径:以盘符开头的路径
D:\program\qq\Bin\QQ.exe
使用“\”或者“/”都可以分隔路径
相对路径: 以.或者..开头的路径
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对象,创建空文件,成功创建返回true |
boolean | delete() | 根据File对象,删除文件,成功删除返回true |
void | deleteOnExit() | 根据File对象,标注文件被删除,删除会到JVM运行结束才进行 |
String[] | list() | 返回File对象目录下的所有文件名 |
File[] | listFiles() | 返回File对象目录下的所有文件,以File对象表示 |
boolean | mkdir() | 创建File对象代表的目录 |
boolean | mkdirs() | 创建File对象代表的多级目录 |
boolean | renameTo(File dest) | 进行文件改名 |
boolean | canRead() | 判断是否对文件有可读权限 |
boolean | camWrite() | 判断是否对文件有可写权限 |
具体方法代码演示
文件的读写操作
在Java中关于文件读写提供了一些类
1.字节流 InputStream OutPutStream
2.字符流 Reader Writer
读文件
InputStream/FileInputStream
Reader/FileReader
Scanner
InputStream是一个抽象类,不能直接实例化需要使用子类FileInputStream来读文件,通过构造方法传入一个路径来打开文件,read()方法读文件,close()方法关闭文件
代码
可以看到输出结果都是字节,我们要是想输出字符还需要手动new String()转换比较麻烦,Java提供了字符流来读文件
文本文件有没有更简单的方法呢答案是肯定的,就是通过Scanner
这种明显是跟方便了,但是代码此时有BUG,就是触发异常可能执行不到close()方法来看解决方法
try with resources
会在try执行结束之后,自动调用inputStream的close,前提条件就是这个类实现了Closeable接口才能实现
写文件
OutPutStream/FileOutputStream
Writer/FileWriter
PrintWriter
程序练习
1.文件查找(文件名)
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要扫描的路径");
String rootPath=scanner.next();
File file=new File(rootPath);
if(!file.exists()) {
System.out.println("输入的路径不存在");
}
System.out.println("请输入要删除的文件名或者文件名中的一部分");
String toDelete=scanner.next();
scanDir(file,toDelete);
}
public static void scanDir(File root,String toDelete) {
//递归寻找文件
File[] files = root.listFiles();//将目录转换为数组
if(files == null) {
//空目录
return;
}
for (File f : files) {
if (f.isDirectory()) {
scanDir(f,toDelete);
//是目录继续递归找文件
} else {
tryDelete(f,toDelete);
}
}
}
public static void tryDelete(File f,String toDelete) {
//判断当前文件名是否包含要删除的内容
if(f.getName().contains(toDelete)) {
try {
System.out.println("是否要删除文件(Y/N)"+f.getCanonicalPath());
Scanner scanner=new Scanner(System.in);
String choice=scanner.next();
if(choice.equals("Y")) {
f.delete();//判断结果为Y删除
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.复制一个普通文件
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要复制的文件路径");
String srcPath=scanner.next();
File srcFile=new File(srcPath);
if(!srcFile.exists()) {
System.out.println("要复制的文件不存在");
return;
}
if(!srcFile.isFile()) {
System.out.println("要复制的不是普通文件");
}
System.out.println("输入要复制的目标文件路径");
String destPath=scanner.next();
File destFile=new File(destPath);
if(destFile.exists()) {
System.out.println("要复制的文件不存在");
}
try(InputStream inputStream =new FileInputStream(srcFile)) {
try(OutputStream outputStream=new FileOutputStream(destFile)) {
byte[] buf=new byte[1024];//缓冲区使用
while(true) {
int len=inputStream.read(buf);
if(len==-1){
break;
}
outputStream.write(buf,0,len);
}
}
}catch (IOException e) {
e.printStackTrace();
}
}
3.遍历目录,看输入的词是否在文件中出现(文件名或者文件内容)
//遍历目录看输入的内容是否是文件名或者文件中的内容
public static void main(String[] args) throws IOException {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要搜索的目录");
String rootFile=scanner.next();
File file=new File(rootFile);
if(!file.exists()) {
System.out.println("要查找的目录不存在");
return;
}
if(!file.isDirectory()) {
System.out.println("要扫描的不是目录");
return;
}
//到这里知道是目录文件或者是普通文件
System.out.println("请输入要搜索的词");
String toFind=scanner.next();
scaDir(file,toFind);
}
public static void scaDir(File rootFile,String toFind) throws IOException {
File[] files=rootFile.listFiles();
if(files==null) {
return ;
}
for (File f :files) {
if(f.isDirectory()) {
scaDir(f,toFind);
}else{
tryFindInFile(f,toFind);
}
}
}
//判断toFind是文件名或者是文件内容的一部分
public static void tryFindInFile(File f,String toFind) throws IOException {
if(f.getName().contains(toFind)) {//文件名的一部分
System.out.println("找到了文件"+f.getCanonicalPath());
}
try(InputStream inputStream=new FileInputStream(f)) {//通过file对象实例化输入流对象
StringBuilder stringBuilder=new StringBuilder();
Scanner scanner=new Scanner(inputStream);
while(scanner.hasNextInt()) {
stringBuilder.append(scanner.nextLine());//字符串拼接一行数据
}
if(stringBuilder.indexOf(toFind)>=0);//找到相同会返回起始的下标
System.out.println("找到文件内容匹配的文件"+f.getCanonicalPath());
}
}
好的通过上面3个程序练习的代码基本可以应对Java中文件操作有关的问题了,希望对你有帮助,还请点赞 评论 蟹蟹!!!