深入分析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接口

深入分析javaweb技术内幕--java I/O的工作机制(未完)_第1张图片

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

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

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

InputStream

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

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

抽象类,作为装饰器接口

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

 

OutputStream

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

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

抽象类,作为装饰器接口

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

 


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方式:应用程序直接访问数据库,这样做可以少两层

















你可能感兴趣的:(java网络)