RandomAccessFile(随即读取)操作文件有4种模式:"r"、"rw"、"rws" 或 "rwd"


'r'以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException
"rw"打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws"打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd"  打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。

JDK 1.6上面写的每次write数据时,"rw"模式,数据不会立即写到硬盘中;而“rwd”,数据会被立即写入硬盘。如果写数据过程发生异常,“rwd”模式中已被write的数据被保存到硬盘,而“rw"则全部丢失。

  1. /* 
  2. 这类不算是IO体系中的子类。 
  3. 而是直接继承Object 
  4. 但是它是IO包中的成员,因为它具备读和写的功能。 
  5. 能完成读写的原理是内部封装了字节输入流和输出流。 
  6. 而且内部还封装了一个数组,通过指针对数组的元素进行操作。 
  7. 可通过getFilePointer获取指针位置。 
  8. 也可通过seek改变指针的位置。 
  9. 通过构造函数可以看出,该类只能操作文件。 
  10.  
  11. 操作文件有4种模式:"r"、"rw"、"rws" 或 "rwd" 
  12.  
  13. 如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。 
  14. 如果模式为rw读写。如果文件不存在则会去创建文件,如果存在则不会创建。 
  15.  
  16. 可以实现多线程下载!因为seek可以调节指针,这样可以开启多个线程,来写相同间隔的数据。 
  17. *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();
                }
                
            }
            
            
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值