JAVA IO常用总结

来源:互联网 发布:《网络黑白》 编辑:程序博客网 时间:2024/05/19 01:28
最近复习java,于是就对java的IO进行一个总结:


在Java中,存在着流这种概念,所谓流,可以理解为数据的流动(实际上为字节的流动)。在java中,存在字节流与字符流,但实际上,字符流在传递过程中也是传递的字节流,字节流与字符流唯一的区别是:字符流使用了缓冲区,而字节流没用使用缓冲区。

流的另外一种分类方法是可以分为节点流(node stream)与过滤流(filter)



在理解节点流时,牢记流是在“程序内存”和“目标地址”之间流动的,其中,流进程序内存的叫输入流,流出程序内存的叫输出流。

而对于过滤流,就是那些封装流的流。下面我们来看看这些流:

OutputStream类是一个抽象类,使用时需要通过其子类赋值。



字节输出流类:

FileOutputStream类是文件操作流,目标地址为“文件”,构造函数为FileOutputStream(File f)或   FileOutputStream(File f,boolean append)    当append为真时,表示向文件中追加内容。

ByteArrayOutputStream类是内存操作流,目标地址为“内存”,构造函数为ByteArrayOutputStream()。

PipedOutputStream类是管道操作流,目标地址为“管道”,构造函数为PipedOutputStream()。

ObjectOutputStream类是对象操作流,用于操作对象,构造函数为ObjectOutputStream(OutputStream os)。

DataOutputStream类是数据流,他是过滤流,与平台无关,构造函数为DataOutputStream(OutputStream os)。

ZipOutputStream类是压缩流,他是过滤流,用于生成.zip文件,构造函数为ZipOutputStream(OutputStream os)。

PrintStream类是打印流,构造函数为PrintStream(OutputStream os)或者PrintStream(File file)。



字节输出流类:

FileInputStream类是文件操作流,目标地址为“文件”,构造函数为FileInputStream(File f)。ByteArrayInputStream类是内存操作流,目标地址为“内存”,构造函数为ByteArrayInputStream(byte[] buf)。

PipedInputStream类是管道操作流,目标地址为“管道”,构造函数为PipedInputStream()。

ObjectInputStream类是对象操作流,用于操作对象,构造函数为ObjectInputStream(InputStream is)。

DataInputStream类是数据流,他是过滤流,与平台无关,构造函数为DataInputStream(OutputStream os)。

ZipInputStream类是压缩流,他是过滤流,用于读取.zip文件,构造函数为ZipInputStream(InputStream is)。

PushbackInputStream类是回退流,用于将读取的内容回退“原地”,构造函数为PushbackInputStream(InputStream is)。

SequenceInputStream类是合并流,用于将两个输入流合并为一个,构造函数为SequenceInputStream(InputStream is1,InputStream is2)。



System.out和System.err是PrintStream类的实例化对象,其默认目标地址是屏幕,但是他们都可以重定向,使用System.setOut(PrintStream ps)或者System.setErr(PrintStream ps)将目标地址改变;


字符输入输出流:

OutputStreamWriter类:将输出的字符流变成字节流,构造函数为OutputStreamWriter(OutputStream os)。

InputStreamWriter类:将输入的字节流变成字符流,构造函数为InputStreamWriter(InputStream is)。

FileWriter类:文件字符输出流,构造函数为FileWriter(File f)或者FileWriter(File f,boolean append)。            当append为true时,表示追加。

FileReader类:文件字符输入流,构造函数为FileReader(File f)。

PrintWriter类:字符打印流。

BufferedReader类:字符输入缓冲流,构造函数为BufferedReader(Reader r)。

PushbackReader类:回退流,构造函数为PushbackReader(Reader r)。

以上各流,只有FileWriter和FileReader为节点流,其余为过滤流。





字符流的实现也是以字节流为基础的,在计算机中,数据都是以字节的形式存储在计算机硬盘上的,字符仅仅存在于内存中,所以在开发中,字节流比较常用。



字节流与字符流的唯一区别就是字节流没有使用缓冲区,而字符流使用了缓冲区。



"\r\n"表示键盘上的回车键。

"\t"表示键盘上的Tab键。



内存操作流一般在生成一些临时信息时才会使用,如果将这些临时信息保存在文件中,代码执行结束还得删除这个文件,比较麻烦,此时使用内存操作流最合适不过了。



管道流用于两个线程之间的通信,要进行管道输出,必须把输出流连接在输入流上。使用管道输出流的public void connect(PipedInputStream pis) throws IOException方法。使用了该方法,两个线程启动后可以自动的进行管道的输入输出操作。


当然,在Java中,提供了专门的输入数据类,此类不仅仅可以完成数据输入,还可以方便的对各种数据进行验证,此类为java.util.Scanner;



自此,除了对象操作流类,其余常用的类已经说明完毕。

要注意:所有的流类都在java.io包中,但是两个除外,他们是压缩流类和Scanner类。java.util.zip.ZipInputStream和java.util.zip.ZipOutputStream和java.util.zip.ZipFile和java.util.zip.ZipEntry和java.util.Scanner。



在java中,如果出现乱码问题,一定是内容输出时的编码与内容接受时的编码不一致导致的。




打印流有PrintStream类和PrintWriter类,他们一次通过OutputStream和Writer进行构造初始化,把输出流的实例传递到打印流,可以更加方便的输出内容。其实,打印流就是把输出流重新包装了一下,更加好用。

使用ObjectOutputStream将序列化对象输出的过程叫做序列化,使用ObjectInputStream将序列化的对象读入的过程叫做反序列化。



一个对象被序列化之后,只是将这个对象的属性保存下来,而对象的方法是不被保存的,因为他与类的方法是一样的。



在java中,对象要想以流的形式输出就必须对对象进行序列化,对象序列化要实现Serializable接口或者Externalizable接口。



Serializable接口中没有定义方法,只需实现这个接口即可。实现了Serializable接口的类对象在进行序列化时会保存全部的属性,如果希望某些属性不被保存,则在类定义时,将该属性用transient关键字标记。



Externalizable接口中定义了两个方法,在这两个方法中定义在序列化时哪些属性被保存。但此类不常用。实现了此接口的类必须存在无参数构造函数。







System.out和System.err是PrintStream的实例化对象,目标地址为屏幕;System.in是InputStream的实例化对象,目标地址是键盘。

在java中,允许使用System.setOut(PrintStream ps),System.setOut(PrintStream ps)System.setOut(InputStream is)对他们的目标地址进行重定向,但只用setOut()比较常用。































0 0