'r' | 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。 |
"rw" | 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。 |
"rws" | 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。 |
"rwd" | 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。 |
JDK 1.6上面写的每次write数据时,"rw"模式,数据不会立即写到硬盘中;而“rwd”,数据会被立即写入硬盘。如果写数据过程发生异常,“rwd”模式中已被write的数据被保存到硬盘,而“rw"则全部丢失。
- /*
- 这类不算是IO体系中的子类。
- 而是直接继承Object
- 但是它是IO包中的成员,因为它具备读和写的功能。
- 能完成读写的原理是内部封装了字节输入流和输出流。
- 而且内部还封装了一个数组,通过指针对数组的元素进行操作。
- 可通过getFilePointer获取指针位置。
- 也可通过seek改变指针的位置。
- 通过构造函数可以看出,该类只能操作文件。
- 操作文件有4种模式:"r"、"rw"、"rws" 或 "rwd"
- 如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。
- 如果模式为rw读写。如果文件不存在则会去创建文件,如果存在则不会创建。
- 可以实现多线程下载!因为seek可以调节指针,这样可以开启多个线程,来写相同间隔的数据。
- *public class Day19_05 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// test_RandomAcessFile_1();
test_RandomAcessFile_2();
}
//seek()设置文件指针,调用写入方法,会覆盖指针位置开始的数据
public static void test_RandomAcessFile_2(){
RandomAccessFile raf1 = null;
try {
raf1 = new RandomAccessFile("E:\\abc.txt","rw");
raf1.seek(2);
raf1.write("QQ".getBytes());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(raf1 != null)
raf1.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//读取D:\\abc.txt文件、写入E:\\abc.txt文件
public static void test_RandomAcessFile_1(){
RandomAccessFile raf1 = null;
RandomAccessFile raf2 = null;
try {
raf1 = new RandomAccessFile("D:\\abc.txt","r");
raf2 = new RandomAccessFile("E:\\abc.txt","rw");
byte[] by = new byte[1024];
int len = 0;
while((len = raf1.read(by)) != -1){
raf2.write(by, 0, len);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(raf2 != null)
raf2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(raf1 != null)
raf1.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}