Java中的File类以及IO流

File 类

概述

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。

构造方法

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
  • 构造举例,代码如下:
// 文件路径名
String pathname = "D:\\aaa.txt";
File file1 = new File(pathname); 

// 文件路径名
String pathname2 = "D:\\aaa\\bbb.txt";
File file2 = new File(pathname2); 

// 通过父路径和子路径字符串
 String parent = "d:\\aaa";
 String child = "bbb.txt";
 File file3 = new File(parent, child);

// 通过父级File对象和子路径字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);

常用方法

获取功能的方法

  • public String getPath() :返回此File的路径(构造时的路径)。
  • public String getAbsolutePath() :返回此File的绝对路径名字符串。
  • public String getCanonicalPath() :返回此File的经过路径变换后的字符串。
  • public String getPath() :将此File转换为路径名字符串。
  • public String getName() :返回由此File表示的文件或目录的名称。
  • public long length() :返回由此File表示的文件的长度。

判断功能的方法

  • public boolean exists() :此File表示的文件或目录是否实际存在。
  • public boolean isDirectory() :此File表示的是否为目录。
  • public boolean isFile() :此File表示的是否为文件。

创建删除功能的方法

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
  • public boolean delete() :删除由此File表示的文件或目录。
  • public boolean mkdir() :创建由此File表示的目录。
  • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

目录的遍历

  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
  • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

listFiles可以接受一个FileFilter接口,只得到符合条件的文件。

应用示例

打印目录树:

public class Main {
    public static void main(String[] args) throws Exception {
        if(args.length>1) {
            System.out.println("参数格式错误!");
            return;
        }
        String dirName = "./";
        if(args.length == 1)
            dirName = args[0];
        File dir = new File(dirName);
        if(!dir.isDirectory()) {
            System.out.println("目录不存在!");
            return;
        }
        printDir(dir,0);
    }

    public static void printDir(File dir,int depth) throws IOException {
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i<depth;i++) sb.append("  ");
        String tab = sb.toString();
        for(File file:dir.listFiles()){
            if(file.isDirectory()){
                System.out.println(tab+"\u001B[31m" + file.getName() + "\033[0m");
                printDir(file,depth+1);
            }else System.out.println(tab+file.getName());
        }
    }
}

只输出目录:

public class Main {
    public static void main(String[] args){
        File dir = new File("./");
        for(File file:dir.listFiles(f->{
            if(f.isDirectory()) return true;
            return false;
        })){
            System.out.println(file.getName());
        }
    }
}

字节流与字符流

流的分类

输入流 输出流
字节流 字节输入流
InputStream
字节输出流
OutputStream
字符流 字符输入流
Reader
字符输出流
Writer

关闭和刷新

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush 方法了。

  • flush :刷新缓冲区,流对象可以继续使用。
  • close:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

OutputStream

java.io.OutputStream抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

  • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
  • public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
  • public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
  • public abstract void write(int b) :将指定的字节(b的低8位)写入输出流。

String有个方法getByte()可以方便地获取字符串字节数组。

FileOutputStream类

java.io.FileOutputStream类是文件输出流,用于将数据写出到文件。

构造方法:

  • public FileOutputStream(File file, boolean append): 创建文件输出流以写入由指定的 File对象表示的文件。
  • public FileOutputStream(String name, boolean append): 创建文件输出流以指定的名称写入文件。

其中boolean append参数都可省略,默认为false。决定打开文件时是否在文件末尾追加,否则覆盖文件内容。

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。

InputStream

java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。

  • public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
  • public abstract int read(): 从输入流读取数据的下一个字节。
  • public int read(byte[] b): 从输入流中读取一些字节,并将它们存储到字节数组 b中 。(读满b的长度)
  • public int read(byte b[], int off, int len) 从输入流中读取一些字节,并将它们存储到字节数组b中 。(off为偏移量,len为读取长度)
  • public long skip(long n) 跳过n长度字节不读取。(指针后移n字节)
  • public void reset() 指针重新移至流开头

read()方法如果读到流末尾返回-1
read(byte[] b)方法返回读取的长度,读到末尾返回-1

FileInputStream类

java.io.FileInputStream类是文件输入流,从文件中读取字节。

构造方法:

  • FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
  • FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException

应用

复制图片文件:

public class Copy {
    public static void main(String[] args) throws IOException {
        // 1.创建流对象
        // 1.1 指定数据源
        FileInputStream fis = new FileInputStream("D:\\test.jpg");
        // 1.2 指定目的地
        FileOutputStream fos = new FileOutputStream("test_copy.jpg");

        // 2.读写数据
        // 2.1 定义数组
        byte[] b = new byte[1024];
        // 2.2 定义长度
        int len;
        // 2.3 循环读取
        while ((len = fis.read(b))!=-1) {
            // 2.4 写出数据
            fos.write(b, 0 , len);
        }

        // 3.关闭资源
        fos.close();
        fis.close();
    }
}

Reader

java.io.Reader抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

  • public void close() :关闭此流并释放与此流相关联的任何系统资源。
  • public int read(): 从输入流读取一个字符。 返回的char自动提升为int。
  • public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。
  • public int read(char cbuf[], int off, int len):: 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。(off为偏移量,len为读取长度)

read带数组参数的返回的是读取的字符长度,未读取返回-1。

FileReader类

java.io.FileReader类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

构造方法:

  • FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。
  • FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的名称。

Writer

java.io.Writer抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。

  • void write(int c) 写入单个字符。
  • void write(char[] cbuf)写入字符数组。
  • abstract void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
  • void write(String str)写入字符串。
  • void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
  • void flush()刷新该流的缓冲。
  • void close() 关闭此流,但要先刷新它。

FileWriter类

java.io.FileWriter类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

构造方法:

  • FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。
  • FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。

try-with-resource

如果遇到异常需要关闭流,JDK7之前可以使用try-catch-finally,JDK7提供了一种try-with-resource语法糖,可以方便关闭流。

代码使用演示:

public class HandleException2 {
    public static void main(String[] args) {
        // 创建流对象
        try ( FileWriter fw = new FileWriter("**"); ) {
            // 写出数据
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/java%e4%b8%ad%e7%9a%84file%e7%b1%bb%e4%bb%a5%e5%8f%8aio%e6%b5%81/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年2月3日 21:44
下一篇 2020年2月4日

相关推荐

  • NIO网络编程之Selector介绍

    Selector 要实现异步IO要通过Selector,甚至我们可以通过一个线程管理多个Channel的读写,这是NIO相较BIO的优越之处之一。 Channel可以注册到一个Se…

    Java 2020年2月7日
    0750
  • Java日志框架Logback介绍和使用

    前置知识: 日志门面SLF4J介绍和使用 Logback概述 Logback是由log4j、slf4j创始人Ceki Gülcü设计的另一个开源日志组件,性能比log4j要好。它自…

  • 操作系统五种IO模型介绍

    本文参考资源: 五种IO模型详解IO模型,java小范的博客-CSDN博客 阻塞 IO 模型 最传统的一种 IO 模型,即在读写数据过程中会发生阻塞现象。当用户线程发出 IO 请求…

    计算机相关 2020年2月12日
    0700
  • Java多线程共享模型之管程

    Monitor(锁) Monitor被翻译为监视器或管程。 Monitor是重量级锁的实现,是向操作系统申请的。 Monitor的结构:WaitSet、EntryList、Owne…

    2020年2月2日
    0930
  • 深入理解java虚拟机第三版读书笔记11

    以下是第十一章 后端编译与优化的内容 把Class文件转换成与本地基础设施(硬件指令集、操作系统)相关的二进制机器码可以视为整个编译过程的后端。 最近几年提前编译也开始兴起,我们在…

    2020年1月27日
    0270
  • Java基础查缺补漏02

    哈哈我其实没有想到这个系列真会有续集,上次写完01以后以为不会再写下去了,没想到最近牛客网刷题有些题目还是挺纠结的,这里补一补 构造器能带哪些修饰符 题目: Which of th…

    Java 2020年5月25日
    080
  • 深入理解java虚拟机第三版读书笔记10

    以下是第十章 前端编译与优化的内容 Java中的编译可能是指: 前端编译:把*.java文件转变成*.class文件的过程 即时编译(JIT):运行期把字节码转变成…

    Java 2020年1月25日
    0110
  • PriorityQueue源码分析

    总结 总结放前面防止太长不看: PriorityQueue是个最小堆,如果要改变排序顺序只能重写比较器传入构造方法。 内部元素要么实现Comparable接口,要么传入比较器进行比…

    Java 2020年2月10日
    0250
  • HashMap源码分析

    HashMap是java中非常常见的一个数据结构,在这篇文章里,我依然以Map中的操作为导向来循序渐进研究HashMap中的源码,阅读这篇文章需要的前置知识有: 弱平衡的二叉查找树…

    Java 2020年2月12日
    0220
  • LinkedHashMap源码分析

    总结 总结放前面防止太长不看: LinkedHashMap继承自HashMap,为Entry额外维护了两个属性:before和after,可以按照节点的插入顺序或者访问顺序为Ent…

    Java 2020年2月19日
    0540

发表回复

登录后才能评论