一、访问文件/目录属性

  java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录。
  File类只用于表示文件(目录)的信息(名称、大小等),不能对文件的内容进行访问。构造方法:File(String pathname),通过将给定路径名字符串转换成抽象路径名来创建一个新File实例。注意,抽象路径应尽量使用相对路径,并且目录的层级分隔符不要直接写“/”或“\”,应使用File.separator这个常量表示,以避免不同系统带来的差异。

package day05;

import java.io.File;
import java.util.Date;
import java.text.SimpleDateFormat;

/**
 * java.io.File
 * File的每一个实例可以表示文件系统中的一个文件或目录。
 * 使用File可以:
 * 1、访问文件或目录的属性(如:大小,名字,修改时间等);
 * 2、操作文件或目录(创建,删除文件和目录);
 * 3、访问目录中的所有内容。
 * 但是不可以访问文件数据。
 * @author xxx
 *
 */
public class FileDemo1 {
    public static void main(String[] args) {
        File file = new File("."+File.separator+"demo.txt");
        System.out.println(file);

        //获取名字
        String name = file.getName();
        System.out.println("name:"+name);

        //大小(占用的字节量)
        long length = file.length();
        System.out.println("大小:"+length+"字节");

        //是否为目录
        boolean isDir = file.isDirectory();
        System.out.println("是目录:"+isDir);
        //boolean isFile = file.isFile();//是否为文件

        //是否为隐藏文件
        boolean isHidden = file.isHidden();
        System.out.println("是否隐藏:"+isHidden);

        //最后修改时间
        long time = file.lastModified();
        Date date = new Date(time);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年M月d日 HH:mm:ss");
        System.out.println(sdf.format(date));

        boolean canWrite = file.canWrite();
        System.out.println("可写:"+canWrite);
        //file.canRead();
        //file.canExecute();
    }
}

二、创建和删除文件/目录

2.1、createNewFile()创建文件
package day06;

import java.io.File;
import java.io.IOException;

/**
 * 创建文件
 * @author xxx
 *
 */
public class FileDemo2 {
    public static void main(String[] args) throws IOException{
        /*
         * 在当前目录下创建文件test.txt
         * 默认路径就是当前目录,即“./”,所以可以省略不写
         */
        File file = new File("test.txt");

        /*
         * boolean exists()
         * 判断该文件是否存在
         */
        if (!file.exists()) {
            /*
            *boolean createNewFile()
            *如果指定的文件不存在并成功的创建,则返回true;如果指定的文件已经存在,则返回false。
            */
            file.createNewFile();
            System.out.println("创建文件完毕!");
        }else {
            System.out.println("该文件已经存在!");
        }
    }

}
2.2、mkdir()、mkdirs()创建目录
package day06;

import java.io.File;

/**
 * 创建目录
 * @author xxx
 *
 */
public class FileDemo4 {
    public static void main(String[] args) {
        /*
         * 在当前目录下创建一个名为demo的目录
         */
        File dir = new File("demo");
        if (!dir.exists()) {
            /*
            *boolean mkdir()
            *当且仅当已创建目录时,返回true;否则返回false。
            */
            dir.mkdir();
            System.out.println("创建目录完毕!");
        }else {
            System.out.println("该目录已经存在!");
        }

        /*
         * 在当前目录下创建./a/b/c目录
         */
        File dir1 = new File("a" + File.separator + "b" + File.separator + "c");
        if (!dir1.exists()) {
            /*
             * 在创建当前目录的同时将所有不存在的父目录一起创建出来。注意,此操作失败时,也可能
             * 已经成功地创建了一部分必须的父目录。
             */
            dir1.mkdirs();
            System.out.println("创建目录完毕!");
        }
    }
}
2.3、delete()删除文件或目录
package day06;

import java.io.File;

/**
 * 删除文件/目录
 * @author xxx
 *
 */
public class FileDemo3 {
    public static void main(String[] args) {
        /*
         * 删除当前目录中的test.txt文件
         */
        File file = new File("test.txt");
        if (file.exists()) {
            file.delete();
            System.out.println("删除文件完毕!");
        }else {
            System.out.println("文件不存在!");
        }

        File dir = new File("demo");
        if (dir.exists()) {
            /*
             * delete方法还可以删除目录,但是前提是该目录必须是一个空目录
             */
            dir.delete();
            System.out.println("删除目录完毕!");
        }
    }
}
2.4、删除多级目录
package day06;

import java.io.File;

/**
 * 实现方法,来删除给定的文件或目录
 * @author xxx
 *
 */
public class Test {
    public static void main(String[] args) {
        File dir = new File("a");
        delete(dir);
        System.out.println("删除完毕!");
    }

    public static void delete(File file) {
        if (file.isDirectory()) {
            //现将其所有子项删除
            File[] subs = file.listFiles();
            for (File sub:subs) {
                delete(sub);//递归
            }
        }
        file.delete();
    }
}

三、获取目录中的子项

3.1、listFiles()

  File的listFiles方法用于返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的子项(文件或目录)。

package day06;

import java.io.File;

/**
 * 获取一个目录中的所有子项
 * @author xxx
 *
 */
public class FileDemo5 {
    public static void main(String[] args) {
        /*
         * 获取当前目录中的所有子项
         */
        File dir = new File(".");

        if (dir.isDirectory()) {
            /*
             * File[] listFiles
             * 获取所有子项
             */
            File[] subs = dir.listFiles();
            for (File sub : subs) {
                if (sub.isFile()) {
                    System.out.print("文件:");
                }else {
                    System.out.print("目录:");
                }
                System.out.println(sub.getName());
            }
        }
    }
}
3.2、FileFilter接口

  FileFilter用于抽象路径名的过滤器,返回满足过滤要求的子项。

package day06;

import java.io.File;
import java.io.FileFilter;

/**
 * 获取一个目录中符合条件的部分子项
 * 使用重载的listFiles方法,需要传入一个额外的文件过滤器
 * 文件过滤器是一个接口:FileFilter
 * @author xxx
 *
 */
public class FileDemo6 {
    public static void main(String[] args) {
        File dir = new File(".");

        /*
         * 获取名字以"."开头的子项
         */
        File[] subs = dir.listFiles(new FileFilter() {
            public boolean accept(File file) {
                System.out.println("正在过滤:"+file.getName());
                return file.getName().startsWith(".");
                //只要文件
                //return file.isFile();
            }
        });

        for (File sub:subs) {
            System.out.println(sub.getName());
        }
    }
}

四、二进制相关知识(补充)

1、Integer.toBinaryString()

  Integer.toBinaryString()方法,可以将输入的数字转换成二进制数,但是转换输出的是String类型的字符串。

int n = 45;
System.out.println(n);
System.out.println(Integer.toString(n));//"45"
System.out.println(Integer.toBinaryString(n));
2、Java中二进制与十进制的转换

  Java中两个算法(方法):
  1、Integer.toString(),将内存2进制数据转换为10进制输出。
  2、Integer.parseInt(),将10进制字符串转换为2进制数据。

int n = Integer.parseInt("8866");
System.out.println(n);
//System.out.println(Integer.toString(n));
3、补码

java 二进制存储音频数据 java 二进制文件_目录操作

package bin;

public class MaxDemo4 {
    public static void main(String[] args) {
        int max = Integer.MAX_VALUE;
        int min = Integer.MIN_VALUE;

        // 2147483647   1111111111111111111111111111111
        System.out.print(" " + max + "   ");
        System.out.println(Integer.toBinaryString(max));

        //-2147483648  10000000000000000000000000000000
        System.out.print(min + "  ");
        System.out.println(Integer.toBinaryString(min));

        System.out.println(min - max);//1
        System.out.println(max + 1);//是最小值
        System.out.println(min - 1);//是最大值
    }
}

  溢出的结果虽然没有意义,但是溢出的结果并不是随机的,而是确定的。
  补码的对称现象:-n = ~n + 1