Java输入输出流
1.基础概念
- 流:一组有序的数据结构,将数据从一个地方带到另一个地方。根据数据流向的不同,可以分为输入流和输出流。
- Java程序通过流完成输入/输出,所有的输入/输出都以流的形式处理。(数据流是Java进行I/O操作的对象)
- 按照流的方向主要分为输入流和输出流两大类。
- 数据流按照数据单位的不同分为字节流和字符流。
- 按照功能可以划分为节点流和处理流。
数据流处理流程
- 数据流的处理只能按照数据序列的顺序来进行,即前一个数据处理完之后才可处理后一个数据。
- 数据流以输入流的形式被程序获取,再以输出流的形式输出到其他设备。
输入/输出流模式如下:
Java流相关的类都封装在java.io包中,且每个数据流都是一个对象。
1-输入流
- 所有输入流都是InputStream抽象类(字节输入流)和Reader抽象类(字符输入流)的子类。
InputStream类的层次结构及常用方法如下:
2-输出流
- 所有输出流类都是OutputStream抽象类(字节输出流)和Writer抽象类(字符输出流)的子类。
OutputStream类的层次结构及常用方法:
注:从本质上来讲,写数据(即输出)的时候,字节也好,字符也好,本质上都是没有标识符的,需要去指定编码方式。但读数据的时候,如果我们需要去“看数据”,那么字节流的数据需要指定字符编码方式,这样我们才能看到我们能识别的字符(否则乱码);而字符流,因为已经选择好了字符编码方式,通常不需要再改了
2.Java系统流
- Java程序运行时自带有一个系统流(对应类java.lang.System)。该类封装了Java程序运行时的三个系统流(作用域为public和static):
- System.in:标准输入流,默认设备为键盘
- System.out:标准输出流,默认设备为控制台。
- System.err:标准错误流,默认设备是控制台。
3.Java File(文件操作类)
- File类是Java.io包中唯一代表磁盘文件本身的对象(File类不能访问文件内容本身,需使用输入/输出流访问)
File类的三种构造方法:
- File(String path):path可为目录/文件,File对象标识的就是目录/文件
为文件时idea中默认路径为工程路径 - File(String path, String name):path是路径,name是文件名
- File(File dir, String name):dir是路径对象,name是文件名
File类两个常用常量如下:
- public static final String pathSeparator:分隔连续多个路径字符串的分隔符(win下为;)
- public static final String separator:分隔同意路径字符串中的目录(win下为/)
注:win中文件目录D:\xxx\xx,Java中使用时\应为/或\
File类常用方法如下:
通过遍历目录可以在指定的目录中查找文件或显示所有文件列表,有如下两种重载形式
- 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()));
}
- 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相当于该方法的语法糖)
用法: