IO体系介绍
输入输出
包括对控制台,内存,文件,图形图像,网络和数据库的读写等。在Java语言中,java.io包就提供了很多完成输入输出处理功能。
流
流是一种有序的字节源或目的,当程序需要读取数据时就要打开一个通向数据源的流;而当程序需要写入数据的时候就会打开一个通向目的地的流,数据就好像在管道中流动一样。
将流按三种方式分类:
1. 输入流和输出流, 2. 字节流和字符流, 3. 以及从一个特定地方读写的结点流和连接已经存在的流的过滤流。
这种分类方式是相互重叠的。
基本流的介绍
基本流一般是指
InputStream
OutputStream
Reader
Writer
这四个抽象类表示的流,其他流均是他们派生出来的子类。其中InputStream与OutputStream是处理8位的字节流数据,Reader和Writer是处理16位的字符流数据。
注意:字节流和字符流可以相互之间进行转换,使用的就是转换器InputStreamReader和OutputStreamWriter,InputStreamReader将字节流InputStream转换为Reader的字符流。同理OutputStreamWriter将OutputStream字节流转换为Writer的字符流。
过滤流FilterInputStream和FileterOutputStream继承基本流,并实现了过滤接口DataInput和DataOutput
对象流ObjectInputStream和ObjectOutputStream也继承基本流,并实现了对象接口ObjectInput和ObjectOutput
随机文件RandomAccessFile也实现了过滤接口,目的就是为了简化读写手续,统一数据读写方法。
文件流完成对磁盘文件的读写,而文件类File主要是管理文件或者文件夹的属性。
字节IO
字节输入输出,以InputStream为代表的输入和以OutputStream为代表的输出,它们和自己的子类一起构成了字节输入输出体系。
InputStream:
这个类是一个抽象类,为所有字节输入类的父类,其方法都是通过子类对象来调用的,主要方法有:
OutputStream:
这个类是抽象类,是所有字节输出类的父类,其方法都是通过子类对象来调用。
字节标准输入流
System.in就是字节标准输入流的对象。主要接收控制台的输入,并提供read()方法读取数据。可以使用InputStream类的所有方法。这个对象有两种使用方式
使用Scanner扫描输入流对象,实现从控制台输入
Scanner in = new Scanner(System.in);
使用InputStreamReader将System.in转换成字符流,再进行下一步操作。或者再用BufferedReader包装一下。
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
字节标准输出流
System.out就是标准输出流。PrintStream的一个对象,主要完成数据的格式化输出和在控制台中输出各种数据类型结果。
PrintStream是OutputStream的子类,因此System.out可以使用OutputStream的所有方法。自身的format()和printf()方法很有趣。
(没有想到一直使用这个东西,居然原理在今天被发现了,System.out是一个PrintStream对象,println()是该对象调用的一个方法。
字节文件输入输出
FileInputStream
该类是InputStream的子类,用于完成读取文件的字节值功能,还可以读取如图像数据之类的原始数据流。
常用的构造方法:
FileInputStream(File file):通过已经存在的File类对象进行构造
FileInputStream(String filename):直接使用文件名进行构造
FileOutputStream
该类是OutputStream的子类,用于将数据写入字节文件输出流,也可写入图像数据之类道德原始字节流。
常用的构造方法:
- FileOutputStream(File file):通过已经存在File类对象进行构造
- FileOutputStream(String name):通过名字进行构造
字节过滤输入输出
过滤流的作用是能够在读写数据的同时对数据进行处理,并且提供同步机制,使得某一个时刻只有一个线程访问这个输入输出流,防止多个线程同时对同一个输入输出流进行操作带来的坏结果。使用时必须把过滤流与某个具体的输入输出流相连接。
通常的做法是在构造方法的参数中指定要连接的输入输出流。
过滤流的父类是FileInputStream和FilterOutputStream,最常用的是他们的子类DataInputStream和DataOutputStream,用于完成平台无关的字节过滤输入输出处理。
DataInputStream
DataOutputStream
字符IO
输入输出两大分支,以Reader为父类的字符输入,以Writer为父类的字符输出。它们与各自的子类共同构成了字符输入输出体系
字符输入输出
Reader
是一个用于读取字符类的抽象类,为所有字符输入类的父类,其方法都是通过子类对象来调用的。
Writer
是一个用于写入字符流的抽象类,为所有输出字符类的父类,其方法都是通过子类对象来调用的。
字符标准输出
这里没有字符标准输入
PrintWriter,主要完成字符标准输出流的文本格式化
常用构造方法:
由文件名构造字符标准输出流对象
PrintWriter pw=new PrintWriter("data.txt");
由字节输出流构造字符标准输出流对象
PrintWriter pw=new PrintWriter(System.out);
由字符标准输出流对象构造新的字符标准输出流对象
PrintWriter pw1=new PrintWriter(pw);
字符缓冲输入输出
BufferedReader
从字符输入流中读取文本并缓冲各个字符,以便提供关于字符,数组和文本行的高效读取方式,还可以改变缓冲区的大小。
常用的构造方法:
BufferedReader br=new BufferedReader(Reader in);
普通方法常用就是:
String readLine()读取一行字符串,并去掉回车换行符。
BufferedWriter
将文本写入字符输出流并缓冲各个字符,以提供单个字符,数组和字符串的高效写入方式,缓冲区的大小可以改变。常用的构造方法是:
BufferedWriter(Writer out),常用的方法是:void newLine(),用于写入一个回车符。
字符文件输入输出
FileReader类和FileWriter类。
FileReader
用来读取字符文件;
常用构造方法:
FileReader(File file)
FileReader(String filename)
FileWriter
用来写入字符文件。
构造方法:
字符串输入输出
StringReader
使用字符串输入流读取一个字符串,构造方法:
StringReader(String string);
StringWriter
通过字符流的字符串缓冲区的输出来构造字符串,构造方法:
StringWriter()