Java输入输出流

1.基础概念

  • 流:一组有序的数据结构,将数据从一个地方带到另一个地方。根据数据流向的不同,可以分为输入流和输出流。
  • Java程序通过流完成输入/输出,所有的输入/输出都以流的形式处理。(数据流是Java进行I/O操作的对象)
  1. 按照流的方向主要分为输入流和输出流两大类。
  2. 数据流按照数据单位的不同分为字节流和字符流。
  3. 按照功能可以划分为节点流和处理流。

数据流处理流程

  • 数据流的处理只能按照数据序列的顺序来进行,即前一个数据处理完之后才可处理后一个数据。
  • 数据流以输入流的形式被程序获取,再以输出流的形式输出到其他设备。
    输入/输出流模式如下:
    image

Java流相关的类都封装在java.io包中,且每个数据流都是一个对象。

1-输入流

  • 所有输入流都是InputStream抽象类(字节输入流)和Reader抽象类(字符输入流)的子类。

InputStream类的层次结构及常用方法如下:
image

image

2-输出流

  • 所有输出流类都是OutputStream抽象类(字节输出流)和Writer抽象类(字符输出流)的子类。

OutputStream类的层次结构及常用方法:
image

image

注:从本质上来讲,写数据(即输出)的时候,字节也好,字符也好,本质上都是没有标识符的,需要去指定编码方式。但读数据的时候,如果我们需要去“看数据”,那么字节流的数据需要指定字符编码方式,这样我们才能看到我们能识别的字符(否则乱码);而字符流,因为已经选择好了字符编码方式,通常不需要再改了

2.Java系统流

  • Java程序运行时自带有一个系统流(对应类java.lang.System)。该类封装了Java程序运行时的三个系统流(作用域为public和static):
  1. System.in:标准输入流,默认设备为键盘
  2. System.out:标准输出流,默认设备为控制台。
  3. System.err:标准错误流,默认设备是控制台。

3.Java File(文件操作类)

  • File类是Java.io包中唯一代表磁盘文件本身的对象(File类不能访问文件内容本身,需使用输入/输出流访问)

File类的三种构造方法:

  1. File(String path):path可为目录/文件,File对象标识的就是目录/文件
    为文件时idea中默认路径为工程路径
  2. File(String path, String name):path是路径,name是文件名
  3. File(File dir, String name):dir是路径对象,name是文件名

File类两个常用常量如下:

  1. public static final String pathSeparator:分隔连续多个路径字符串的分隔符(win下为;)
  2. public static final String separator:分隔同意路径字符串中的目录(win下为/)
    注:win中文件目录D:\xxx\xx,Java中使用时\应为/或\

File类常用方法如下:image

通过遍历目录可以在指定的目录中查找文件或显示所有文件列表,有如下两种重载形式

  1. String[] list() 返回File对象表示目录中所有文件和子目录名称的字符串数组(null)

eg.

    String path = "D:/IdeaProject/";
    File ff = new File(path);
    String[] FileList = ff.list();
    for(String str: FileList){
        System.out.println(str + (new File(path, str).isFile()? "文件": "文件夹"));
        System.out.println(str + "字节长度为" + (new File(path, str).length()));
    }
  1. String[] list(FilenameFilter filter) 返回数组中仅包含filter过滤器的文件和目录(null则接受所有名称)
    注:需先实现java.io.FilenameFilter接口,然后将过滤类传递给list方法(FileStream)
    @Override public boolean accept(File dir, String name) { return name.endsWith(".idea") || name.endsWith(".txt"); }
    也可在list中直接实现接口
    String[] filterList = ff.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".idea") || name.endsWith(".txt"); } });

eg.

    String[] filterList = ff.list(new FileStream());
    for(String str: filterList){
        System.out.println(str + (new File(path, str).isFile()? "文件": "文件夹"));
        System.out.println(str + "字节长度为" + (new File(path, str).length()));
    }

4.Java动态读取文件内容

  • 文件的输入和输出主要通过Scanner类从文件中读取文本数据;PrintWriter类向文本写入数据
    PrintWriter output = new PrintWriter(file);
    Scanner input = new Scanner(file);

使用try-with-resources自动关闭资源

  • AutoCloseable子类型(Scanner,PrintWriter)资源有close方法,使用完的资源close以防止内存泄漏。

try-catch-finally方法可防止发生异常而未关闭资源(try-with-resources相当于该方法的语法糖)

用法:

posted @ 2021-09-09 09:56  rttrti  阅读(645)  评论(0编辑  收藏  举报