当前位置:首页 > 操作系统 > MacOs

【文件处理】RandomAccessFile

使用RandomAccessFile的最大好处在于,一般的InputStream和OutputStream类对于文件都是顺序读取的,不能跳跃读取数据。而RandomAccessFile类可以通过seek或者skipBytes方法来读取数据指针,从而达到任意提取数据的效果。另外还可以通过选择不同数据类型的方式来对数据进行读取或者编写。要强调的是如果文件编写时选择的是UTF-8的方式的话,那么读取也必须是通过读取UTF-8的方式。不然会出现乱码。

二,RandomAccessFile的使用案例:

(1)创建Person类,给3个属性。分别是 name,age,sex (数据类型分别为:String, int ,boolean)

<span style="color: #0000ff">package</span><span style="color: #000000"> Entiry;

</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> Person {
    
    </span><span style="color: #0000ff">public</span><span style="color: #000000"> String name;
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span><span style="color: #000000"> age;
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">boolean</span><span style="color: #000000"> sex;
    </span><span style="color: #0000ff">public</span><span style="color: #000000"> String getName() {
        </span><span style="color: #0000ff">return</span><span style="color: #000000"> name;
    }
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> setName(String name) {
        </span><span style="color: #0000ff">this</span>.name =<span style="color: #000000"> name;
    }
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span><span style="color: #000000"> getAge() {
        </span><span style="color: #0000ff">return</span><span style="color: #000000"> age;
    }
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> setAge(<span style="color: #0000ff">int</span><span style="color: #000000"> age) {
        </span><span style="color: #0000ff">this</span>.age =<span style="color: #000000"> age;
    }
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">boolean</span><span style="color: #000000"> isSex() {
        </span><span style="color: #0000ff">return</span><span style="color: #000000"> sex;
    }
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> setSex(<span style="color: #0000ff">boolean</span><span style="color: #000000"> sex) {
        </span><span style="color: #0000ff">this</span>.sex =<span style="color: #000000"> sex;
    }
    </span><span style="color: #0000ff">public</span><span style="color: #000000"> Person() {
        </span><span style="color: #0000ff">super</span><span style="color: #000000">();
        </span><span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated constructor stub</span>
<span style="color: #000000">    }
    </span><span style="color: #0000ff">public</span> Person(String name, <span style="color: #0000ff">int</span> age, <span style="color: #0000ff">boolean</span><span style="color: #000000"> sex) {
        </span><span style="color: #0000ff">super</span><span style="color: #000000">();
        </span><span style="color: #0000ff">this</span>.name =<span style="color: #000000"> name;
        </span><span style="color: #0000ff">this</span>.age =<span style="color: #000000"> age;
        </span><span style="color: #0000ff">this</span>.sex =<span style="color: #000000"> sex;
    }
    @Override
    </span><span style="color: #0000ff">public</span><span style="color: #000000"> String toString() {
        </span><span style="color: #0000ff">return</span> "Person [age=" + age + ", name=" + name + ", sex=" + sex + "]"<span style="color: #000000">;
    }
    
    

}</span>

(2)创建RandomAccessFile的Test类(方法写到了test类)

<span style="color: #0000ff">package</span><span style="color: #000000"> RandomAccess;

</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.File;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.FileNotFoundException;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.IOException;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.RandomAccessFile;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.ArrayList;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.List;

</span><span style="color: #0000ff">import</span><span style="color: #000000"> Entiry.Person;

</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> test {
    
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) <span style="color: #0000ff">throws</span><span style="color: #000000"> IOException {
        <span style="color: #993366">//创建Person数组</span><br />
        Person[] persons </span>= <span style="color: #0000ff">new</span> Person[]{<span style="color: #0000ff">new</span> Person("tony", 18, <span style="color: #0000ff">true</span><span style="color: #000000">),
        </span><span style="color: #0000ff">new</span> Person("Jack", 33, <span style="color: #0000ff">true</span>),<span style="color: #0000ff">new</span> Person("Vivian",23, <span style="color: #0000ff">false</span><span style="color: #000000">)
        };
        write(persons);     <span style="color: #993366">//调用write方法</span>
        Person p </span>= read(2<span style="color: #000000">);  <span style="color: #993366">//调用read方法()中的2是指读取第三行的数据。</span>
        System.out.println(p);
        
        
    }
    </span><span style="color: #0000ff">private</span> <span style="color: #0000ff">static</span> List<Long><span style="color: #000000"> pointer;  <span style="color: #993366">//创建一个long型的集合。目的是为了存放不同数据(name,age,sex)之间的指针。
    /**<br />  /* 创建read方法(设定指针参数)<br />  /*<br />  **/
    </span></span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> Person read(<span style="color: #0000ff">int</span> i) <span style="color: #0000ff">throws</span><span style="color: #000000"> IOException{
        
        RandomAccessFile rand </span>= <span style="color: #0000ff">new</span> RandomAccessFile("C:/Users/IBM_ADMIN/Desktop/NewDirectory/liupeng/randomaccess.txt", "r"<span style="color: #000000">); <span style="color: #993366">//指定读取文件地址,“r”为只读
        
        </span></span><span style="color: #0000ff">long</span> l =<span style="color: #000000"> pointer.get(i);
        rand.skipBytes((</span><span style="color: #0000ff">int</span><span style="color: #000000">)l);  <span style="color: #993366">//skipBytes()是指在文件中跳过给定数量的字节</span>
        
        Person p </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> Person();
        
        p.name </span>=<span style="color: #000000"> rand.readUTF(); <span style="color: #993366">//以UTF的方式读取</span>
        p.age </span>=<span style="color: #000000">rand.readInt();   <span style="color: #993366">//以int类型读取</span>
        p.sex </span>=<span style="color: #000000"> rand.readBoolean(); <span style="color: #993366">//以布尔类型读取</span>
        rand.close();
        </span><span style="color: #0000ff">return</span><span style="color: #000000"> p;
        
    }<br /></span>
<span style="color: #000000"><span style="color: #993366">    /**<br />  /* 创建write方法(把Person[]类作为参数传递过来 persons)<br />  /*<br />  **/</span>  
    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> write(Person[] persons) <span style="color: #0000ff">throws</span><span style="color: #000000"> IOException{
        RandomAccessFile rand </span>= <span style="color: #0000ff">new</span> RandomAccessFile("C:/Users/IBM_ADMIN/Desktop/NewDirectory/liupeng/randomaccess.txt", "rw"<span style="color: #000000">); <span style="color: #993366">//同样指定读取文件地址,“rw”为读写权限</span>
        
        pointer </span>= <span style="color: #0000ff">new</span> ArrayList<Long><span style="color: #000000">(); <span style="color: #993366">//初始化pointer指针类
        
        </span></span><span style="color: #0000ff">for</span><span style="color: #000000">(Person per:persons){
            pointer.add(rand.getFilePointer()); <span style="color: #993366">//把当前指针记录到集合里。</span>
            rand.writeUTF(per.name);  <span style="color: #993366">//通过UTF的方式进行写入。</span>
            System.out.println(</span>"name" +<span style="color: #000000"> rand.getFilePointer()); <span style="color: #993366">//打印name所在的指针位置。(因为我们集合中有三个元素对。因此每次循环出来的name指针分别是不同的)</span>
            rand.writeInt(per.age);   <span style="color: #993366">//通过int方法进行写入。</span>
            System.out.println(</span>"age" +<span style="color: #000000"> rand.getFilePointer());<span style="color: #000000"><span style="color: #993366"> //打印age所在的指针位置。</span></span>
            rand.writeBoolean(per.sex); <span style="color: #000000"><span style="color: #993366">//通过boolean的方法进行写入。</span></span>
            System.out.println(</span>"sex" +<span style="color: #000000"> rand.getFilePointer()); <span style="color: #000000"><span style="color: #993366">//打印sex所在的指针位置。</span></span>
            
        }rand.close();
    }
    

}</span>

(3)结果:

注释:数字分别为每次循环后记录的指针位置,而最后Person [age=23, name=Vivian, sex=false]是 代码中Person p = read(2);  指定的第三个元素的结果。因为第一个元素是从0开始起始的。

<span style="color: #000000">name6
age10
sex11
name17
age21
sex22
name30
age34
sex35
Person [age</span>=23, name=Vivian, sex=<span style="color: #0000ff">false</span>]

 

<span style="color: #0000ff"> </span>

【文件处理】RandomAccessFile

标签:bool   int()   之间   指定   案例   min   not   类型   static   

本文系统来源:http://www.cnblogs.com/liupengpengg/p/6845467.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐