【Android】学习札记第7章之IO流二
上一节介绍了File类的用法,它可以获取文件对象的信息,这一节将会介绍如何对File对象进行操作,并且深入介绍IO流中几种类的用法,IO流总体包括两大类,字节流和字符流,可以直接接文件的流是FileInputStream/FileOutputStream和ByteArrayInputStream/ByteArrayOutputStream,而可以对字节流进行包装并缓冲加快读写效率的流有很多,不仅下面介绍的这些,还可以根据API,还可以根据eclipse中的快捷键,从IO流父类中可知所有的IO包装流,根据需求供我们使用。
①用到的快捷键:
Ctrl+O:查找方法
Ctrl+T:类的树状结构
Ctrl+Shift+T:查找类
Alt+Shift+M:提取数据成一个方法
②对文件进行操作(双向):
既能读又能写,还可以移动下标,不属于IO流,可以对File进行操作。
③Stream流(单向):
把字节的读写,抽象成字节在管道中流动。分为输入流和输出流。
输入流(read):流入内存,如:读取U盘中的数据。;
输出流(write):流出内存,如:打印Word文档中的数据。
③高级流、操作流:
与其他流相接,提供特定的数据处理功能,操作其他流的流。
工具/原料
JDK、eclipse、android SDK、ADT
一、java.io.RandomAccessFile
1、读写文件中的字节数据,用下标读写文件中的指定位置的字节值。
(双向:既能读又能写,还可以移动下标,不属于IO流,可以对File进行操作)
2、创建对象:
RandomAccessFile raf=new RandomAccessFile(路径字符串或File对象,"rw");//不存在直接新建空文件。
3、方法:
write(int b):写入int型的b,输出int转为“十六进制”中四个字节的末尾1个字节。(强转成byte)。
write(byte[] buffer):输出数组中全部的字节值。
write(byte[] buffer,int from,int num):输出数组中的从from开始的num个字节值。
read():读取一个字节值,然后前补三个0字节,变成int类型,读取结束返回-1。
read(byte[] buffer): 根据指定数组长度,读取一批字节值,并放入指定的数组buffer中,并返回放入数组的字节数量, 当读取结束返回-1。
seek(int i):将指针移动到指定位置。
getFilePointer():获得当前所在的位置的下标。
writeInt(int i):输出int类型的4个字节值
writeDouble(double d):输出int类型的8个字节值
writeUTF(String s):先输出2个字节值,表示字符串的字节长度,再输出字符串的字节值。
readInt():读取4个字节值转成int
readDouble():读取8个字节值转成int
readUTF(): 先读取2个字节值,来确定字符串的字节长度,再读取这些字节值,转成String。读取结束再读取会 出现EOF读取结束异常。
4、练习
对文件进行加密、解密。
二、java.io.FileInputStream/FileOutputStream
1、概述
①父类:java.io.OutputStream/InputStream(抽象类)
②子类:java.io.FileInputStream/FileOutputStream(直接与文件相接,读写文件中的数据。不可定位指针的位置,只能顺序读写。)
③创建对象:
FileOutputStream out=new FileOutputStream(文件或字符串);//不论文件是否存在,都会新建空文件。
FileOutputStream out=new FileOutputStream(文件或字符串,true);//不存在,会新建空文件;则存在直接追加数据。
④方法:
拥有抽象类OutputStream/InputStream的方法。
Ⅰ、OutputStream:
write(int b):写入int型的b,输出int转为“十六进制”中四个字节的末尾1个字节。(强转成byte)。
write(byte[]):输出数组中全部的字节值。
write(byte[],int from,int num):输出数组中的从from开始的num个字节值。
flush():刷出缓存,缓存满了自动刷出,不满需要手动刷出。
Ⅱ、InputStream:
read():单字节读取。
read(byte[]):多字节读取。
available():获取剩余的可读取字节量。
2、练习:
将原文件复制成目标文件。
三、java.io.BufferedInputStream/BufferedOutputStream
1、概述
①提供内存缓冲区数组,提高“单字节”读写效率,缓存需要flush刷出,刷出后离开缓冲区。
②创建对象:
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(from));//内部数组默认长度:8192字节。
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(from),16*1024);//内部数组长度:16K。
2、练习:
将原文件复制成目标文件。
四、java.io.DataInputStream/DataOutputStream
1、概述
①读写固定字节格式的数据。
②创建对象:
DataOutputStream out=new DataOutputStream(想接的流);。
③方法:
Ⅰ、DataOutputStream:
writeInt(int i):输出int类型的4个字节值。
writeDouble(double d):输出int类型的8个字节值。
writeUTF(String s):先输出2个字节值,表示字符串的字节长度,再输出字符串的字节值。
Ⅱ、DataInputStream:
readInt(int i):读取4个字节值转成int。
readDouble(double d):读取8个字节值转成int。
readUTF(String s): 先读取2个字节值,来确定字符串的字节长度,再读取这些字节值,转成String。读取结 束再读取会出现EOF读取结束异常。
注意事项
io.RandomAccessFile是单向的读写不能同时进行,而IO流是双向的可同时进行读写,为了效率考虑,可对字节流进行包装。
DataInputStream/DataOutputStream中的readUTF和writeUTF需要先写入2个头字节表示长度,然后再写入字符串的长度,并且UTF-8中的1个文字长度占用3字节的。