Java

Java IO笔记(File)

2019-12-06  本文已影响0人  moonfish1994

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


引子

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

正文

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

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

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

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

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 文件的操作就暂且说到这儿吧,之后的篇幅将要开始讲述管道的使用了。

上一篇 下一篇

猜你喜欢

热点阅读