Java学习之输入输出流(1)——File类学习
File类
File类特点
-
File类所创建的对象必须要在电脑中有相应的目录/文件,否则创建的对象会为空(创建对象并不会在相应的目录中创建相应的文件/目录),这个需要通过exist()函数检测
-
File类构造方法的多态性
File(File parent, String child)
在parent文件对象对应的文件目录下,创建child的文件对象。File(String path)
在java文件所在的目录下创建名为path字符串变量中所储存的字符串的文件对象。File(String parent, String child)
在名为parent字符串的目录下创建名为字符串child的文件对象。File(URI uri)
没用过。。 -
File类不允许访问文件内容(读写文件),也不能改变文件属性
各种文件处理方法
mkdir()方法和mkdirs()方法
mkdir()方法和mkdirs()方法都可以用于文件目录的创建,但是两个方法有点区别
mkdir():如果你想在已经存在的文件夹下建立新的文件夹,就可以用此方法。此方法不能在不存在的文件夹下建立新的文件夹。
mkdirs():如果你想根据File里的路径名建立文件夹(当你不知道此文件夹是否存在,也不知道父文件夹存在),就可用此方法,它建立文件夹的原则是:如果父文件夹不存在并且最后一级子文件夹不存在,它就自动新建所有路经里写的文件夹;如果父文件夹存在,它就直接在已经存在的父文件夹下新建子文件夹。
PS: mkdir()方法及mkdirs()方法会根据文件夹创建与否返回boolean的false与true可以根据返回值来进行编程判断目录是否创建成功。
delete()方法
既然能够创建目录那肯定也能删除目录,delete方法就是file类专门用于文件目录及文件删除的方法。
他可以删除file对象所储存的路径在电脑上对应的文件或者目录,但是,要万分注意的是,只会删除电脑上对应的文件或者文件夹,file对象本身的内容并不会清空。
例:
import java.io.*;
public class mkdir类{
public static void main(String[] args)
{
File tempDir = new File("C:\\Users\\楼主\\Desktop\\temp1\\temp");
/*if(tempDir.mkdir() == false)
{
System.out.println("Error! Parent Directiory Not Found! ");
return;
}*/
tempDir.delete();
System.out.println(tempDir);
}
}
代码运行后你会发现,目录并没有创建,但是依然能正常打印file对象的路径,而非NULL
renameTo()方法
既然文件及目录可以利用java进行创建以及删除,自然也可以用其进行重命名的操作,而这就需要用到我们的renameTo()方法
renameTo()方法自我感觉其实现的功能本质上是先创建一个新的文件或者目录,并将其命名成要你要命名的名字,再讲原来的文件内容复制到新的文件中并删除原文件。
比如:你想将一个原来名字为name1的文件重命名为name2,那么renameTo()方法就创建一个名字为name2的文件,再将name1文件中的内容复制到name2文件中,最后将name1文件删除。
例:
代码如下
import java.io.*;
public class 重命名及文件判等 {
public static void main(String args[]){
String mge;
if(args.length != 2) {
System.out.println("Use:java 重命名及文件判等 <file1><file2>");
System.exit(-1);
}
File f1 = new File(args[0]);
File f2 = new File(args[1]);
if(f1.equals(f2)) {
System.out.println(" Cannot rename a file to itself");
System.exit(-1);
}
mge = f1.renameTo(f2) ? " renamed to ": "could not renamed to ";
System.out.println(f1.getPath() + mge + f2.getPath());
}
}
运行代码,输入如下参数
原本桌面上建立一个叫name1的文件夹
程序运行结果如下
并且桌面上的name1文件也重命名为了name2
使用注意事项
- 如果所在目录中已经存在了您要重命名的文件的同名文件,renameTo()方法会返回false并且重命名失败
- 如果重命名的File对象只有文件的名称或者相对路径而无绝对路径的话,重命名后文件会默认放在java程序所在的目录下。
- 尽量少用renameTo()方法,如果在各个盘之间利用renameTo()方法进行重命名的话,容易因C盘D盘文件环境(file system)不同而导致不能成功执行的Bug。所以尽量用其他函数来实现重命名功能。
equals()方法
比较两个创建文件对象的字符串是否完全相同,相同返回true否则返回false。
list()方法
返回指定目录中包含的文件名或子目录名(只有名字并不包含文件的其他属性)
list()方法常赋值给一个String数组来进行使用,否则如果直接打印会打印出一串乱码
即如:String[] ls = f.list();再打印字符串数组中的字符串
如果直接打印
System.out.println(f.list());
结果如下:
输出的是一串乱码
lastModified()方法
返回文件最后一次修改的时间,其值是相对于1970年1月1日的时间毫秒数,为了方便阅读,必须变成java.util.Date对象
例:
测试代码如下:
import java.io.*;
import java.util.Date;
public class lastModified方法 {
public static void main(String args[])
{
File f = new File(args[0]);
System.out.println(new Date(f.lastModified()));
}
}
以任意一个文件的路径作为参数运行,可以得到最后一次修改该文件的时间
getpath()方法
getpath()方法获取的是构建文件对象时输入的字符串
例:
import java.io.*;
public class getPath函数{
public static void main(String[] args)
{
String path;
File f1 = new File("ab.txt");
File f2 = new File(args[0]);
if(f2.exists() && f1.exists()) {
System.out.println("----------------------");
System.out.println("File1's Path:"+f1.getPath());
System.out.println("File2's Path:"+f2.getPath());
System.out.println("----------------------");
}else
System.out.println("Cannot found file: "+args[0]+"、 "+"hallo.txt");
}
}
代码运行结果如下
如果更改输入的文本串为
java getPath方法 .\hallo.txt
不难发现file2的路径随着创建文件对象的字符串变换,getPath()方法所获得的路径也会随之变化
同理,通过代码输入字符串来更改实例化file对象,getPath()方法返回的也是实例化时输入的字符串
例:
import java.io.*;
public class getPath函数{
public static void main(String[] args)
{
String path;
File f1 = new File("C:\\Users\\楼主\\Desktop");
File f2 = new File(args[0]);
if(f2.exists() && f1.exists()) {
System.out.println("----------------------");
System.out.println("File1's Path:"+f1.getPath());
System.out.println("File2's Path:"+f2.getPath());
System.out.println("----------------------");
}else
System.out.println("Cannot found file:"/*+args[0]*/);
}
}
程序运行结果如下:
可以看到,输出的是文件对象实例化时输入的完整字符串。
PS:
在使用getpath()方法中,我发现File类在创建对象时输入’/‘和’‘是一样的,在程序中都会自动转换成表示目录层次的’’
例如使用上面的代码,输入 java getPath函数 ./hallo.txt
(注意,我这里打的是‘/’而非表文件目录层次的如’C:\desktop’中的‘\’)
代码运行结果如下:
可以发现,’/‘在文本层次中自动转换成了’’
getAbsolutePath()方法
getAbsolutePath()方法返回的是一个文件的绝对路径,无论其对象创建的时候输入的文本、路径 是什么
例:
import java.io.*;
public class getAbsolutePath函数{
public static void main(String[] args)
{
String path;
File f1 = new File("C:\\Users\\楼主\\Desktop");
File f2 = new File(args[0]);
if(f2.exists() && f1.exists()) {
System.out.println("----------------------");
System.out.println("File1's AbsolutePath:"+f1.getAbsolutePath());
System.out.println("File2's AbsolutePath:"+f2.getAbsolutePath());
System.out.println("----------------------");
}else
System.out.println("Cannot found file "/*+args[0]*/);
}
}
运行程序,结果如下:
可以看到返回的是文件的绝对路径
PS: 文件对象创建时如果没有指明绝对路径,只是给出文件的名称的话,必须将文件放到和运行的java文件放在同一层目录下,否则回找不到文件。
getParent()方法
getParent()方法返回的是文件对象构造时的父目录,即构造文件对象时输入的字符串的当前文件的上一级目录的路径(不一定是绝对路径,要看构造对象时输入的是否为绝对路径),与构造对象时输入的文本字符串紧密相关。
例:
import java.io.*;
class file类{
public static void main(String args[])
{
String path;
if(args.length != 1) {
System.err.println("Usage:java file类<File or Dir>");
System.exit(-1);
}
File f = new File(args[0]);
if(f.exists()) {
System.out.println("----------------------");
System.out.println("Absolute path:"+f.getAbsolutePath());
System.out.println("File path:"+f.getPath());
System.out.println("File Name:"+f.getName());
System.out.println("Parent Directory:"+f.getParent());
System.out.println("----------------------");
String canRead = f.canRead() ? "Yes" : "No";
String canWrite = f.canWrite() ? "Yes" : "No";
String isFile = f.isFile() ? "Yes" : "No";
String isDir = f.isDirectory() ? "Yes" : "No";
String isAbs = f.isAbsolute() ? "Yes" : "No";
System.out.println("Readable:"+canRead);
System.out.println("Writable:"+canWrite);
System.out.println("Is file:"+isFile);
System.out.println("Is directory"+isDir);
System.out.println("Is absolute path:"+isAbs);
}else
System.out.println("Cannot found file:"+args[0]);
}
}
分别以hallo.docx和./hallo.docx作为main函数的args[0]输入发现getParent()方法返回的分别为NULL 和 . 说明getParent()方法返回的是构造文件对象时当前文件的上一层目录的路径字符串。
isAbsolute()方法
判断构造文件对象时所输入的文件路径是否为绝对路径,如果是就返回boolean的yes否则返回no。
需要注意的是’.\ + 文件名’并 不会被判定为绝对路径
其他方法
由于除了上述方法之外,file类的其他方法比较好理解,所以就不再详细地一一说明,只是稍微介绍一下这些函数的作用
canRead()方法
判断文件是否可读,可读返回boolean的yes否则返回no。
canWrite()方法
判断文件是否可写,用法与canRead函数相同。
isFile()方法
判断构造文件对象的文件名是否为文件,是文件返回boolean的yes否则返回no。
isDirectory()方法
判断构造文件对象的文件名是否为目录(即文件夹),是的话返回Boolean的yes否则返回no。
getName()方法
返回文件对象不包含路径的文件名字。如.\hallo.docx返回的是hallo.docx。
附 ecplise 常用快捷键及常见问题解决方法
- 变量名与字符串的快捷替换
选中要替换的变量名或者字符串再按 ctrl + T 再选择需要的选项 - ecplise编辑器未包含main类型
将要运行的java文件或者包放到src文件夹下面,如果放在其他文件夹下,会导致程序不能正常运行