文档章节

随机访问

o
 osc_4nmshwhm
发布于 2018/08/06 23:37
字数 417
阅读 0
收藏 0

RandomAccessFile 是一个进行随机文件I/O(在字节层次上)的类。这个类提供一个seek方法,和 C/C++中的相似,移动文件指针到任意的位置,然后从那个位置字节可以被读取或写入。

seek方法访问底层的运行时系统因此往往是消耗巨大的。一个更好的代替是在RandomAccessFile上建立你自己的缓冲,并实现一个直接的字节read方法。read方法的参数是字节偏移量(>= 0)。这样的一个例子是:

 import java.io.*;

 

public class ReadRandom {

   private static final int DEFAULT_BUFSIZE = 4096;

 

   private RandomAccessFile raf;

 

   private byte inbuf[];

 

   private long startpos = -1;

 

   private long endpos = -1;

 

   private int bufsize;

 

   public ReadRandom(String name) throws FileNotFoundException {

        this(name, DEFAULT_BUFSIZE);

   }

 

   public ReadRandom(String name, int b) throws FileNotFoundException {

        raf = new RandomAccessFile(name, "r");

        bufsize = b;

        inbuf = new byte[bufsize];

   }

 

   public int read(long pos) {

        if (pos < startpos || pos > endpos) {

            long blockstart = (pos / bufsize) * bufsize;

            int n;

            try {

                 raf.seek(blockstart);

                 n = raf.read(inbuf);

            } catch (IOException e) {

                 return -1;

            }

            startpos = blockstart;

            endpos = blockstart + n - 1;

            if (pos < startpos || pos > endpos)

                 return -1;

        }

        return inbuf[(int) (pos - startpos)] & 0xffff;

   }

 

   public void close() throws IOException {

        raf.close();

   }

 

   public static void main(String args[]) {

        if (args.length != 1) {

            System.err.println("missing filename");

            System.exit(1);

        }

        try {

            ReadRandom rr = new ReadRandom(args[0]);

            long pos = 0;

            int c;

            byte buf[] = new byte[1];

            while ((c = rr.read(pos)) != -1) {

                 pos++;

                 buf[0] = (byte) c;

                 System.out.write(buf, 0, 1);

            }

            rr.close();

        } catch (IOException e) {

            System.err.println(e);

        }

   }

}

这个程序简单的读取字节序列然后输出它们。

如果有访问位置,这个技术是很有用的,文件中的附近字节几乎在同时被读取。例如,如果你在一个排序的文件上实现二分法查找,这个方法可能很有用。如果你在一个巨大的文件上的任意点做随机访问的话就没有太大价值。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

为什么数组[idx ++] + =“a”在Java 8中增加一次idx,在Java 9和10中增加两次?

问题: For a challenge, a fellow code golfer wrote the following code : 对于挑战, 一位代码高尔夫球手 编写了以下代码 : import java.util.*;public class Main { public static ......

富含淀粉
24分钟前
11
0
这三个博弈论新趋势,正深刻影响深度强化学习道翰天琼认知智能未来机器人接口API

博弈论在现代人工智能(AI)解决方案中正扮演着至关重要的角色,深度强化学习(DRL)正是积极拥抱博弈论的头等公民。 从单智能体程序到复杂的多智能体深度强化学习环境,博弈论原理贯穿了 AI...

jackli2020
26分钟前
5
0
Web右键菜单实现思路

需要的知识 阻止事件冒泡 event.stopPropagation() 阻止默认行为 event.preventDefault() CSS定位 事件处理程序 oncontextmenu 思路 预先编写好右键菜单的DOM 在需要右键菜单的DOM元素上添加...

AioDiage
27分钟前
0
0
点击提交form

<form action="/search" id="search_form"> <input type="text" name="keywords" value="" placeholder="Furniture Handles" class="jhser" /> <span class="serBtn" onclick="docu......

子枫Eric
40分钟前
18
0
oracle查询、修改、删除、插入语句

表结构如下 create table test ( id int, xm varchar2(5), age varchar2(3) ) 内有数据格式 id xm age 1 张三 14 2 李四 20 查询语句 select * from test;#*号为返回全部字段 select id,xm f......

椰子牛奶
43分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部