java io详解及各输入输出类介绍

首先要记住Java有一个非常强大的 文件及目录类 File, 这里面你想要的功能都有。

下面进入正题。

由于JavaIO根据装饰器设计模式设计, 设计思想是先给出基本IO类,其他功能如缓存,格式化,再嵌套其他类实现。

在我看来实际上是个失败的设计,不仅没有使类变得简单,由于各种IO类必须组合起来才能发挥作用,反而增大了类的复杂度,写起来也冗余不已。

所以JavaIO类看起来会有些(非常)臃肿。

对于IO根据面向字符还是面向字节可分为两大类。

1. 面向字节的IO都是从InputStream和OutputStream继承而来。

提供对基本类型格式化IO基类是FilterInputStream(继承自InputStream)及FilterOutputStream(OutputStream),其中常用的主要有两个DataInputStream和DataOutputStream。

次外层常用的是BufferedInputStream及BufferedOutputStream主要是提供缓存功能。(其实我觉得这里用重载就挺好,没必要专门写两个类仅仅用来表示使用缓存)。

最里层是IO源类分别是ByteArrayInputStream, StringBufferInputStream, FileInputStream及相应的输出类。主要用于从数据源读取或输出。

好了下面我们来举个例子:

比如我们要从example.txt格式化写入数据。那么我们要这么写:

DataOutputStream in = new DataOutputStream( new BufferedOutputStream( new FileOutputStream("example.txt")));

读呢?

DataInputStream in = new DataInputStream( new BufferedInputStream( new FileInputStream("example.txt")));

当然这是个极端的例子,格式化输入输出的好处是可以实现对基本类型跨平台的格式化输入输出。

如果不追求这一点,一层就可以了。

FileInputStream in = new FileInputStream("example.txt");

in.read(); 每次读一个字符。但这样无缓存。

但这样比较慢,想快一点外面再前一层缓存 BufferedInputStream即可。

由于BufferedInputStream与DataInputStream是对输入流的深度处理,所以二者只接受InputStream类型。输出同理。

下面给出各个字节输入输出的继承结构:

InputStream -> FileInputStream,StringBufferInputStream 等

InputStream -> FilterInputStream -> DataInputStream及BufferedInputStream。

2. 面向字符的IO都是从Reader和Writer继承而来。

面向字符的操作与面向字节的操作类似。由于同样采用了装饰器模式,所以我们仍然需要记住所有的类才能写出一些简单而常用的功能。(失败)

最基本的源输入输出流: FileReader, FileWriter, StringReader, StringWriter, CharArrayReader, CharArrayWriter等。

如果想要提供缓存输入输出,嵌套: BufferedReader, BufferedWriter。

由于缓存是常用选项,所以Java IO 最少嵌套两层。设计的失败。

如果想控制台打印再嵌套 PrintWriter,这就嵌套了三层了。PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter( "file.txt")));

后来Java设计者也觉着这样有点过分。就在java SE5的时候给PrintWriter 添加了一个辅助构造器,可以接受String类型,实现上面三层嵌套的功能。 PrintWriter out = new PrintWriter("file.txt");

然而其他类,如缓存,仍需要我们手动嵌套两层。其实我不明白,像缓存这样常用功能,不应该是默认选项么。或者用函数重载来实现,这样我们添加一个参数就好,而不用用繁琐的嵌套。

所以JavaIO 体系可以看成滥用设计模式而导致失败的典型。

时间: 2024-08-10 02:10:45

java io详解及各输入输出类介绍的相关文章

Java IO详解(一)------File 类

File 类:文件和目录路径名的抽象表示. 注意:File 类只能操作文件的属性,文件的内容是不能操作的. 1.File 类的字段 我们知道,各个平台之间的路径分隔符是不一样的. ①.对于UNIX平台,绝对路径名的前缀始终为"/" . 相对路径名没有前缀. 表示根目录的抽象路径名具有前缀"/"和空名称序列. ②.对于Microsoft Windows平台,包含驱动器说明符的路径名的前缀由后面跟着":"的驱动器号组成,如果路径名是绝对的,则可能后跟

Java IO 详解

Java IO 详解 初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接

Java IO详解(转)

IO是Java及众多编程语言很重要的一块,同时很多程序的瓶颈和耗时操作也都在IO这块. 一.简介 IO操作面临很多问题,信息量的巨大,网络的环境等等,因为IO不仅仅是对本地文件.目录的操作,有时对二进制流.还有一部分是网络方面的资源,所以多种原因直接造成IO操作无疑是耗时且复杂多变的.Java对IO的支持是个不断的演变过程,经过了很多的优化,直到JDK1.4以后,才趋于稳定,在JDK1.4中,加入了nio类,解决了很多性能问题,虽然我们有足够的理由不去了解关于Java IO以前的情况,但是为了学

Java IO详解

学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:618528494  我们一起学Java! 初学Java,一直搞不懂Java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是Java io 比较基本的一些处理流

Java IO详解(三)------字节输入输出流

File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocean/p/6854098.html 那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream)  1.字节输出流:OutputStream public abstrac

Java IO详解(六)------序列化与反序列化(对象流)

File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocean/p/6854098.html Java IO 字节输入输出流:http://www.cnblogs.com/ysocean/p/6854541.html Java IO 字符输入输出流:https://i.cnblogs.com/EditPosts.aspx?postid=6859242 Jav

Java网络详解

Java网络详解 Java网络基本概念 网络基础知识 1.计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议 2.网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上

JAVA: httpclient 详解;

相对于httpurlconnection ,httpclient更加丰富,也更加强大,其中apache有两个项目都是httpclient,一个是commonts包下的,这个是通用的,更专业的是org.apache.http.包下的,所以我一般用后者: httpclient可以处理长连接,保存会话,重连接,以及请求过滤器,连接重用等等... 下面是测试代码(全部总结来自官方文档,以及翻译) 须要下载核心包:httpclient-4.3.4.jar ,也可在官网下载:http://hc.apache

java反射详解 (转至 http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html)

本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象获得完整的包名和类名 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package Reflect; /**  * 通过一个对象获得完整的包名和类名  * */ class Demo{     //other codes... } class hello{     pu