Java基础——输入/输出(三)

一.RandomAccessFile


 

      RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,她既可以读取文件内容,也可以向文件输出数据。与普通的输入/输出流不同的是,RandomAccessFile支持“随机访问”的方式,程序可以直接转到任意位置来读写文件。

      因为RandomAccessFile可以自由访问文件的任意位置,所以如果我们希望只访问文件部分内容,而不是全部,使用RandomAccessFile将是最好的选择。

      RandomAccessFile对象也包括一个记录指针,用于标示当前读写处的位置,但程序创建了一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处),当读/写n个总结后,文件指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由移动该记录指针,既可以向前移动,也可以向后移动。

 

RandomAccessFile提供如下方法来操作文件记录指针:

long getFilePointer();  返回文件记录指针的当前位置

void seek(long pos);   将文件记录指针定位到pos位置

 

下面程序使用RandomAccessFile来访问指定的中间部分数据

 

import java.io.*;

public class RandomAccessFileTest
{
    public static void main(String[] args) 
    {
        try(
            RandomAccessFile raf =  new RandomAccessFile(
                "src/RandomAccessFileTest.java" , "r"))
        {
            // 获取RandomAccessFile对象文件指针的位置,初始位置是0
            System.out.println("RandomAccessFile的文件指针的初始位置:" 
                + raf.getFilePointer());
            // 移动raf的文件记录指针的位置
            raf.seek(300);
            byte[] bbuf = new byte[1024];
            // 用于保存实际读取的字节数
            int hasRead = 0;
            // 使用循环来重复“取水”过程
            while ((hasRead = raf.read(bbuf)) > 0 )
            {
                // 取出“竹筒”中水滴(字节),将字节数组转换成字符串输入!
                System.out.print(new String(bbuf , 0 , hasRead ));
            }
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
}

 

运行结果:

 

RandomAccessFile的文件指针的初始位置:0
domAccessFile的文件指针的初始位置:" 
                + raf.getFilePointer());
            // 移动raf的文件记录指针的位置
            raf.seek(300);
            byte[] bbuf = new byte[1024];
            // 用于保存实际读取的字节数
            int hasRead = 0;
            // 使用循环来重复“取水”过程
            while ((hasRead = raf.read(bbuf)) > 0 )
            {
                // 取出“竹筒”中水滴(字节),将字节数组转换成字符串输入!
                System.out.print(new String(bbuf , 0 , hasRead ));
            }
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
}

 

posted @ 2015-04-02 15:12  leejun同学  阅读(223)  评论(0编辑  收藏  举报