zoukankan      html  css  js  c++  java
  • java的IO操作之--RandomAccessFile

    目标:

      1)掌握RandomAccessFile类的作用。

      2)用RandomAccessFile读取指定位置的数据。

    具体内容

      RandomAccessFile类的主要功能是完成随机读取功能,可以读取指定范围的内容。

      假设文件中存储了以下三个数据:

      因为文件中所有内容都是按照字节存储的,都有固定的保存位置。

      构造方法:

    public RandomAccessFile(File file,String mode) throws FileNotFoundException

      实例化此类需要传递File类,告诉程序应该操作哪个文件。之后有一个模式,文件的打开模式,

      常用的两种模式:

      1) r:读模式

      2)w:写模式

      3)rw:读写模式,如果使用此模式,如果文件不存在,则会自动创建

    package Thread1;
    import java.io.File ;
    import java.io.RandomAccessFile ;
    public class demo1{
        // 所有的异常直接抛出,程序中不再进行处理
        public static void main(String args[]) throws Exception{    //在主方法处使用throws抛出异常给JVM处理,
    节省了很多异常处理操作
    File f
    = new File("d:" + File.separator + "test.txt") ; // 指定要操作的文件 RandomAccessFile rdf = null ; // 声明RandomAccessFile类的对象 rdf = new RandomAccessFile(f,"rw") ;// 读写模式,如果文件不存在,会自动创建 String name = null ; int age = 0 ; name = "zhangsan" ; // 字符串长度为8 age = 30 ; // 数字的长度为4 rdf.writeBytes(name) ; // 将姓名写入文件之中 rdf.writeInt(age) ; // 将年龄写入文件之中 name = "lisi " ; // 字符串长度为8 age = 31 ; // 数字的长度为4 rdf.writeBytes(name) ; // 将姓名写入文件之中 rdf.writeInt(age) ; // 将年龄写入文件之中 name = "wangwu " ; // 字符串长度为8 age = 32 ; // 数字的长度为4 rdf.writeBytes(name) ; // 将姓名写入文件之中 rdf.writeInt(age) ; // 将年龄写入文件之中 rdf.close() ; // 关闭 } };

      写入的方法:writeBytes(String str);writeInt(int a); 

      运行结果:

      以上完成了写入的操作。每条数据都是12位。

      写完开始读取数据。写的时候,可以将一个字符串写入(writeBytes(String str)),读的时候, 需要一个个以字节读取出来(readByte())。

      跳过几个字节的方法:skipBytes(n),向前几个字节的方法:seek(0),数组与字符串转换的方法:String str=new String(char b[])

    import java.io.File ;
    import java.io.RandomAccessFile ;
    public class RandomAccessFileDemo02{
        // 所有的异常直接抛出,程序中不再进行处理
        public static void main(String args[]) throws Exception{
            File f = new File("d:" + File.separator + "test.txt") ;    // 指定要操作的文件
            RandomAccessFile rdf = null ;        // 声明RandomAccessFile类的对象
            rdf = new RandomAccessFile(f,"r") ;// 以只读的方式打开文件
            String name = null ;
            int age = 0 ;
            byte b[] = new byte[8] ;    // 开辟byte数组
            // 读取第二个人的信息,意味着要空出第一个人的信息
            rdf.skipBytes(12) ;        // 跳过第一个人的信息
            for(int i=0;i<b.length;i++){
                b[i] = rdf.readByte() ;    // 读取一个字节
            }
            name = new String(b) ;    // 将读取出来的byte数组变为字符串,这里把数组放到string对象中变成String字符串。
            age = rdf.readInt() ;    // 读取数字    //readInt()读取的大小恰好是4个字节,读取前面8个字符串后面的几个数字。
            System.out.println("第二个人的信息 --> 姓名:" + name + ";年龄:" + age) ;
            // 读取第一个人的信息
            rdf.seek(0) ;    // 指针回到文件的开头
            for(int i=0;i<b.length;i++){
                b[i] = rdf.readByte() ;    // 读取一个字节
            }
            name = new String(b) ;    // 将读取出来的byte数组变为字符串
            age = rdf.readInt() ;    // 读取数字
            System.out.println("第一个人的信息 --> 姓名:" + name + ";年龄:" + age) ;
            rdf.skipBytes(12) ;    // 空出第二个人的信息
            for(int i=0;i<b.length;i++){
                b[i] = rdf.readByte() ;    // 读取一个字节
            }
            name = new String(b) ;    // 将读取出来的byte数组变为字符串
            age = rdf.readInt() ;    // 读取数字
            System.out.println("第三个人的信息 --> 姓名:" + name + ";年龄:" + age) ;
            rdf.close() ;                // 关闭
        }
    };

      运行结果:

    第二个人的信息 --> 姓名:lisi    ;年龄:31
    第一个人的信息 --> 姓名:zhangsan;年龄:30
    第三个人的信息 --> 姓名:wangwu  ;年龄:32

      如果要完成文件内容操作,可以使用RoundomAccessFile()完成。

  • 相关阅读:
    面向对象(metaclass继承高级用法)
    建表和删表(sqlalchemy框架)
    单表操作
    认证,权限
    协程,twisted
    定制起始url(scrapy_redis)
    浅谈深度优先和广度优先(scrapy-redis)
    scrapy-redis(调度器Scheduler源码分析)
    scrapy-redis
    xpath
  • 原文地址:https://www.cnblogs.com/alsf/p/5747254.html
Copyright © 2011-2022 走看看