IO流的学习—File类

来源:互联网 发布:架子鼓app软件下载 编辑:程序博客网 时间:2024/05/22 14:37

1.IO流的学习

在java的大部分学习,基本都是把数据存储到内存当中,当结束了进程,这些数据都没有了。但是可以通过IO流,把内存的数据,存储在持久化设备上,比如U盘,磁盘等。

* A:IO技术概述        * a: Output            * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作        * b: Input            * 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作        * c: IO操作            * 把上面的这种输入和输出动作称为IO操作


2.FILE类

在java的api中有一个file类,主要是对文件操作的类,他是与平台无关的,比如Linux系统下是/来做文件夹分割的,而window下是用\来做分割的。而用了file这个类是没有这个烦恼的。

文件:file目录:directory路径:path

3.API:获取分隔符

以下方法是为了获取在不同的情况下,获取不同的分隔符。在window下环境变量都是使用“;”分割的。文件夹分隔符也是“\”。所以在以后的开发中,最好使用这种办法,获取系统的分割标准。也正是遵守了java的跨平台性。

获取分隔符或者分割号的时候,分别有2个方法,一个是获取char类型,一个是获取String类型,除此之外没有其他的区别,但是记住,是先char类型的,因为考虑到String比较常用,所以又转换成了String类型。
public static void main(String[] args) {//File类静态成员变量//与系统有关的路径分隔符String separator = File.pathSeparator;System.out.println(separator);// 是一个分号,目录的分割   Linux ://与系统有关的默认名称分隔符separator = File.separator;System.out.println(separator);// 向右 \  目录名称分割  Linux / }

4.API:构造


File类有4个构造的方法,这里先讲其中一种。
File(String pathname)           通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
注意:
1.这个构造主要是来创建一个file类的实例,至于这个pathname的路径是否存在,不会影响实例。
2.在写路径的时候一般是“//”两个斜杠,第一个斜杠是为了转义,这样两个斜杠就是一个“/”了
3.在window下文件名字都是不区别大小写的,可以随意命名。但是Linux下是区分大小写的。所以在编写程序的时候,为了考虑到跨平台性,也要把这点给考虑进去。

/* *  File(String pathname) *  传递路径名: 可以写到文件夹,可以写到一个文件 *  c:\\abc   c:\\abc\\Demo.java *  将路径封装File类型对象 */public static void function(){File file = new File("d:\\eclipse");System.out.println(file);}

5.相对路径和绝对路径

* A: 相对路径和绝对路径* a: 绝对路径* 绝对路径是一个固定的路径,从盘符开始* b: 相对路径* 相对路径相对于某个位置,在eclipse下是指当前项目下* c: 路径绝对路径在系统中具有唯一性c:\\windows\\system32相对路径表示路径之间的关系D:\\develop\\Java\\jdk1.7.0_72\\binD:\\develop\\Java\\jre7路径之间关系Java 父目录是D:\\developJava 子目录是:jdk1.7.0_72父路径是 唯一性子目录是可以多个

6.API:三大构造

FILE类有3个构造,但是各不相同。以下是各个构造的详解。
File(File parent, String child)           根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 File(String pathname)           通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 File(String parent, String child)           根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 

其中的File(String pathname)的构造已经在上面讲过了。

这里主要说明另外两种,File(File parent,String child) 和 File(String parent,String child)。其中这两个非常相似,不同的是参数的父目录不相同。

直接使用file类的实例,一种是String类型。这样的构造接口也是为了方便。
可以通过参数,直接定义子路径。

/* *  File(File parent,String child) *  传递路径,传递File类型父路径,字符串子路径 *  好处: 父路径是File类型,父路径可以直接调用File类方法 */public static void function_2(){File parent = new File("d:");File file = new File(parent,"eclipse");System.out.println(file);}/* *  File(String parent,String child) *  传递路径,传递字符串父路径,字符串子路径 *  好处: 单独操作父路径和子路径 */public static void function_1(){File file = new File("d:","eclipse");System.out.println(file);}


7.API:创建文件

createNewFile()只能创建文件,不能创建文件夹。会返回一个布尔值。
createNewFilepublic boolean createNewFile()                      throws IOException当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。检查文件是否存在,若不存在则创建该文件,这是单个操作,对于其他所有可能影响该文件的文件系统活动来说,该操作是不可分的。 注:此方法不应该 用于文件锁定,因为所得协议可能无法可靠地工作。应该使用 FileLock 机制替代。 返回:如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false 抛出: IOException - 如果发生 I/O 错误 SecurityException - 如果存在安全管理器,且其 SecurityManager.checkWrite(java.lang.String) 方法拒绝对文件进行写访问从以下版本开始: 1.2 


示例:
/* *  File创建文件的功能 *  boolean createNewFile() *  创建的文件路径和文件名,在File构造方法中给出 *  文件已经存在了,不在创建 */public static void function()throws IOException{File file = new File("c:\\a.txt");boolean b = file.createNewFile();System.out.println(b);}


8.API:创建文件夹

api提供了两个方法来创建文件夹,
mkdir()。只能创建一层文件夹。
mkdirs()。可以创建多层文件夹。也可以创建单层文件夹。所以在使用的时候,更多的是使用mkdirs()。

/* *  File创建文件夹功能 *  boolean mkdirs() 创建多层文件夹 *  创建的路径也在File构造方法中给出 *  文件夹已经存在了,不在创建 */public static void function_1(){File file = new File("c:\\abc");boolean b = file.mkdirs();System.out.println(b);}

9.API:删除

/* *  File类的删除功能 *  boolean delete() *  删除的文件或者是文件夹,在File构造方法中给出 *  删除成功返回true,删除失败返回false *  删除方法,不走回收站,直接从硬盘中删除 *  删除有风险,运行需谨慎 */public static void function_2(){File file = new File("c:\\a.txt");boolean b = file.delete();System.out.println(b);}

10.API:获取功能


获取文件名字:相当于字符串功能。取得路径的最后一个字符串。
/* *  File类的获取功能 *  String getName() *  返回路径中表示的文件或者文件夹名 *  获取路径中的最后部分的名字 */public static void function(){File file = new File("d:\\eclipse\\eclipse.exe");String name = file.getName();System.out.println(name);/*String path = file.getPath();System.out.println(path);*///System.out.println(file);}



获取文件字节数的功能:获取文件大小。
/* * File类获取功能 * long length() * 返回路径中表示的文件的字节数 */public static void function_1(){File file = new File("d:\\eclipse\\eclipse.exe");long length = file.length();System.out.println(length);}


获取文件的绝对路径:文件路径的父目录都是在eclipse的项目目录下。
/* * File类获取功能 * String getAbsolutePath() 返回String对象 * File   getAbsoluteFile() 返回File对象 * 获取绝对路径 * eclipse环境中,写的是一个相对路径,绝对位置工程根目录 */public static void function_2(){File file = new File("src");File absolute = file.getAbsoluteFile();System.out.println(absolute);}

获取文件的父目录:这里要注意的是C:/的父目录的是null。如果在去获取父目录,就是空指针了。
/* * File类的获取功能 * String getParent() 返回String对象 * File getParentFile()返回File对象 * 获取父路径 */public static void function_3(){File file = new File("d:\\eclipse\\eclipse.exe");File parent = file.getParentFile();System.out.println(parent);}



11.API:判断功能

判断路径是否存在。
/* *  File判断功能 *  boolean exists() *  判断File构造方法中封装路径是否存在 *  存在返回true,不存在返回false */public static void function(){File file = new File("src");boolean b = file.exists();System.out.println(b);}

其中isDirectory()判断文件夹,isFile()判断文件。
正常逻辑是,判断路径是否存在,再判断是否为文件或文件夹
/* *  File判断功能 *  boolean isDirectory() *  判断File构造方法中封装的路径是不是文件夹 *  如果是文件夹,返回true,不是文件返回false *   *  boolean isFile() *  判断File构造方法中封装的路径是不是文件 */public static void function_1(){File file = new File("d:\\eclipse\\eclipse.exe");if(file.exists()){boolean b = file.isDirectory();System.out.println(b);}}


12.API:获取目录文件名

listFiles()和File()方法,要知道这两个方法,能够获取系统下隐藏的文件或文件夹。

区别:
1.listFiles()返回的是file数组。File()返回的是String数组。
2.listFiles()返回的数据,是全路径。而File()返回的是名字。


/* *  File类的获取功能 *  File[] listFiles() *  获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录) *  返回的是目录或者文件的全路径 */public static void function_1(){File file = new File("d:\\eclipse");File[] fileArr = file.listFiles();for(File f : fileArr){System.out.println(f);}}/* *  File类的获取功能 *  String[] list() *  获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录) *  返回只有名字 */public static void function(){File file = new File("c:");String[] strArr = file.list();System.out.println(strArr.length);for(String str : strArr){System.out.println(str);}}


扩展:
静态方法listRoots()。获取系统中的所有根目录。

public static void function_2(){//获取系统中的所有根目录File[] fileArr = File.listRoots();for(File f : fileArr){System.out.println(f);}}


13.API:文件过滤器

listFiles(FileFilter filter)接口类型这个方法,他的参数FileFilter是一个接口,需要创建他的实现类,实现类里有accept的方法。当调用到listFiles的时候,就会调用到accept这个方法,再accept里去对文件类型进行判断,如果为false就过滤掉。
/* *  自定义过滤器 *  实现FileFilter接口,重写抽象方法 */public class MyFilter implements FileFilter{public boolean accept(File pathname)  {/* * pathname 接受到的也是文件的全路径 * c:\\demo\\1.txt * 对路径进行判断,如果是java文件,返回true,不是java文件,返回false * 文件的后缀结尾是.java *///String name = pathname.getName();return pathname.getName().endsWith(".java");}}/* *  File类的获取,文件获取过滤器 *  遍历目录的时候,可以根据需要,只获取满足条件的文件 *  遍历目录方法 listFiles()重载形式 *  listFiles(FileFilter filter)接口类型 *  传递FileFilter接口的实现类 *  自定义FileFilter接口实现类,重写抽象方法, *  接口实现类对象传递到遍历方法listFiles */public class FileDemo1 {public static void main(String[] args) {File file = new File("c:\\demo");File[] fileArr = file.listFiles(new MyFilter());for(File f : fileArr){System.out.println(f);}}}


原理
文件过滤器_原理分析* A:文件过滤器_原理分析* listFiles()遍历目录的同时,获取到了文件名全路径,调用过滤器的方法accept,将获取到的路径传递给accept方法的参数pathname* accept方法接收了参数pathname,参数是listFiles传递来的* 在accept方法中,进行判断,如果这个路径是Java文件,返回true,走着返回false* 一旦方法返回了true* listFiles将路径保存到File数组中






14.遍历全目录

这个方法主要是利用了递归调用,遍历出了全部的文件。

/* *  定义方法,实现目录的全遍历 */public static void getAllDir(File dir){System.out.println(dir);//调用方法listFiles()对目录,dir进行遍历File[] fileArr = dir.listFiles();for(File f : fileArr){//判断变量f表示的路径是不是文件夹if(f.isDirectory()){//是一个目录,就要去遍历这个目录//本方法,getAllDir,就是给个目录去遍历//继续调用getAllDir,传递他目录getAllDir(f);}else{System.out.println(f);}}}


15.遍历目录下的所有java文件



public class MyJavaFilter implements FileFilter {public boolean accept(File pathname) {//判断获取的是目录,直接返回trueif(pathname.isDirectory())return true;return pathname.getName().toLowerCase().endsWith(".java");}}/* *  遍历目录,获取目录下的所有.java文件 *  遍历多级目录,方法递归实现 *  遍历的过程中,使用过滤器 */public class FileDemo1 {public static void main(String[] args) {getAllJava(new File("c:\\demo"));//new File("c:\\demo").delete();}/* * 定义方法,实现遍历指定目录 * 获取目录中所有的.java文件 */public static void getAllJava(File dir){//调用File对象方法listFiles()获取,加入过滤器File[] fileArr = dir.listFiles(new MyJavaFilter());for(File f : fileArr){//对f路径,判断是不是文件夹if(f.isDirectory()){//递归进入文件夹遍历getAllJava(f);}else{System.out.println(f);}}}}





原创粉丝点击