首页 > 代码库 > 08、File类详解

08、File类详解

一、File类

1.1、File解析

File类可以用来将文件或文件夹封装成对象同时也可以作为参数传递给流的构造函数,方便对文件的读写操作。

(1)File f1 = new File("a.txt");//将a.txt封装成file对象。可以将已有的和未出现的文件或者文件夹封装成对象。(2)File f2 = new File("c:\\abc","b.txt");//将目录和文件分成两个参数进行传递。(3)File d = new File("c:\\abc");//将绝对路径封装成对象。   File f3 = new File(d,"c.txt");//再将对象当做参数传递。

总结:其实这三种创建方式都是一回事,只是写法不同,便于针对不同的问题进行解决。
注:目录分隔符:\\可以用File.separator。 跨平台的分隔符。是一个静态的字段。

1、常用方法:

1.创建boolean createNewFile()://在指定位置创建文件,如果该文件以及存在则不创建,返回false。boolean mkdir()://创建一级文件夹,文件不存在返回true,文件已存在返回false.boolean mkdirs()://创建多级文件夹。2.删除boolean delete()://删除失败返回false。void deleteOnExit()://在程序退出时自动删除指定文件。3.判断boolean exists()://文件是否存在。boolean isFile()://判断路径名表示的文件是否是一个标准文件。boolean isDirectory()://判断路径名表示的文件是否是一个目录。boolean isHidden()://判断指定文件是否是一个隐藏文件。boolean isAbsolute()://判断文件路径是否为绝对路径。boolean canExecute()://判断文件是否是可执行文件。boolean canRead()://判断文件是否可以被读取。boolean canWrite()://判断文件是否可以被修改。4.获取String getName()://获取不带路径的文件名,String getPath()://获取相对路径。String getParent()://该方法返回的是绝对路径中的文件父目录。如果获取的是相对路径,返回null。如果相对路径有上一层目录,那么该目录就是返回结果。String getAbsolutePath()://获取绝对路径。long lastModified()://获取文件最后一次修改时间。long length()://获取文件长度。(也就是获取文件夹下文件的个数。)String[] list()://获取指定目录下的所有文件名,包含隐藏文件。调用List方法的file对象必须是封装了一个目录。该目录必须存在。static File[] listRoots()://获取所有根目录。注意静态和返回值是数组。5.修改 boolean renameTo(File dest):重命名。6.过滤String[] list(FilenameFilter filter)://传入一个FilenameFilter接口类型的引用,返回一个字符串形式的文件名。(过滤器)File[] listFiles()://返回一个文件对象的数组,拿到的只有文件对象,没有目录对象。//注意:返回的是对象,可以通过对象调用getName()方法和length()方法。

获取以指定名称结尾的文件。(多练习,要记住)

File f = new File("D:\\java\\javaDemo");String[] s = f.list(new FilenameFilter() {//通过一个匿名内部类,重写FilenameFilter接口中的accept方法。    public boolean accept(File dir, String name) {        return name.endsWith(".java");//boolean endsWith:判断字符是否以指定后缀结尾。    }});System.out.println("len:"+s.length);for (String name:s ) {    System.out.println(name);}

通过上面的方法,让输出的目录带层次。递归调用

public static void showDir(File dir) {    File[] files = dir.listFiles();    for (int x=0;x<files.length;x++ ) {        if(files[x].isDirectory())//判断是否是目录,是目录递归继续列出目录下的内容。            showDir(files[x]);        else            System.out.println(files[x]);    }}

2、递归运算详细流程

public void toBin(int num){    if(num > 0){        toBin(num/2);        System.out.println(num%2);    }}

这里假设num = 6;我们对递归运算流程进行分析。
第一次

public void toBin(6){    if(6 > 0){        toBin(6/2);-->开始递归执行第二次        System.out.println(6%2);    }}

第二次

public void toBin(3){    if(3 > 0){        toBin(3/2);-->开始递归执行第三次        System.out.println(3%2);    }}

第三次

public void toBin(1){    if(1 > 0){        toBin(1/2);-->开始递归执行第四次        System.out.println(1%2);    }}

第四次

public void toBin(0){    if(0 > 0){        -->条件不满足,程序结束        toBin(0/2);        System.out.println(0%2);    }}//第四次判断不满足程序就结束了,当第四次结束后意味着第三次结束了执行输出为1,第三次结束了意味着第二次结束了执行输出为1,//第二次结束了意味着第一次结束了,执行输出0,这里就得出了6的二进制是110。

1.2、编码表

字符流的出现为了方便操作字符,更重要的是加入了编码转换。通过子类转换流来完成:InputStreamReader 和 OutputStreamWriter。

编码表由来:

  计算机只能识别二进制数据,早起由来是电信号。为了方便应用计算机,让它可以识别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表。

常见的编码表

  • Ascii:美国标准信息交换码,用一个字节的7位可以表示。
  • ISO8859-1:拉丁码表。欧洲码表,用一个字节的8位表示。
  • GBK2312:中国的中文编码表。
  • GBK:中国的中文编码表升级,融合了更多的中文文字符号。
  • Unicode:国际标准码,融合了多种文字,所有文字都用两个字节来表示,Java语言使用的就是unicode。
  • UTF-8:最多用三个字节来表示一个字符。

编码:字符串变成字节数组。

String-->byte[]:str.getBytes();str.getBytes(String charsetName)

解码:字节数组变成字符串。

byte[]-->String:new String(byte[])new String(byte[],String charsetName)

注:当编码用的是GBK,而解码用的iso8859-1,这样解析出来会是乱码,我们可以通过iso8859-1再对其进行编码,然后通过GBK解码。

String s = "你好";byte[] b1 = s.getBytes("GBK");System.out.println(Arrays.toString(b1));String s1 = new String(b1,"iso8859-1");System.out.println("s1="+s1);//对s进行重新编码。byte[] b2 = s1.getBytes("iso8859-1");String s2 = new String(b2,"GBK");System.out.println("s2="+s2);

############################################################

08、File类详解