io
介绍
Package java.io
通过数据流,序列化和文件系统提供系统输入和输出。
以内存为基准,数据进内存称之为读,出内存称之为写。
原理:Java程序——JVM——OS——OS调用io方法
第一部分:写
抽象类:OutputStream
这个抽象类是表示字节输出流的所有类的超类。
public abstract class OutputStream
extends Object
implements Closeable, Flushable
已知直接子类:
ByteArrayOutputStream , FileOutputStream , FilterOutputStream , ObjectOutputStream , OutputStream , PipedOutputStream
方法
抽象方法
void close()
关闭此输出流并释放与此流相关联的任何系统资源。
void flush()
刷新此输出流并强制任何缓冲的输出字节被写出。
void write(byte[] b)
将 b.length字节从指定的字节数组写入此输出流。(转成二进制数据写出)
void write(byte[] b, int off, int len)
从指定的字节数组写入 len个字节,从偏移 off开始输出到此输出流。
abstract void write(int b)(参数是十进制但会转成二进制数据写出)
将指定的字节写入此输出流。
(注意:任意的文本编辑器,打开时,会查询编码表,将二进制数据转成文本数据,0~127就是ASCII,其他就是根据系统)
文件字节输出流:FileOutputStream
public class FileOutputStream
extends OutputStream
目的地:磁盘中的文件
构造方法
FileOutputStream(File file)
创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(String name)
创建文件输出流以指定的名称写入文件。(路径)
FileOutputStream(File file, boolean append)
创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(String name, boolean append)
创建文件输出流以指定的名称写入文件。(append:追加写开关 true:开启追加)
(注意:win的换行字符是\r\n,linux是/n,mac是/r)
序列化字节输出流:ObjectOutputStream
public class ObjectOutputStream
extends OutputStream
implements ObjectOutput, ObjectStreamConstants
ObjectOutputStream将Java对象的原始数据类型和图形写入OutputStream。
(说白了就是将对象保存成文件的形式,称之为序列化,反之加载进内存就称之为反序列化)
只有支持java.io.Serializable接口的对象才能写入流中。
方法writeObject用于将一个对象写入流中。 任何对象,包括字符串和数组,都是用writeObject编写的。
注意:序列化和反序列化有一个依赖凭证就是序列化ID。用来保证是同一个对象,不然就会抛出一个叫做InvalidClassException的异常。 这个序列号是根据编译时的class文件,一旦源程序被修改,重新编译一个类文件,这个序列号也会被修改。解决方法就是使用固定的序列号。
构造
protected ObjectOutputStream(OutputStream out)
创建一个写入指定的OutputStream的ObjectOutputStream。
方法
void writeObject(Object obj)
将指定的对象写入ObjectOutputStream。
抽象类:Writer
用于写入字符流的抽象类。
public abstract class Writer
extends Object
implements Appendable, Closeable, Flushable
已知直接子类:
BufferedWriter , CharArrayWriter , FilterWriter , OutputStreamWriter , PipedWriter , PrintWriter , StringWriter
方法
构造方法
protected Writer()
创建一个新的人物流作家,其关键部分将在作者本身上同步。
protected Writer(Object lock)
创建一个新的字符流写入器,其关键部分将在给定对象上进行同步。
方法摘要
void write(char[] cbuf)
写入一个字符数组。
abstract void write(char[] cbuf, int off, int len)
写入字符数组的一部分。
void write(String str)
写一个字符串
void write(String str, int off, int len)
写一个字符串的一部分。
Writer append(char c)
将指定的字符附加到此作者。
字符输出流:OutputStreamWriter
OutputStreamWriter是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节charset 。
public class OutputStreamWriter
extends Writer
已知直接子类:
FileWriter
构造
OutputStreamWriter(OutputStream out)
创建一个使用默认字符编码的OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs)
创建一个使用给定字符集的OutputStreamWriter。
文件字符输出流:FileWriter
public class FileWriter
extends OutputStreamWriter
文件是否可用或可能被创建取决于底层平台。 特别是某些平台允许一次只能打开一个文件来写入一个FileWriter (或其他文件写入对象)。 在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。
FileWriter是用于写入字符流。 要编写原始字节流,请考虑使用FileOutputStream 。
字符输出流的输出过程,和字节流不同,这个对象的write方法会把数据写入到内存缓冲区中(其实就是字符转换成字节的过程),还要使用flush方法刷新将缓冲区的数据进文件中多了这么一个过程。(重点)
构造方法
FileWriter(File file)
给一个File对象构造一个FileWriter对象。
FileWriter(File file, boolean append)
给一个File对象构造一个FileWriter对象。
FileWriter(String fileName)
构造一个给定文件名的FileWriter对象。
FileWriter(String fileName, boolean append)
构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。
缓冲字节输出流:BufferedOutputStream
public class BufferedOutputStream
extends FilterOutputStream
该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。
(实际上缓冲区这玩意就是个数组)
构造
BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。(这个构造方法可以理解为为字节流创建一个缓冲区)
缓冲字符输出流:BufferedWriter
public class BufferedWriter
extends Writer
构造
BufferedWriter(Writer out)
创建使用默认大小的输出缓冲区的缓冲字符输出流。
打印流:PrintStream
为其他输出流添加了功能,使他们能够方便的打印各种数据值的表示形式。
是最好的输出流。
与其他输出流不同的是,打印流永远不会抛出IOException
有特有的方法
void print(任意类型的值)
void println(任意类型的值并换行)
如果使用的是父类的方法写数据,将查询编码表(和父类一样),但是如果是使用的特有的方法,那么就是原样输出。
构造
指定输出的目的地,或是得到一个字节输出流
第二部分:读
抽象类:InputStream
这个抽象类是表示输入字节流的所有类的超类。
public abstract class InputStream
extends Object
implements Closeable
已知直接子类:
AudioInputStream , ByteArrayInputStream , FileInputStream , FilterInputStream , InputStream , ObjectInputStream , PipedInputStream , SequenceInputStream , StringBufferInputStream
方法
抽象方法
abstract int read()
从输入流读取数据的下一个字节。(-1表示读完了,并且返回的是十进制数据)
int read(byte[] b)
从输入流读取一些字节数,并将它们存储到缓冲区 b 。
(byte数组起到的作用是缓冲,可以一次读到多个字节,建议长度定位1024或者是它的整数倍,这个方法返回的int就不再是具体每个字节的十进制数据,而是读取的有效字节个数)
int read(byte[] b, int off, int len)
从输入流读取最多 len字节的数据到一个字节数组。
文件字节读取流:FileInputStream
public class FileInputStream
extends InputStream
构造
FileInputStream(File file)
通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
FileInputStream(String name)
通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
反序列化字节读取流:ObjectInputStream
public class ObjectInputStream
extends InputStream
implements ObjectInput, ObjectStreamConstants
反序列化先前使用ObjectOutputStream编写的原始数据和对象。
只能从流中读取支持java.io.Serializable或java.io.Externalizable接口的对象。
反序列化对象时发生的任何异常都将被ObjectInputStream捕获并中止读取过程。
构造
protected ObjectInputStream(InputStream in)
创建从指定的InputStream读取的ObjectInputStream。
方法
Object readObject()
从ObjectInputStream读取一个对象。
抽象类:Reader
用于读取字符流的抽象类。
为什么有这个类,原因就在于字节流读中文数据时,就拿GBK来说,一个中文字符是2个字节,utf8是3个,那么处理起来是不方便的。
public abstract class Reader
extends Object
implements Readable, Closeable
已知直接子类:
BufferedReader , CharArrayReader , FilterReader , InputStreamReader , PipedReader , StringReader
方法
抽象方法
abstract void close()
关闭流并释放与之相关联的任何系统资源。
int read()
读一个字符
int read(char[] cbuf)
将字符读入数组。
abstract int read(char[] cbuf, int off, int len)
将字符读入数组的一部分。
字符读取流:InputStreamReader
InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
public class InputStreamReader
extends Reader
已知直接子类:
FileReader
构造
InputStreamReader(InputStream in)
创建一个使用默认字符集的InputStreamReader。
InputStreamReader(InputStream in, Charset cs)
创建一个使用给定字符集的InputStreamReader。
文件字符读取流:FileReader
public class FileReader
extends InputStreamReader
FileReader是用于读取字符流。 要读取原始字节流,请考虑使用FileInputStream 。
构造方法
FileReader(File file)
创建一个新的 FileReader ,给出 File读取。
FileReader(String fileName)
创建一个新的 FileReader ,给定要读取的文件的名称。
缓冲字节读取流:BufferedInputStream
public class BufferedInputStream
extends FilterInputStream
构造
BufferedInputStream(InputStream in)
创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。
缓冲字符读取流:BufferedReader
public class BufferedReader
extends Reader
构造
BufferedReader(Reader in)
创建使用默认大小的输入缓冲区的缓冲字符输入流。