io介绍

 1.做java开发有一段时间了,对java的io类库总是没有较全面的了解,仅仅停留在会使用几个常用api的基础   上。抽空学习了一下,对io类库有了更全面的了解。

 2.IO:输入输出,java中使用流的抽象概念来表示。

 3.从操作的基本单元的类型划分:可分为面向字节操作的IO和面向字符操作的IO。

   3.1.在面向字节操作的IO中,api的设计者认为有关输入的类都继承自InputStream,有关输出的类都继                承自OutputStream。

         InputStream又按不同的数据源产生输入划分为不同的类,主要有:

ByteArrayInputStream

缓冲字节数组当作inputStream

FileInputStream

文件当作inputStream

PipedInputStream

用于写入PipedOutputStream的数据

SequenceInputStream

将多个InputStream进行逻辑串联成单一的inputStream

StringBufferedInputStream

String转成inputStream(jdk1.1开始不建议使用)

FilterInputStream

此为装饰器的抽象类

             对应的OutputStream的主要类有:

ByteArrayOutputStream

缓冲字节数组当作OutputStream

FileOutputStream

文件当作OutputStream

PipedOutputStream

用于写出到PipedinputStream的数据

FilterOutputStream

此为装饰器的抽象类

3.2.关于FilterOutputStream/FilterInputStream两个抽象类的作用,java设计者采用装饰器模式来实现不              同功 能的组合,而装饰器模式必须具有和其所装饰的对象相同的接口,先看看两个装饰器有哪些具               体装饰功能类

 

               FilterInputStream

DataInputStream

可以读取不同基本类型数据以及String对象

BufferedInputStream

对数据进行缓冲读取

PushbackInputStream

具有”推回”一个字节的功能

CheckInputStream

可对读取数据校验

InflaterInputSream

具有对输入数据解压缩功能

DeflaterInputSteam

具有对输入数据压缩数据功能

 

               FilterOutputStream

DataOutputStream

可以写出不同基本类型数据以及String对象

BufferedOutputStream

对数据进行缓冲写出

PrintStream

格式化输出(能够方便地打印各种数据值表示形式,指定字符编码,提供两项其他输出流同的功能:1.永远不会抛出 IOException,异常情况仅设置可通过 checkError 方法测试的内部标志;2.自动刷新--自动调用 flush 方法println 方法,写入一个换行符)

CheckOutputStream

可对写出数据校验

InflaterOutputSream

具有对输出数据解压缩数据功能

DeflaterOutputSteam

具有对输出数据压缩数据功能

      3.3.我可以对InputStream和OutputSream进行功能的组合操作,如对数据缓冲再格式化输出。 

 

 

      4.JDK又为我们提供另一种形式的IO操作----面向字符的IO操作,think in java的作者说面向字符形式的IO           提供兼容Unicode的功能,主要是为了国际化,且比面向字节形式IO要更快。同样,api的设计者认为             有关输入的类都继承自Reader,有关输出的类都继承自Writer。

 

        按不同的数据源产生划分

Reader

BufferedReader

缓冲字符数组当作Reader(InputStream的不同,此类直 接继承Reader)

CharArrayReader

缓冲字符数组当作Reader

PipedReader

传送的字符输入流

StringReader

字符串的读取

InputStreamReader

此为适配器类(是字节流通向字符流的桥梁,使用指定的 charset 读取字节并将其解码为字符)

FilterReader

此为装饰器的抽象类

 

          Writer 

BufferedWriter

缓冲字符数组当作Writer

CharArrayWriter

缓冲字符数组当作Writer

PipedWriter

传送的字符输出流

StringWriter

字符串的写出

PrintWriter

向文本输出流打印对象的格式化表示形式

OutputStreamWriter

此为适配器类(是字节流通向字符流的桥梁,使用指定的 charset 读取字节并将其解码为字符)

FilterWriter

此为装饰器的抽象类

  4.1.上图看出ReaderWriterInputStreamOutputStream在类的组织结构上大致相似,但不完全相同。

  4.2.关于在字符流体系中将文件流(FileReader/FileWriter)作为适配器的子类来实现。

 

 5.最后附上一张从网上下的结构图

 

     

  

  6.文章参考thinking in java。
 

 

 

### 文件IO与标准IO的详细介绍 #### 文件IO概述 文件IO涉及直接调用操作系统内核所提供的系统调用函数来执行文件操作,其主要通过文件描述符进行管理。在Linux环境中,所有打开的文件都关联有一个唯一的非负整数形式的文件描述符,在创建新文件连接时由系统自动分配[^2]。 对于文件读取、写入等具体动作,则需利用`open()`获取到相应文件的标识——即文件描述符之后再配合其他诸如`read()`, `write()`之类的底层API完成实际的数据交换过程。值得注意的是,在POSIX兼容平台下,默认情况下进程启动之初便已存在三个特殊的预定义文件描述符分别代表标准输入(通常是键盘)、标准输出以及标准错误流。 ```c #include <unistd.h> #include <fcntl.h> int main(){ int fd; char buffer[]="Hello File IO"; // 创建并打开一个名为example.txt的新文件用于只写模式 fd = open("example.txt", O_WRONLY | O_CREAT , S_IRUSR | S_IWUSR); if(fd != -1){ write(fd,buffer,sizeof(buffer)); close(fd); } } ``` #### 标准IO概述 相比之下,标准IO则提供了一层更高层次抽象封后的接口集,它并不直接依赖特定OS实现细节而是基于C语言的标准库构建而成。这意味着只要遵循ANSI C规范编写的应用程序无论在哪种支持此标准的操作系统上运行都能保持一致的行为特性[^3]。 除了简化编程模型外,标准IO还引入了缓冲机制以提高效率,并且默认初始化了三个全局对象:`stdin`(对应于终端输入),`stdout`(指向屏幕显示)还有`stderr`(专供异常情况报告)。当开发者想要处理外部资源比如磁盘上的文档时往往会选择借助`fopen()`,`fprintf()`,`fgets()`等一系列高级别的功能函数来进行交互。 ```c #include<stdio.h> int main(){ FILE *fp; const char* message ="Welcome to Standard IO"; fp=fopen("greeting.txt","w+"); if(fp!=NULL){ fprintf(fp,"%s\n",message ); fclose(fp); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值