一、 File类的特点/记忆点
- 关于文件和缓冲区之间的IO操作,之前在编写shell的时候已经通过C++去体会过了。现在看看是不是使用java方便了许多
/*
实现cat函数
实现功能:对文件1.txt内容进行标准输出
用法:cat 1.txt 或 cat /home/zxf/1.txt
*/
void cat(char *argv[]){
char buf[200]; //模拟缓冲区
int fp;
fp=open(argv[1],O_RDONLY);
if(fp==-1)
{
printf("open file failed\n");
return;
}
int n;
while((n=read(fp,buf,199))>0)
write(1,buf,n); //1 标准
close(fp);
}
- File类不仅可以实例化【文件】,还可以实例化【目录】
- File类在java.io包下
- File类可以创建、删除文件,但不能对文件进行读写。如果要对这个文件进行读或者写,必须使用IO
- File类常用于:File类的对象常作为参数传递到流的构造器中,指明读取或写入的“终点”
- new File只是在内存创建了一个File对象,和外存(硬盘)中是否有这个文件暂时无关
- 最好每次使用new File前,都通过exists()方法判断一下有没有这个文件
二、File类的常用方法
2.1 构造方法
注意:new File只是在内存创建了一个File对象,和外存(硬盘)中是否有这个文件暂时无关。FIle有exists方法专门用来判断这个文件是否存在。
//1)--------File(String 文件路径)
File file1 = new File("september.txt"); //相对路径
File file2 = new File("H:\\September\\2th\\null.txt"); //绝对路径(注意,本机根本没有H盘)
System.out.println(file1);
//输出:september.txt
System.out.println(file2);
//输出:H:\September\2th\null.txt
//2)---------File(String 父路径,String 子路径)
File file3 = new File("H:\\September", "2th");
System.out.println(file3);
//输出:H:\September\2th
//3)---------File(File 父对象,String 子路径)
File file4 = new File(file3, "null.txt");
System.out.println(file4);
//输出:H:\September\2th\null.txt
路径分隔符说明:java中使用路径分隔符和之前总结的Python中使用路径分隔符是一样的。
python Windows下路径名用‘/‘还是‘\‘(以及和Linux的区别)_玛丽莲茼蒿的博客-CSDN博客在跑脚本的时候,Linux下可以运行的脚本到Windows下报错了,归根结底是路径的问题,所以总结一下。我们都知道,Linux下的路径分隔符是'/',而Windows下的路径分隔符是'\'。'/'可以直接用,而'\'不能的根源在于字符串里面\被作为转义字符使用。一、Linux下的路径名一律用'/'。二、Windows下的路径名Windows下根据你的需求不同,有几种情况可以选择。各有利弊。为什么不固定用一种方式呢,因为每个人的需求不同嘛。就按照我自己来说,我更愿意让Whttps://blog.csdn.net/qq_44886213/article/details/123333467?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22123333467%22%2C%22source%22%3A%22qq_44886213%22%7D建议:虽然在Windows系统中,我们也可以使用Linux下的“/”。but为了避免java跨平台出错,还是规范着来,Windows下用“\\”,Linux下用“/”。
java提供了separator常量:
2.2 文件的常用方法
- public String getName():获取文件名
- public boolean canRead():是否可读
- public boolean canWrite() :是否可写
- public boolean exists():判断是否存在
- public long length():文件长度(单位是字节)
- public String getAbsolutePath():获取文件的绝对路径
- public String getParent(): 获取文件的父目录
- public boolean ifFile(): true是文件,false是目录
- public boolean isDirectory():判断是否是一个目录
- public boolean idHidden():是否是隐藏文件
- public long lastModified():获取文件最后修改时间(从1970年午夜开始的毫秒数)
- public boolean renameTo(File file2):将文件重命名为file2的名字 (注意形参是一个File对象而不是String类型,这是为了防止文件重复)
2.3 目录的常用方法
- public String[] list():以【字符串】形式返回目录下的全部文件
- public File[] listFiles():以【File对象】形式返回目录下的全部文件
File file = new File("F:\\3_零信任");
String[] list = file.list();
for(String li : list){
System.out.println(li);
}
File[] files = file.listFiles();
for(File f : files){
System.out.println(f.getName());
}
2.4 几个需要注意的方法
2.4.1 当文件不存在时调用常用方法需要注意的问题
当我们new一个并不存在的文件,调用getParent等方法会输出什么?
File file1 = new File("not-exist.txt"); //硬盘中没有这个文件,相对路径
System.out.println(file1.getAbsolutePath());
System.out.println(file1.getPath());
System.out.println(file1.getParent());
System.out.println(file1.length());
System.out.println(file1.lastModified());
System.out.println(file1.exists());
System.out.println(file1.isDirectory());
System.out.println(file1.isFile());
File file1 = new File("M://not-exist.txt"); //硬盘中没有这个文件,绝对路径
System.out.println(file1.getAbsolutePath());
System.out.println(file1.getPath());
System.out.println(file1.getParent());
System.out.println(file1.length());
System.out.println(file1.lastModified());
E:\Java Project\helloworld\ioStream\not-exist.txt(绝对路径=当前java文件所在的父目录+文件名)
not-exist.txt(path直接输出文件名)
null (无父目录,输出默认值,null)
0 (无文件长度,输出默认值,0)
0 (无文件长度,输出默认值,0)false (不存在)
false(因为不存在,所以既不是文件也不是路径)
false
M:\not-exist.txt (绝对路径=输入的虚假路径)
M:\not-exist.txt (path)
M:\ (父目录=输入的虚假父目录)
0(无文件长度,输出默认值,0)
0(无文件长度,输出默认值,0)
2.4.2 重命名方法要注意3点
- 形参是一个File对象而不是String类型,因为String类型没法判断这个文件名是否已经存在了
- 要想renameTo成功执行,需要file1在硬盘中存在,file2在硬盘中不存在(file1必须存在是因为你要给它重命名它必须存在啊,file2不能存在是因为,一旦file2存在,file1重命名为file2以后名字就重复了)
//重命名:需要file1在硬盘中存在,file2不存在,才能返回成功
File file1 = new File("F:\\!\\not-exist.txt");
File file2 = new File("F:\\!\\rename.txt");
boolean b = file1.renameTo(file2);
System.out.println(b); //返回是否重命名成功
3. renameTo函数还有移动文件的功能(和Linux下的mv命令一样)
//重命名:需要file1在硬盘中存在,file2不存在,才能返回成功
File file1 = new File("F:\\!\\not-exist.txt");
//会把原来在F:\\!路径下的not-exist.txt文件,
//移动到D:\\!路径下的rename.txt
File file2 = new File("D:\\!\\rename.txt");
2.4.4 创建和删除
创建和删除文件
File file1 = new File("F:\\!\\new.txt");
if(!file1.exists()){ //最好养成对文件进行操作时都用exists判断一下的习惯,不过对于createNewFile方法,如果文件存在本身也会返回false
//1)创建文件
boolean b = file1.createNewFile();
System.out.println(b);
}else{
System.out.println("文件已经存在");
}
if(file1.exists()){
//2)删除文件
file1.delete();
}
创建目录
File file1 = new File("F:\\!"); //父路径
File file2 = new File("F:\\!", "dir"); //子路径
if(file1.exists()){
//1)父路径存在,调用mkdir方法
boolean b = file2.mkdir();
System.out.println(b);
}else{
//2)父路径不存在,调用mkdirs方法先创建父路径
boolean b = file2.mkdirs();
System.out.println(b);
}