Java学习笔记之输入输出

java.io包下主要包括输入/输出两种IO流,每种输入/输出流又可分为字节流和字符流两大类。字节流以字节为单位处理,字符流以字符来处理。

File类,操作文件和目录,能新建/删除/重命名等操作,但是不能访问文件内容本身。访问文件本身需要IO流。

Java的输入流都以InputStream和Reader为基类,输出流主要由OutputStream和Writer为基类。他们都是抽象基类,无法直接创建实例。InputStream和OutputStream为字节流基类,Reader和Writer为字符流基类。

节点流和处理流的概念:

节点流:从/向一个特定IO设备读写数据的流,也成为低级流。

处理流:对一个已存在的流进行连接和封装,通过封装后的流实现数据读/写功能。也成为高级流。用处理流的好处是,只要使用相同的处理流,程序就可以采用完全相同的输入/输出代码来访问不同的数据源。采用的是一种叫装饰器的设计模式,因此处理流也称为包装流。

对流模型的理解:可以把输入和输出设备看作一个蓄水池,流就是水管这么一个概念,是一种过程概念,水管中的水滴就是字节/字符。

对输入而言,InputStream和Reader是输入流抽象基类,提供方法:read()不同参数用法。如果用于读取文件,其子类为FileInputStream和FileReader。

同样对输出,有个FileOutputStream和FileWriter,提供write方法。如果希望直接输出字符串内容,FileWriter非常有效。直接:

FileWriter fw = new FileWriter("test.txt");

fw.write("hello");……

一般,对文件输入输出流最后都必须 close方法,不过Java7后,直接写在try里,配上catch(IOException ex)即可自动关闭输入输出流。

上面的方法都是基于节点流,可以看出非常费劲,需要解析每个字节或字符,我们希望用处理流来简化编程。注意处理流的构造器参数是一个已经存在的流。例如非常强大的PrintStream处理流:

FileOutputStream fos = new FileOutputStream("test.txt“);

PrintStream ps = new PrintStream(fos);

ps.println("hello");

……

非常方便,不用逐个解析了。其实,标准输出System.out就是PrintStream类型的。

整个IO体系包含了很多类,用于各种场合。除了访问文件,还有访问数组、管道、字符串、缓冲等类。

关于输入/输出重定向:System类提供静态方法:

setErr(PrintStream err)重定向标准错误输出流;

setIn(InputStream in)重定向标准输入流;

setOut(OutputStream out)重定向标准输出流。

一旦重定向,就可以把标准输入输出当成是自己定义的流的输入输出了。

补充读取标准输入的方法:

Scanner sc = new Scanner(System.in);

关于RandomAccessFile类,提供文件输入输出,但最大特点是支持“随机访问”方式,程序可以直接跳转到文件的任意地方来读写数据。seek方法!

关于对象序列化:

直接传输对象时,序列化把Java对象转化为平台无关的二进制流可以传输,获得传输流后可以恢复为对象。使用方法是,对相关的类实现Serializable接口,保证该类的对象就是可以序列化的了。然后再调用类中,输出用ObjectOutputStream(注意是一个包装类),用流的writeObject方法就可以输出。输入用ObjectInputStream并调用readObject方法读取流对象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章