第八章-io技术

第八章-io技术
第八章-io技术

引言

1.数据源

data source. 提供原始数据的原始媒介。常见的:数据库、文件、其他程序、内存、网络连接、IO设备

2.流的概念

Stream:名词,水流,趋势。动词:流出,流动。

数据源就像水箱,流就像水管中流着的水流,程序就是我们

最终的用户。流是一个抽象、动态的概念,是一连串连续动态的

数据集合。

3.第一个简单的IO流程序(将文件中的数据读入)

当程序需要读取数据源的数据时,就会通过IO流对象开启一个通向数据源的流,通过这个IO流对象相关方法可以顺序读取流中的数据。同理,通过流向目的地写入数据通过流来处理。基本代码如下:

4.Java中流的概念细分

流的方向:

输入流:数据源到程序(InputStream、Reader读进来)

输出流:程序到目的地(OutPutStream、Writer写出去)

处理数据单元:

字节流:按照字节读取数据(InputStream、OutputStream)

字符流:按照字符读取数据(Reader、Writer)

功能不同:

节点流:可以直接从数据源或目的地读写数据。

处理流:不直接连接到数据源或目的地,是处理流的流。通过对其他流的处理提高程序的性能。

节点流和处理流的关系:

节点流处于io操作的第一线,所有操作必须通过他们进行;处理流可以对节点流进行包装,提高性能或提高程序的灵活性。

处理流:

5. Java 中IO 流类的体系(这里只列出常用的类,详情可以参考JDK API 文档。红色粗体标

注为最常用,必须掌握的!)

四个基本抽象类: InputStream :

此抽象类是表示字节输入流的所有类的超类。InputSteam是一个抽象类,它不可以实例化。数据的读取需要由它的子类来实现。根据节点的不同,它派生了不同的节点流子类。

继承自InputSteam的流都是用于向程序中输入数据,且数据的单位为字节(8 bit);下图中深色为节点流,浅色为处理流。

常用方法:read, close. 详情可以参考API文档。

OutputStream:

此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器。

常见子类的使用方法:

1.FileInputStream和FileOutputStream

构造方法和常用方法:自己参考API文档。

FileInputStream用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑

使用FileReader。

available(): 并不是指定文件还有多少数据没有读,不然,如果是100g的大

文件,返回得数就溢出了。不过,对于普通文件的话可以看做是剩余的未读数据。

返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)

的估计剩余字节数。

FileOutputStream用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用FileWriter。

//copyFile(new File(file,"22.txt"),new

File(file2,"22.txt"));

File[] files = file.listFiles();

for(File f:files){

if(f.isDirectory()){

copyDir(f,new File(file2,file.getName()));

}

if(f.isFile()){

copyFile(f,new File(new

File(file2,file.getName()),f.getName()));

}

}

}

/*

将d:/a/下所有的内容copy到e:/tt/

*/

static void copyFile(File src,File dec){

FileInputStream fis = null;

FileOutputStream fos = null;

byte[] buffer = new byte[1024]; //为了提高效率,设置缓存数组

int temp = 0;

try {

fis = new FileInputStream(src);

fos = new FileOutputStream(dec);

while((temp=fis.read(buffer))!=-1){

fos.write(buffer, 0, temp);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

try {

fis.close();

2.ByteArrayInutStream和ByteArrayOutputStream(经常用在需要流和数组之间转化

的情况!)

ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪read方法要提供的下一个字节。

说白了,FileInputStream是把文件当做数据源。ByteArrayInputStream则是把内存中的某个数组当做数据源。

ByteArrayOutputStream:

此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString()

获取数据。 ByteArrayOutputStream将一个输出流指向一个Byte数组,但这个Byte数组是ByteArrayOutputStream内部内置的,不需要我们来定义。

注:不需要关闭流的,但是调用close也没有问题,close不做任何事情。因为ByteArrayOutputStream本身操作的是数组,并没有打开文件描述符之类的,所以不

3.BufferedInputStream和BufferedOutputStream

是处理流。通过内部缓存数组来提高操作流的效率。

4.DataInputStream和DataOutputStream

数据流通常在流中写入或读取一个结果时使用,如网络数据传递。DataInputStream 和DataOutputStream提供了可以存取与机器无关的所有Java基础类型数据(如:int,

5.ObjectInputStream和ObjectOutputStream

见专题文档:java对象的序列化和反序列化。

6.PrintStream

System.out就是一个PrintStream。简单看看就行了。

Reader:

用于读取字符流的抽象类,数据单位为字符。

Writer:

写入字符流的抽象类。

InputStreamReader和OutputStreamWriter

用来实现将字节流转化成字符流

附录(IO中其他常用类):

File类:

文件和目录路径名的抽象表示形式。一个File对象可以代表一个文件或目录,但是不是完全对应的。建立File对象不会对文件系统产生影响。

RandomAccessFile:(不作为重点,了解即可!工作中用的非常少!)

还是不讲了!用的不多!用来任意读取文件中某个位置的信息!有兴趣,大家可以自学一下!

学习一下Apache Commons中的IO扩展类(了解一下):

https://www.360docs.net/doc/ca4310259.html,/io/,简单学习一下,不需要看具体的api。如果能在google 上搜索到中文帮助,可以详细研究一下。

相关主题
相关文档
最新文档