NET2Java之三:文件IO

Java中对于文件的操作主要用File类,它既能操作文件,又能操作目录,功能类似于.NET中Directory和File的集合,在java7之后,java.nio.file中提供了更为强大的Files来操作文件。

读操作

  • exists:判断文件或者文件夹是否存在
  • isDir:判断是否是文件夹,所以判断文件夹是否存在时,不单单要判断exists,还要判断isDir
  • isFile:顾名思义,判断是不是文件
  • list:遍历文件夹,返回值是文件路径,不管是文件夹还是文件,一视同仁返回,需要自己筛选,如果没有子级,返回null
  • listFile:也是遍历文件夹,不过返回值是File对象,值得一提的是,不管是list还是listFile都不会遍历子文件夹,需要自己写递归函数,可以考虑使用Files中的walk和walkFileTree来遍历,如:
Path fp=Paths.get(path);
        Stream<Path> sfp=Files.walk(fp);
//filter是一个筛选器,比如isRegularFile筛选文件、isDirectory筛选文件夹
//你也可以这样写:filter(f -> f.endsWith(".txt"))来筛选txt文件
        sfp.filter(Files::isRegularFile).map(x->x.toString()).collect(Collectors.toList());
  • getParent:获取父级文件名称,如果没有父级就返回null
  • getParentFile:同getParent,返回值不同
  • getName:返回当前文件或文件夹的名称
  • getAbsolutePath:返回绝对地址
  • getFreeSpace:获取目录所在磁盘的剩余空间,以字节为单位
  • getTotalSpace:获取目录所在磁盘的总空间,以字节位单位
  • isAbsolute:判断文件路径是否为绝对路径
  • isHidden:判断指定的文件是是隐藏文件
  • length:如果是文件,那就是文件大小;如果是文件夹,那这个就是目录元数据的大小,文件夹的大小请自行遍历累加
  • canExecute:能否被执行
  • canRead:能否读取
  • canWrite:能否修改
  • lastModified:获取文件的最后一次被修改时间,注意和.NET不同的是,这是一个UTC时间

写操作

  • mkdir:创建文件夹
  • mkdirs:创建文件夹,与mkdir不同的是,mkdir只会创建最后一级文件夹,若父级文件夹不存在则创建失败,而mkdirs则会创建路径上所有不存在的文件夹
  • renameTo:变更文件名称
  • setExecutable:设置可执行权限
  • setReadable:设置读取权限
  • setWritable:设置写权限
  • setLastModified:设置最后一次修改时间
  • delete:删除文件
  • deleteOnExit:非常有意思的操作,在程序结束时再删除
  • createNewFile:创建文件

File当中并没有拷贝操作,需要拷贝的话,需要自己读取并写入:

    File f1=new File("D:\\1.txt");
        File f2=new File("D:\\2.txt");
        try{
        FileInputStream fis=new FileInputStream(f1);
        FileOutputStream fos=new FileOutputStream(f2);
        byte[]buffer=new byte[1024];
        int length=fis.read(buffer);
        do{
        fos.write(buffer,0,length);
        length=fis.read(buffer);
        }while(length>0);

        }catch(Exception e){
        e.printStackTrace();
        }

或者使用Files.copy来操作

    Path p1= Paths.get("D:\\1.txt");
    Path p2= Paths.get("D:\\2.txt");
    try {
        Files.copy(p1,p2, StandardCopyOption.REPLACE_EXISTING);
    } catch (IOException e) {
        e.printStackTrace();
    }

文件IO算是java中最常见的操作之一了,很遗憾File中并没有readAllLines和writeAllLines方法,比较常见的是用FileReader:

    File fl = new File("D:\\屏蔽词.txt");

    try {
        FileReader fileReader = new FileReader(fl.toString());
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
    }
    bufferedReader.close();
    fileReader.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

当然Files直接封装了方法:

    Path path = Paths.get("D:\\屏蔽词.txt");
    try {
        List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
        for (String line : lines) {
            System.out.println(line);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }

不过由于readAllLines会将文件一次性加载到内存中,所以Files中又提供了lines方法来逐行加载,避免大文件操作时的内存损耗,如:


    try {
        Path path = Paths.get("D:\\屏蔽词.txt");
        Stream<String> lines = Files.lines(path);
        lines.forEach(line -> {
            System.out.println(line);
        });
    } catch (Exception ex) {
        ex.printStackTrace();
    }

此外Scanner中也提供了不少和文件相关的操作:

    File fl = new File("D:\\屏蔽词.txt");

    try {
        Scanner scanner = new Scanner(fl);
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            System.out.println(line);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }

写文件一般用FileWriter和BufferedWriter:

    try {
        FileWriter fileWriter = new FileWriter("D:\\新屏蔽词.txt");
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        for (int i = 0; i < 100; i++) {
            bufferedWriter.write(i + ":测试");
            bufferedWriter.newLine(); //换新行
        }
        bufferedWriter.flush();
        bufferedWriter.close();
        fileWriter.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }

Files中也提供了文件相关的操作:

    try {
        Path path = Paths.get("D:\\屏蔽词.txt");
        Files.write(path,"别说话".getBytes());
    } catch (Exception ex) {
        ex.printStackTrace();
    }

写入多行:

    List<String> lines = new ArrayList<>();
    lines.add("第一行");
    lines.add("第二行");
    lines.add("第三行");
    lines.add("第四行");
    lines.add("第五行");

    try {
        Path path = Paths.get("D:\\屏蔽词.txt");
        Files.write(path, lines, StandardCharsets.UTF_8);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章