java里IO流的逻辑关系

在InputStream里和OutputStream里,提供了以下的针对不同信息来源的IO处理对象:

1)以字节形式,读写内存缓冲区中内容得到的ByteArrayInputStream和ByteArrayOutputStream对象

2)以字符串为对象,读写String累心数据的StringBufferInputStream和StringBufferOutputStream对象。

3)针对文件读写操作的FileInputStream和FileOutputStream对象。

4)针对管道数据读写操作的PipedInputStream和PipedOutputStream对象。

上述IO类,从字面含以上来看,可以容纳从不同设备读写的数据,但是它们的功能不限于此。它们更像是连接到各设备的管道,我们可以通过new语句,来创建与内存缓冲区等链接通道,并通过Input类型的read方法和Output类型的write方法,来执行读写操作。

与之相对应的,为了可以容纳16位Unicode编码,JDK1.1以上提供了如下的Reader和Writer的IO对象:

1)用来读写内存缓冲数据区的CharArrayReader和CharArrayWrite对象,它们同ByteArrayInputStream和ByteOutputStream对应。

2)用来读写String类型数据的StringReader和StringWrite对象,它们同StringBufferInputStream和StringBufferOutputStream对应。

3)用来读写文件数据的FileReader和FileWrite对象,它们同FileInputStream和FileOutputStream对应。

4)用来管道操作的PipedReader和PipedWrite对象,它们同PipedInputStream和PipedOutputStream对应。

值得注意的是,管道的IO操作方法,主要用于Linux里的线程通讯里,在Windows下使用的机会较少。

我们使用上述Input和Output(或Reader和Writer对象),确实可以完成IO操作,但是会发现没中不足。比如,我们从缓冲区里得到的是数据流,而无法更精确地读取int、char等基本类型的数据。又如,我们从文件里读取数据的时候,无法立即精确地读到某一位置的数据。

我们不应该把上述的辅助“功能”封装在IO流对象中,因为这样做会让IO流在读写数据的职责外,再负责其他类型逻辑的操作。所以,在java的IO类中,还专门有一种负责“优化IO流功能”的“装饰器”的类。这些装饰器类从输入和输出的角度,可以分为Input和Output两类,从所处理的字符集角度,可以分为Stream和Reader两类。

不同装饰器可以完成不同的工作:

1)DataInputStream和DataOutputStream可以从Stream里读取到基本类型(如Int等)的数据,通过他们提供的readByte和readDouble方法,可以直接从缓冲区里读取到特定类型的数据。同样地,BufferedReader和BufferedWriter用来从Reader和Writer里读取基本类型的数据。

2)BufferedInputStreamI和BufferedOutStream里面封装了各种类型缓存区里读写指定数量数据的方法,同样地,BufferedReader和BufferedWriter是它们对应的类。

3)PrintStream可以产生指定格式的输出,PrintWriter是它的对应类。用它可以直接把int等类型的数据写道缓冲区里。

4)LineNumberInputStream对象可以用来统计input stream对象里的行数,而LineNumberReader是它对应的类。

5)RandomAccessFile类可以用来读取指定文件里具体位置的数据。

6)StreamTokenizer类用来根据InputStream里面的分割为记号(Token),把输入流分割成若干文本块。

装饰类不可以独立的工作,它们只是为特定的IO操作提供锦上添花的功能,通过使用这些装饰类,我们可以大大简化用java读写特定设备的工作。

现在归纳一下,上面谈到了三种IO类型的对象,它们分别是InputStream和OutputStream类型的只可以容纳8为字节编码的对象,Reader和Writer可以容纳16为字节编码的对象和用来完善输入输出操作功能的“装饰”类。

下面附上一段读写内存数据的代码

import java.io.IOException;
//import java.io.StringBufferInputStream;
import java.io.StringReader;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.io.StringReader;

public class IOExample1 {
	public static void main(String[] args){
		try{
			String memInput="Input into Memory!";
			StringReader sin=new StringReader(memInput);
			int singleWord;
			PrintStream outToFile=
				new PrintStream(new BufferedOutputStream(new FileOutputStream("D:\\1.out")));
			//通过循环,写文件
			while((singleWord=sin.read())!=-1){
				outToFile.print((char)singleWord);
				System.out.print((char)singleWord);
			}
			sin.close();
			//强制输出到缓冲区
			outToFile.flush();
			outToFile.close();
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
时间: 2024-08-08 01:28:03

java里IO流的逻辑关系的相关文章

Java输入、输入、IO流 类层次关系梳理

Java输入.输入.IO流 类层次关系梳理 本文主要关注在Java编程中涉及到的IO相关的类库.方法.以及对各个层次(抽线.接口继承)的流之间的关系进行梳理 相关学习资料 http://baike.baidu.com/view/1007958.htm?noadapt=1 http://blog.csdn.net/hguisu/article/details/7418161 https://www.ibm.com/developerworks/cn/java/j-lo-javaio/ http:/

JAVA中IO流总结

本文是在学习中的总结,欢迎转载但请注明出处:http://write.blog.csdn.net/postedit/42119261 我想你对JAVA的IO流有所了解,平时使用的也比较的多,但是对于其具体分类和继承体系可能知道的并不多,可能也很少去看相关的API文档,找出其中的关系和各自的应用情形.本文简单对常用的IO流进行分类整理,并简单举例说明其应用.希望本文对你有所帮助. (A)IO流大致分为两种: (1)字节流:对应抽象类为InputStream(输入流)和 OutputStream(输

【JAVA的 IO流之FileInputStream和FileOutputStream】

java的 IO流即输入输出流,流是一组有顺序的,有起点和终点的字节结合,是对数据传输的总称.即数据在两设备间的传输称为流,流的本质是数据传输. IO流可以分为字节流和字符流.给出相应的IO结构图: 在接下来的一段时间里,将会慢慢介绍各种流的使用,本篇博客先介绍字节流的FileOutputStream和相对应的FileInputStream. 一.FileOutputStream(文件输出流) OutputStream是一个抽象类,抽象类必须通过子类实现.现在要向文件里输出就要用FileOutp

Java之IO流---字节流

1.1 IO流的引入 IO流在很多语言已有体现,诸如C语言的stdio.h,C++中的iostream.Java中的IO流大抵是用于在控制台.磁盘.内存上进行数据的读写操作,完成数据的传递. 我们可以对它进行如下分类: 按处理的数据类型可分为字节流与字符流 按流的流向可分为输入流(in)与输出流(out) 按流的功能可分为节点流(Node)和过滤流(Filter) 本篇侧重于梳理字节流相关的知识,毕竟作为字符流的前辈,它还是非常重要的.下篇继续梳理字符流. 1.2 IO流的继承体系图 大概描述了

Java之IO流用法总结

Java的IO流概述:1.I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输.如读/写文件,网络通讯等.2.Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行.3.java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据. IO流的分类:1.按操作数据单位不同分为:字节流(8 bit), 字符流(16 bit).2.按数据流的流向不同分为:输入流,输出流.3.按流的角色的不同分为:节点

java常用IO流数据流小结

  类名 常用方法 说明 输入流 InputStream int read(); 只能读字节流,虽然返回值是int,但只有低8位起作用. DataInputStream Type readType(); 可以读二进制流,可以读byte,short,int,long,double等二进制流. BufferedReader String readLine(); 可以读文本行. 输出流 OutputStream void write(int); 只能写字节流,虽然形参是int,但只有低8为起作用. D

【Java】IO流简单分辨

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用到的几个流类的简易区分以及体系层次整理出来,方便记忆与辨析.本人对IO了解尚浅,文章如有错漏,恳请前辈指正,感激不尽! 字节流体系: 基类:InputStream/outputStream(抽象类,不能new) 子类: 文件IO字节流:FileInputStream/FileoutputStream

java的IO流,字节流和字符流

java操作文件都是通过流来处理的,(其实其他很多语言也是这样) 第一:java的IO流,分为:输入流 和 输出流(这真是废话,这是从流向的角度来说的) 第二:java的所有IO流,只分为:字节流 和 字符流(其实就是传输的颗粒,传输的基本单位) 总结:凡是处理纯文本的优先考虑字符流:其他的才考虑使用字节流

Java笔记-IO流的运用

1.InputStream和System.in(Scanner) InputStream 输出流以字节为单位来获取数据,且需要复杂的判断并创建字节数组作为缓冲 另外字节转换为字符时容易出现中文乱码的情况:Scanner Java扫描器类,可以从输入流中读取指定类型的数据或字符串. 对于字符数据的读取,应该使用Scanner扫描器进行封装,然后获取字符串类型的数据 2. out和err out和err是System类的两个static类成员变量: out:主要是输出调试信息的输出流,以黑色显示 e