zoukankan      html  css  js  c++  java
  • Java-IO流系列-随机存取文件流

    随机存取文件流

    简介

    • RandomAccessFile声明在java.io包下, 但直接继承于java.lang.Object类。 并且它实现了Datalnput. DataOutput这两 个接口,也就意味着这个类既可以读也可以写。

    • RandomAccessFile类支持“随机访问"的方式,程序可以直接跳到文件的任意地方来读、写文件

      • 支持只访间文件的部分内容
      • 可以向已存在的文件后追加内容
    • RandomAccessFile对象包含一个记录指针,用以标示当前读写处的位置。

    • RandomAccessFile类对象可以自由移动记录指针:

      • long getFilePointer(): 获取文件记录指针的当前位置
      • void seek(long pos): 将文件记录指针定位到pos位置

    构造器

    • public RandomAccessFile(File file, String mode)
    • public RandomAccessFile(String name, String mode)

    创建RandomAccessFile类实例需要指定一个mode参数,该参数指定RandomAccessFile的访问模式:

    • r:以只读方式打开
    • rw:打开以便读取和写入
    • rwd:打开以便读取和写入;同步文件内容的更新
    • rws:打开以便读取和写入:同步文件内容和元数据的更新

    如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。 如果模式为w读写。如果文件不存在则会去创建文件,如果存在则不会创建。

    样例

    复制文件

    package com.dreamcold.io;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    
    public class Demo20 {
        public static void main(String[] args) throws IOException {
            RandomAccessFile raf1= new RandomAccessFile(new File("image.jpg"),"r");
            RandomAccessFile raf2= new RandomAccessFile(new File("image4.jpg"),"rw");
            byte[] buffer=new byte[1024];
            int len;
            while((len=raf1.read(buffer))!=-1){
                raf2.write(buffer,0,len);
            }
            raf1.close();
            raf2.close();
        }
    }
    

    效果:

    image-20210119165133196

    写入txt文件

    如果RandomaccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建
    如果写出到的文件存在,则会对原有文件内容进行覆盖。|

    package com.dreamcold.io;
    
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    
    public class Demo21 {
        public static void main(String[] args) throws IOException {
            RandomAccessFile raf1=new RandomAccessFile("hello1.txt","rw");
            raf1.write("dreamcold".getBytes());
            raf1.close();
            
        }
    }
    
    

    效果:

    image-20210119165436966

    数据插入的效果

    可以通过相关的操作,实现RandomAccessFile"插入重据的效果

    package com.dreamcold.io;
    
    import java.io.IOException;
    import java.io.RandomAccessFile;
    
    public class Demo22 {
        public static void main(String[] args) throws IOException {
            RandomAccessFile raf1=new RandomAccessFile("hello1.txt","rw");
            //将指针调到角标为3的位置
            raf1.seek(3);
            //保存指针3之后的所有的数据到StringBuilder中
            StringBuilder builder=new StringBuilder();
            byte[] buffer=new byte[20];
            int len;
            while ((len=raf1.read(buffer))!=-1){
                builder.append(new String(buffer,0,len));
            }
            //调回指针写入"xyz"
            raf1.seek(3);
            raf1.write("xyz".getBytes());
            //将StringBuiler中的数据写入文件
            raf1.write(builder.toString().getBytes());
            raf1.close();
        }
    }
    

    结果:

    image-20210119170542862

  • 相关阅读:
    SQL SERVER2005 的三种复制类型概述
    Autofac IoC容器基本实战【2】
    Autofac IoC容器基本使用步骤【1】
    在执行一行代码之前CLR做的68件事[The 68 things the CLR does before executing a single line of your code]
    .NET Entity Framework(EF)使用SqlQuery直接操作SQL查询语句或者执行过程
    使用 Entity Framework 7 进行 SQLite 的 CURD 操作
    NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
    Your Progress As A Programmer Is All Up To You
    为了效率而外包,不要因为懒惰外包
    10分钟看懂社群营销(上集)[转]
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/14940271.html
Copyright © 2011-2022 走看看