2015-10-14 Java IO: 序列化与ObjectInputStream、ObjectOutputStream

作者: Jakob Jenkov

  本小节会简要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和ObjectOutputStream。

#Serializable

  原文链接

  如果你希望类能够序列化和反序列化,必须实现Serializable接口,就像所展示的ObjectInputStream和ObjectOutputStream例子一样。

  对象序列化本身就是一个主题。Java IO系列教程主要关注流、reader和writer,所以我不会深入探讨对象序列化的细节。并且,目前在网上已经有很多文章探讨了对象序列化,我将给出几个深入分析的资料链接,不再赘述。链接如下:

http://java.sun.com/developer/technicalArticles/Programming/serialization/

阅读全文

2015-10-14 Java IO: 字符流的Piped和CharArray

作者: Jakob Jenkov

  本章节将简要介绍管道与字符数组相关的reader和writer,主要涉及PipedReader、PipedWriter、CharArrayReader、CharArrayWriter。

#PipedReader

  原文链接

  PipedReader能够从管道中读取字符流。与PipedInputStream类似,不同的是PipedReader读取的是字符而非字节。换句话说,PipedReader用于读取管道中的文本。代码如下:

 
Reader reader = new PipedReader(pipedWriter);

int data = reader.read();

while(data != -1) {

    //do something with data...

    doSomethingWithData(data);

    data = reader.read();

}

reader.close();
    

  注意:为了清晰,代码忽略了一些必要的异常处理。想了解更多异常处理的信息,请参考Java IO异常处理

  read()方法返回一个包含了读取到的字符内容的int类型变量(译者注:0~65535)。如果方法返回-1,表明PipedReader中已经没有剩余可读取字符,此时可以关闭PipedReader。-1是一个int类型,不是byte或者char类型,这是不一样的。

  正如你所看到的例子那样,一个PipedReader需要与一个PipedWriter相关联,当这两种流联系起来时,就形成了一条管道。要想更多地了解Java IO中的管道,请参考Java IO管道

阅读全文

2015-10-14 Java IO: InputStreamReader和OutputStreamWriter

作者: Jakob Jenkov

  本章节将简要介绍InputStreamReader和OutputStreamWriter。细心的读者可能会发现,在之前的文章中,IO中的类要么以Stream结尾,要么以Reader或者Writer结尾,那这两个同时以字节流和字符流的类名后缀结尾的类是什么用途呢?简单来说,这两个类把字节流转换成字符流,中间做了数据的转换,类似适配器模式的思想。

#InputStreamReader

  原文链接

  InputStreamReader会包含一个InputStream,从而可以将该输入字节流转换成字符流,代码例子:

 
InputStream inputStream = new FileInputStream("c:\\data\\input.txt");

Reader reader = new InputStreamReader(inputStream);

int data = reader.read();

while(data != -1){

    char theChar = (char) data;

    data = reader.read();

}

reader.close();
    

阅读全文

2015-10-14 Java IO: 字符流的Buffered和Filter

作者: Jakob Jenkov

  本章节将简要介绍缓冲与过滤相关的reader和writer,主要涉及BufferedReader、BufferedWriter、FilterReader、FilterWriter。

#BufferedReader

  原文链接

  BufferedReader能为字符输入流提供缓冲区,可以提高许多IO处理的速度。你可以一次读取一大块的数据,而不需要每次从网络或者磁盘中一次读取一个字节。特别是在访问大量磁盘数据时,缓冲通常会让IO快上许多。

  BufferedReader和BufferedInputStream的主要区别在于,BufferedReader操作字符,而BufferedInputStream操作原始字节。只需要把Reader包装到BufferedReader中,就可以为Reader添加缓冲区(译者注:默认缓冲区大小为8192字节,即8KB)。代码如下:

 
Reader input = new BufferedReader(new FileReader("c:\\data\\input-file.txt"));
    

  你也可以通过传递构造函数的第二个参数,指定缓冲区大小,代码如下:

 
Reader input = new BufferedReader(new FileReader("c:\\data\\input-file.txt"), 8 * 1024);
    

  这个例子设置了8KB的缓冲区。最好把缓冲区大小设置成1024字节的整数倍,这样能更高效地利用内置缓冲区的磁盘。

  除了能够为输入流提供缓冲区以外,其余方面BufferedReader基本与Reader类似。BufferedReader还有一个额外readLine()方法,可以方便地一次性读取一整行字符。

阅读全文

2015-10-14 Java IO: Buffered和Data

作者: Jakob Jenkov

  本小节会简要概括Java IO中Buffered和data的输入输出流,主要涉及以下4个类型的流:BufferedInputStream,BufferedOutputStream,DataInputStream,DataOutputStream。

#BufferedInputStream

  原文链接

  BufferedInputStream能为输入流提供缓冲区,能提高很多IO的速度。你可以一次读取一大块的数据,而不需要每次从网络或者磁盘中一次读取一个字节。特别是在访问大量磁盘数据时,缓冲通常会让IO快上许多。

  为了给你的输入流加上缓冲,你需要把输入流包装到BufferedInputStream中,代码如下:

 

InputStream input = new BufferedInputStream(new FileInputStream("c:\\data\\input-file.txt"));

    

  很简单,不是吗?你可以给BufferedInputStream的构造函数传递一个值,设置内部使用的缓冲区设置大小(译者注:默认缓冲区大小8 * 1024B),就像这样:

 

InputStream input = new BufferedInputStream(new FileInputStream("c:\\data\\input-file.txt"), 8 * 1024);

    

     这个例子设置了8KB的缓冲区。最好把缓冲区大小设置成1024字节的整数倍,这样能更高效地利用内置缓冲区的磁盘。

  除了能够为输入流提供缓冲区以外,其余方面BufferedInputStream基本与InputStream类似。

阅读全文