美文网首页Java
Java IO笔记(File)

Java IO笔记(File)

作者: moonfish1994 | 来源:发表于2019-12-06 19:04 被阅读0次

    (最近刚来到简书平台,以前在CSDN上写的一些东西,也在逐渐的移到这儿来,有些篇幅是很早的时候写下的,因此可能会看到一些内容杂乱的文章,对此深感抱歉,以下为正文)


    引子

    本篇讲述在Java IO中对文件的一些操作,在java IO中,文件是一种最常见的数据源。因此java IO对其提供了专门的IO流来进行操作。

    正文

    Java提供了一个类来表示文件,这个类就是File类,位于java.io.File。该类的功能十分强大,下面将一一介绍。

    首先我们来看看file类的构造方法,在我使用的jdk1.7中,该类一共提供了4个构造方法,分别为:

    • public File(String pathname) pathname是目标文件的路径,可以使绝对路径,也可以是相对路径。
    • public FIle(String parent, String child) parent是父文件的路径,child是目标文件的路径,可以使绝对路径,也可以是相对路径。
    • public File(File parent, String child)parent是父文件对象,child是目标文件的路径,可以使用绝对路径,也是是相对路径。
    • public File(Url url)url是目标文件的url。这里的url是统一资源定位符,如果不知道的话可以查询一下资料,如今发达的互联网使我们学习东西非常的方便。

    File类还提供了一些方法来帮助我们对文件进行操作,下面将列举一些常见的方法:

    • boolean createNewFile(); 创建文件,如果文件存在则返回false,否则返回true,并创建文件。
    • boolean mkdir(); 创建目录。
    • boolean mkdirs(); 创建多级目录。
    • boolean delete(); 删除文件,如果是文件夹,必须保证是空文件夹才能删除成功。
    • boolean deleteOnExit(); 删除文件,功能基本与delete方法一样,唯一的区别就是该方法不是立即执行,而是等到虚拟机运行结束的时候才真正的删除文件。
    • boolean canExecute(); 判断文件是否可以执行。
    • boolean canRead(); 判断文件是否可读。
    • boolean canWrite(); 判断文件是否科协。
    • boolean exists(); 判断文件是否存在。、
    • boolean isDirectory(); 判断文件是否是目录。
    • boolean isFile(); 判断文件是否是文件(不是目录)。
    • boolean isHidden(); 判断文件是否是隐藏的。
    • String getName(); 获取文件名。
    • String getPath(); 获取文件相对路径。
    • String getAbsolutePath(); 获取文件绝对路径。
    • String getParent(); 返回父目录,如果没有则返回null。
    • long lastModified(); 返回最后一次修改时间,单位为毫秒,可以用Date类进行转换。
    • long length(); 返回文件的大小,单位是字节。
    • boolean renameTo(File f); 重命名文件,可以起到移动文件的作用,磁盘的格式影响该方法的成功率。
    • File[] liseRoots(); 获取机器盘符。
    • String[] list(FilenameFilter filter); 列出符合过滤器的所有文件名。

    通过以上方法我们可以对文件系统进行丰富的操作,下面将通过代码一一展示。

    private void initFile() throws Exception {
            // public File(String pathname)pathname使用绝对路径
            file1 = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file\\test.txt");
            // public File(String pathname)pathname使用相对路径
            file = new File(".\\src\\file\\test.txt");
            // public File(String parent, String child)
            file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file","test.txt");
            // public File(URI uri)
            URI url = new URI("file:///e:/workspaceforlibgdx/IOStudy/src/file/test.txt");
            file = new File(url);   
    }
    

    我在指定目录下放下了test.txt文本,上面的四种初始化方式均能得到指定文件的File对象。

    private void doCreateAction() throws Exception{
            System.out.println("========================doCreateAction===============================");
            //在下述路径下创建文件,因为目标路径下没有该文件,所以返回true,并创建对应文件。
            file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file\\create.txt");
            flag = file.createNewFile();
            System.out.println(flag);
            //在下述路径下创建文件夹,因为目标路径下没有该文件夹,所以返回true,并创建对应文件夹。
            file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file\\file1");
            flag = file.mkdir();
            System.out.println(flag);
            //在下述路径下创建多级文件夹,因为目标路径下没有这些文件夹,所以返回true,并创建对应文件夹。
            file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file\\file1\\file2\\file3");
            flag = file.mkdirs();
            System.out.println(flag);
    }
    

    上述方法会在指定位置创建相应的文件和目录,执行后,可以看到如下打印:


    打印输出
    private void doDeleteAction() throws Exception{
      System.out.println("=================================doDeleteAction====================================");
      //delete方法可以删除指定的文件,删除文件夹时,必须保证该文件是空文件夹,否则删除失败。
      //deleteOnExit方法同delete方法一样用于删除文件,唯一区别就是,delete方法是执行时就会删除,而该方法则是在虚拟机运行结束时才会删除。
      file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file\\delete.txt");
      file.createNewFile();
      flag = file.delete();
      System.out.println(flag);
      file.deleteOnExit();
     }
    

    执行上述代码可以删除指定位置的文件,执行后,可以看到如下打印:


    打印输出
    private void doQueryAction() {
      System.out.println("=====================================doQueryAction==================================");
      file = new File("E:\\workspaceforlibgdx\\IOStudy\\src\\file");
      //getName方法获取文件名。
      System.out.println("file.getName:"+file.getName());
      //getPath方法获取相对路径。
      System.out.println("file.getPath:"+file.getPath());
      //getAbsolutePath方法获得绝对路径。
      System.out.println("file.getAbsolutePath:"+file.getAbsolutePath());
      //getParent方法获得父文件的路径。
      System.out.println("file.getParent:"+file.getParent());
      //lstModified方法获得最后一次修改文件的时间,返回long型,可以通过Date类进行转换。
      System.out.println("file.lastModified:"+new Date(file.lastModified()));
      //length方法返回文件的大小,单位是字节。
      System.out.println("file.length():"+file.length());
      //renameTo方法可以将该文件重命名或者移动位置,但磁盘格式有时候会影响该方法是否能执行成功
      System.out.println("file.length:"+file.renameTo(file));
      //listRoots方法可以获取系统盘符
      System.out.println("File.listRoots==================");
      File[] files = File.listRoots();
      for(File file : files){
        System.out.println(file.getPath());
      }
      //listFiles方法是列出指定目录下的所有文件
      System.out.println("file.listFiles==================");
      File[] files1 = file.listFiles();
      for(File file : files1){
        System.out.println(file.getPath());
      }
      //list方法师列出指定目录下所有文件名
      System.out.println("file.list==================");
      String[] lists = file.list();
      for(String list : lists){
        System.out.println(list);
      }
      //list(new FilenameFilter)方法可以添加过滤器来对返回的文件名践行筛选,下面是过滤出包含 txt的文件
      System.out.println("file.list(new filenamefilter)==================");
      String[] lists1 = file.list(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
          if(name.contains("txt")){
            return true;
          }
        return false;
        }
      });
      for(String list : lists1){
        System.out.println(list);
      }
    }
    

    执行上述代码,可以对文件或者目录进行一些信息的查询,执行后,可以看到如下打印:


    打印输出
    public void doJudgeAction(){      System.out.println("=================================doJudgeAction====================================");
      System.out.println("file1.canExecute:"+file1.canExecute());
      System.out.println("file1.canRead:"+file1.canRead());
      System.out.println("file1.canWrite:"+file1.canWrite());
      System.out.println("file1.exists:"+file1.exists());
      System.out.println("file1.isDirectory:"+file1.isDirectory());
      System.out.println("file1.isFile:"+file1.isFile());
      System.out.println("file1.isHidden:"+file1.isHidden());
      System.out.println("file1.isAbsolute:"+file1.isAbsolute());
    }
    

    执行上述代码,可以对文件进行一些判断,执行后得到如下打印:


    打印输出

    通过上述的方法,我们再加以修改,完全可以写出一些好玩的东西,如写一个文件查找器亦或是一个文件删除工具。

    public void doQueryAllAction() {
      Scanner scanner = new Scanner(System.in);
      String path = scanner.next();
      File root = new File(path);
      if (root.exists()) {
        queryTool(root, 0);
      } else {
        System.out.println("you type a wrong path");
      }
      scanner.close();
    }
     
    private ArrayList<File> queryTool(File file, int lev) {
      if (file.isFile()) {
        list.add(file);
        System.out.println("文件"+getSymbols(lev,false) + file.getName());
      } else if (file.isDirectory()) {
        System.out.println("目录"+getSymbols(lev,true) + file.getName());
        lev++;
        File[] files = file.listFiles();
        for (File temp : files) {
          queryTool(temp, lev);
        }
      }
      return list;
    }
     
    private String getSymbols(int number,boolean isfile) {
      StringBuffer sb = new StringBuffer();
      for (int i = 0; i < number; i++) {
        if(isfile){
          sb.append("-");
        }else {
          sb.append("-");
        }
      }
      return sb.toString();
     }
    

    执行doQueryAllAction方法,可以根据输入的路径,罗列出指定路径下的所有文件,执行后得到如下打印:


    打印结果
    private boolean doDeleteAllAction(){
      doQueryAllAction();
      for(File file : list){
        System.out.println("文件【"+file.getName()+"】已删除");
      file.delete();
      }
      return true;
    }
    

    执行上述方法可以删除输入路径下的所有文件,执行后得到如下打印:


    打印结果

    以上就是对于java.io中File类的一些操作了,是不是很神奇呢,Java完全可以模拟我们平常对文件的一些操作,创建,移动,删除等等,下面要讲的就是如何往文件中写入数据了,这里就要用到流了。

    //除了使用FileReader还可以使用FileInputStream进行文件读取,当然你还可以使用RandomAccessFile来进行选择性读取。
    private void doReadAction() throws Exception {
      Scanner scanner = new Scanner(System.in);
      String path = scanner.next();
      File root = new File(path);
      StringBuffer sb = new StringBuffer();
      if (root.isFile()) {
        FileReader fr = new FileReader(root);
        char[] temp = new char[1024];
          while (fr.read(temp) != -1) {
            sb.append(temp);
          }
        fr.close();
        scanner.close();
        System.out.println(sb.toString());
      }
    }
    

    通过上述方法,可以读取指定路径下的文件(暂指文本文件),执行后,得到如下打印:


    打印结果
    private void doWriteAction() throws Exception {
      Scanner scanner = new Scanner(System.in);
      String path = scanner.next();
      File root = new File(path);
      if(root.isFile()){
        FileWriter fw = new FileWriter(root);
        fw.write("java io操作 之 文件  ");
        System.out.println("文件写入完成");
        fw.close();
        scanner.close();
      }
    }
    

    执行上述方法可以向指定文件内写入内容,执行后得到如下打印:


    测试结果 测试结果

    关于Java IO 文件的操作就暂且说到这儿吧,之后的篇幅将要开始讲述管道的使用了。

    相关文章

      网友评论

        本文标题:Java IO笔记(File)

        本文链接:https://www.haomeiwen.com/subject/bhwegctx.html