深入分析javaweb技术内幕--java I/O的工作机制(未完)

I/O问题是大部分web应用系统的瓶颈,所以在海量数据的时代,解决I/O问题就需要先了解I/O机制,优化方式等内容。

java的I/O类库的基本架构

Java的I/O操作类在java.io包中,该包中的类可以分成以下四组:

1、基于字节操作的I/O接口InputStream、outputStream
2、基于字符操作的I/O接口Writer、reader
3、基于磁盘操作的I/O接口File
4、基于网络操作的I/O接口Socket

前两者是数据格式影响I/O操作,后两者是传输方式影响I/O操作。



1、基于字节操作的I/O接口


编程语言的IO类库常使用流这个概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。java中IO类分成两种,输入和输出,通过继承:

1、任何自InputStream或Reader派生而来的类都含有名为read的基本方法,用于读取单个字节或者字节数组。

2、任何自OutputStream或Writer派生出来的类都会含有名为write()的基本方法,用于写单个字节或者字节数组。

InputStream

表示从不同数据源产生输入的类,这些数据源包括:字节数组、String对象、文件、管道、其他种类的流、其他数据源。每一种数据源都有相应的InputStream子类,下面展示出这些子类:

ByteArrayInputStreamy允许将内存的缓冲区当做InputStream使用 
StringBufferInputStream将String转成InputStream 
FileInputStream用于从文件中读取信息 
PipedInputStream产生用于写入相关pipedOutputStream的数据,实现管道化 
SequenceInputStream将两个或者多个InputStream对象转换成单一InputStream 
FilterInputStream

抽象类,作为装饰器接口

DataInputStreamk可以通过流将基本类型的数据从一个地方迁移到另一个地方
BufferedInputStreams使用它可以防止每次读取时都要进行时实际写操作
LineNumberInputStreamg跟踪输入流中的行号
PushbackInputStreamt通常作为编译器的扫描器可以。将独到的最后一个字符回退

 

OutputStream

该类别的类决定了输出所要去往的目标:字节数组、文件或管道,另外FilterOutPutStream为修饰器类提供了一个基类,修饰器类把属性或者有用的接口与输出流连接了起来。

ByteArrayOutputStream在内存中创建缓冲区,所有送往流的数据都要放置在这个缓冲区 
FileOutputStream用于将信息写到文件中 
PipedOutputStream任何写入其中的信息都将自动作为相关PipedInputStream的输出,实现管道化 
FilterOutputStream

抽象类,作为装饰器接口

DataOutputStreamy与DataInputStream搭配使用,可以按照可移植方式向流中写入基本类型数据
BufferedInputStream使用以避免每次发送数据的时候都要进行实际写操作,代表使用缓冲区。
PrintStreamy用于产生格式化输出,处理显示
  

 


2、基于字符操作的I/O接口

Write和Reader。不管是磁盘还是网络传输,最小的存储单元都是字节而不是字符,I/O操作都是对字节做操作,而对字符的I/O操作目的是方便我们直接对字符做操作。这里需要面对的主要问题就是字符到字节需要转码,乱码问题是很普遍也很严峻的。Reader和Writer提供兼容Unicode与面向字符的I/O功能

字节与字符的转换中InputStreamReader类是字节到字符的转化桥梁,一个InputStream需要经过StreamDecoder转换成Reader。StreamDecoder是完成字节到字符转换解码的实现类。



I/O操作是操作系统提供的接口,数据首先通过磁盘复制到内核缓存中,其次这些数据从内核中赋值到用户空间中,这会是一个非常耗时的方案。

几种访问文件的方式:

1、标准访问文件方式:当应用程序调用Read()接口时,操作系统会检查缓存中有没有需要的数据,如果有就直接从内存中返回数据。当调用Write()命令时为什么要用sync同步命令,目的就是将数据写入磁盘,不然write指令会先将数据从用户地址空间复制到内核地址空间

2、直接的I/O方式:应用程序直接访问数据库,这样做可以少两层

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值