第八章-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 上搜索到中文帮助,可以详细研究一下。