Java IO小结

此博客总结与百度百科和java API 1.6,如果有错误望指正。

IO基本概念

java.io包
java的核心库java.io提供了全面的io接口。包括文件读写,设备输入输出等,java中IO是以流为基础进行输入输出的,所有的数据被串行化写出到输出流(Output)或者从输入流(Input)读入。
流的概念
流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,可以是内存,甚至是网络连接。同样的,当程序需要向目的地写入数据的时候,会开启一个通向目的地的流。可以把数据形象的想象成“流”在程序和数据源(或者目的地)之间流动。
Java流的分类
Java语言的输入和输出功能是十分强大的,然而输入访问输出的代码并不是很简洁,需要很多不同的对象。

–按流分类:
        –输入流:程序从数据源(文件、内存、网络上等等)中读取的数据流。
        –输出流:程序向其中写入的流。
–按照数据传输单位分
        –字节流:以字节为单位传输数据流。
        –字符流:以字符为单位传输数据流。
–按照功能分
        –节点流:用于直接操作目标设备的流。
        –过滤流:对已经存在的流进行封装,让程序输入输出的功能更加灵活强大。

图片转载于网络

常用的IO流

Java.io.InputStream:

    该类是抽象类,是字节输入流的所有类的超类,需要定义 InputStream 子类的应用程序必须总是提供返回下一个输入字节的方法。常用的方法:
    int read():从输入流读取下一个字节,返回0到255范围的字节值。如果到达了流的末尾,则返回-1。子类必须提供该方法的实现。
   &nbsp**;int read(byte[] b):**从输入流中读取一定的字节,存储在缓冲的数组b中。返回实际读取的字节数。如果b的长度是0,则没有读取任何字节,否则至少读取一个字节,到达文件末尾时返回-1。该方法等同于read(b,0,b.length)。
    long skip(long n):跳过和放弃此输入流中的n个字节。但是实际上在该方法结束时候跳过的字节可能小于n,原因有很多,比如在到达n个字节之前就到达了文件的末尾。如果n是负数,则不跳过任何字节。该方法内部是创建一个byte数组,重复的读入字节,直到达到n个字节或者到达文件的末尾。
    int available():返回字节数,该字节数是该输入流下一个方法调用此输入流可以不受阻塞的读取的字节估计数。有的InputStream实现会返回流中的字节总数,而有的不会,视图将此方法的返回值作为分配缓冲区是不正确的。该方法应该有子类重写。
    void close():关闭此输入流,并且释放与此输入流的资源。

    void mark(int readlimit):在此输入流中标记当前的位置。参数的含义是输入流在标记位置失效之前允许读取的字节数。mark的常规协定是:如果markSupport()返回true,那么输入流总是在调用 mark 之后记录所有读取的字节,并时刻准备在调用方法 reset 时(无论何时),再次提供这些相同的字节。但是,如果在调用 reset 之前可以从流中读取多于 readlimit 的字节,则不需要该流记录任何数据。
    void reset():该方法将流重新定位到上次调用mark方法的位置。如果markSupport()返回true: 如果创建流以后未调用方法 mark,或最后调用 mark 以后从该流读取的字节数大于最后调用 mark 时的参数,则可能抛出 IOException。如果未抛出这样的 IOException,则将该流重新设置为这种状态:最近一次调用 mark 以后(如果未调用过 mark,则从文件开头开始)读取的所有字节将重新提供给 read 方法的后续调用者,后跟任何从调用 reset 时起将作为下一输入数据的字节。如果方法 markSupported 返回 false,那么:对 reset 的调用可能抛出 IOException,如果未抛出 IOException,则将该流重新设置为一种固定状态,该状态取决于输入流的特定类型及其创建方式。提供给 read 方法后续调用者的字节取决于特定类型的输入流。
    boolean markSupport():测试此输入流是否支持 mark 和 reset 方法。是否支持 mark 和 reset 是特定输入流实例的不变属性。InputStream 的 markSupported 方法返回 false

Java.io.OutputStream:

    此抽象类是所有输出字节流的超类。输出流接收输出字节,并且将输出字节发送给某个接收器。该超类的子类必须提供至少一种可写入一个输出字节的方法。
常用方法:
    void close():关闭输出流,并且释放与该输出流的资源。
    void flush():刷新该输出流并且强制写出所有的缓冲的字节。
    abstract void write(int b):抽象方法,将指定的字写入此输出流。write的常规协定:向输出流写入一个字节是写入参数b的八个低位,b的高24位被忽略。
    void write(byte[] b,int off,int len):将指定byte数组的从偏移量off开始,到len个长度的字节写入此输出流。该方法的常规协定是:将数组b中的某些字节按照顺序写入到输出流,元素b[off]是该操作的第一个字节,b[off+len-1]是该操作的最后一个字节。

Java.io.FileInputStream:访问文件

    继承自InputStream,从文件系统中的某个文件获取输入字节。具体哪些文件可以用取决于系统环境。该类用于读取诸如图像数据之类的原始字节流,如果要读取字符流,那么用FileReader类。
常用的构造方法:
    FileInputStream(File file):通过打开实际文件的连接而创建InputStream对象,该文件用File对象指定。如果文件不存在,或者打开的不是常规文件等其他因素导致打不开文件,会抛出FileNotFoundException异常。参数也可以是String name,通过文件路径指定文件。
常用的方法有:available(),close(),read(),skip()等方法,和InputStream()的用法相同。如果要写入字符流,用FIleWriter。

Java.io.FileOutputStream:文件输出流

文件输出流,用于将数据写入文件的输出流。
常用的构造方法:
    FileOutputStream(File file)、FileOutputStream(String name)等。
常用的方法:
    void write(int b):将指定的字节写入此文件输出流。
    void write(byte[] b,int off,int len):将指定byte数组中,从偏移量off到len个字节写入输出流。
    void write(byte[] b):将b.length字节从指定的byte数组中写入文件输出流。

Java.io. ByteArrayInputStream:访问数值

    ByteArrayInputStream中包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪read方法要提供的下一个字节。
注意:关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
常用构造方法:
    ByteArrayInputStream(byte[] buf):创建一个ByteArrayInputStream对象,用buf作为其缓冲数组。
常用方法和InputStream大致相同。

Java.io. ByteArrayOutputStream:字节数组输出流

    此类实现一个输出流,其中的数据被写入到一个byte数组中,缓冲区的长度会随着附收据的不断的写入而不断增长。最后可以用toArray()或者toString()方法获取数据。
关闭ByteArrayOutputStream流无效,在使用此流的关闭方法后仍然可以使用此流,而不会抛出异常。
构造方法:
ByteArrayOutputStream():创建一个字节数组输出流。
ByteArrayOutputStream():创建一个字节数组输出流,并且指定缓冲区的大小。
常用方法:
    void close():关闭ByteArrayOutputStream无效。
    int size():返回当前缓冲区的大小。
    byte[] toByteArray():获取缓冲区的数据,用新的byte数组保存。
    String toString():使用平台的默认字符集,将缓冲区的数据转换为字符串。
    void write(int b):将指定的字节写入此字节数组输出流。
    void writeTo(OutputStream out):将字节数组输出流中的全部内容写入到指定的输出流参数中。

Java.io. PipedInputStream:访问管道

    管道输入流应该链接到管道输出流,管道输入流提供要写入管道输出流的所有数据。
数据由某个线程从PipedInputStream对象读取,并由其他线程写入到相应的PipedOutputStream,不建议将两个对象用单个线程,因为可能造成线程的死锁。
管道输入流包含一个缓冲区,在缓冲区的限定范围内可以可以将读操作和写操作分开。如果向连接管道输出流提供数据的线程不存在,则认为该管道损坏。
构造方法:
    1. PipedOutputStream():创建未连接的PipedOutputStream。
    2. PipedOutputStream(int pipeSize):创建未连接的PipedOutputStream,并对管道缓冲区使用指定的大小。
    3. PipedOutputStream(PipedOutputStream src):创建PipedOutputStream,使其连接到管道输出流src。
    4. PipedOutputStream(PipedOutputStream src,int pipeSize):
创建PipedOutputStream,并使其连接到管道输出流,使用指定的缓冲区大小。
常用方法:
    void connect(PipedOutputStream src):使管道输入流连接到管道输出流。
    void receve(int b):接收字节数据。
    close()、read()方法同基类用法。

Java.io. PipedOutputStream:管道输出流

    可以将管道输出流链接到管道输入流,管道输出流是数据发送端。其余用法和管道输入流相同。
构造方法:
    PipedOutputStream():创建一个未连接到PipedInputStream的管道输出流。
    PipedOutputStream(PipedInputStream in):创建一个链接到管道输入流的PipedOutputStream。
常用方法:
    close(),connect(),flush(),write()等方法。

Java.io. BufferedInputStream:缓冲流

    为另一个输入流添加一些功能,即缓冲输入,支持mark,reset方法。
构造方法:
    BufferedInputStream(InputStream in):创建BufferedInputStream,保存输入流in,以便将来使用。
    BufferedInputStream(InputStream in,int size):创建指定缓冲区大小的缓冲流。
常用方法有close(),read(),mark().reset()等

Java.io. BufferedOutputStream:缓冲输出流

    实现缓冲的输出流,应用程序可以通过缓冲的输出流将各个字节写入底层的输出流中,而不用每次写入字节都调用一次底层输出流。
构造方法:
    BufferedOutputStream(OutputStream out):创建一个新的缓冲输出流,将数据写入底层数组。
**常用的方法:
write(),flush()。等**

Java.io. ObjectInputStream:对象流

    ObjectInputStream可以对以前使用ObjectOutputStream写入的基本数据和对象进行反序列化。
与FileInputStream一起使用时,;可以为应用程序提供对对象图形的永久存储。可以恢复以前序列化的对象。
只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。
例子:要从由 ObjectOutputStream 中的示例写入的流读取:
FileInputStream fis = new FileInputStream(“t.tmp”);
ObjectInputStream ois = new ObjectInputStream(fis);

    int i = ois.readInt();
    String today = (String) ois.readObject();
    Date date = (Date) ois.readObject();

    ois.close();

常用的方法:
    Object readObject():从对象流中读取对象,包括对象的类,类的签名,类及其超类的非瞬态和非静态字段的值都将被读取。当InputStream中出现问题或者遇到不应该反序列化的类时,将抛出异常。该方法是final类型。
    Object readObjectOverride():此方法由ObjectOutputStream受信任的子类调用。这些子类使用受保护的无参构造方法构造ObjectOutputStream。子类需要提供带有修饰符“final”的重写方法。
还有read(),readBoolean(),readByte(),readChar(),readShort(),readInt()等等方法,读取特定的对象。

Java.io. DataInputStream:数据流

    数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责

Java.io. DataOutputStream:数据数据流

    数据输出流允许将java数据类型以适当的方式写入输出流,并且用数据输入流读入。
构造方法:DataOutputStream(OutputStream out)
常用的方法:
flush(),size(),write(),writeByte(),writeDouble(),writeInt()等等方法。

————-分割线,下面是字符流————–

Java.io. Reader:读取字符流

    用于读取字符流的抽象类,子类必须实现的方法只有read(char[],int,int)和close()。类还可以重新定义一些方法,以便高效率完成其他功能。

常用方法:
    void close():关闭该流并且释放与该流有关的资源。
    void mark(int m):标记该流当前的位置。
    boolean markSupport():判断此流是否支持mark()操作。
    int read():读取单个字符。
    int read(char[] c):将字符输入数组。
    int read(char[] c,int off,int len):将字符读入数组的某一部分。该方法是抽象方法。
    int read(CharBuffer cb):视图将字符读入字符缓冲区。
    void reset():重置该流。
    long skip(long n):跳过指定的字符

Java.io. Writer:写入字符流

    该类是写入字符流的抽象类,子类必须实现的方法是write(char[] ,int ,int),flush()和close(),子类还可以重新定义一些方法,以便高效率完成其他功能。
常用方法:
    void write(int b):写入单个字符,被写入的字符包含在给定数值的低16位中,高16位被忽略。
    void write(char[] c):写入字符数组。
    void write(char[] c,int off,int len):写入字符数组的某一部分。
    void write(String str):写入字符串。
    Writer append(CharSequence csq):将指定的字符序列添加到该writer,以out.append(csq)的形式调用,如果csq为null,则添加是个字符“null”
    Writer append(char c):将指定的字符串添加到此writer。
    void flush():刷新该流的缓冲流。该方法是抽象方法。
    void close():关闭该流,当是关闭之前先刷新该流。

Java.io. FileReader:读入字符文件

    该类是读入字符文件的便捷类。此类的构造方法假设默认的字符编码和默认的字符缓冲区大小是适当的。要自己指定这些值,可以在FileInputStream上构造一个InputStreamReader。
常用的构造方法:
    FileReader(File file):在给定file的情况下创建新的FileReader。
    FileReader(String fileName):在给定文件名的情况下创建新的FIleReader。
常用的方法都是从InputStreamReader和Reader和Object中继承来的。

Java.io. FileWriter:写入字符文件

    用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
常用的构造方法:
    FileWriter(File file):根据给定的File文件构造一个FileWriter对象。
    FileWriter(String fileName): 根据给定的文件名构造一个 FileWriter 对象。

常用的方法都是从InputStreamReader和Reader和Object中继承来的。

Java.io. BufferedReader/BufferedWriter:字符缓冲流

    从字符输入流/输出流中读取/写入文本,实现高效的读取/写入。可以使用指定的缓冲区大小,也可以使用默认缓冲区大小。
    建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。同理,Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。

BufferdeReader特有的方法:
    String readLine():读取一个文本行。
BufferdeWriter特有的方法:
    void newline():写入一个行分割符。

Java.io. InputStreamReader:转换流

    InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
    每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
    为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
    BufferedReader in
                                 = new BufferedReader(new InputStreamReader(System.in));
特有方法:
    String getEncoding():返归此流的字符编码

Java.io. OutputStreamWriter:转换流

    OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
    每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
    为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:
     Writer out
                     = new BufferedWriter(new OutputStreamWriter(System.out));
特有方法:
    String getEncoding():返归此流的字符编码

Java IO体系中流的分类(转自http://www.cnblogs.com/moonpool/p/5488463.html的博客,如有侵犯会删除)
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值