加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何在没有被阻止的情况下以块的形式读取Java中的大文件?

发布时间:2020-12-15 08:47:12 所属栏目:Java 来源:网络整理
导读:假设你有一个更大的文件然后你有内存来处理.您希望轮流读取n个字节的文件,并且不会在此过程中被阻止 读一个块 将其传递给一个帖子 读另一个块 将其传递给一个帖子 我尝试了不同的事情并取得了不同的成功,但阻塞似乎总是存在问题. 请提供一个获取访问权限的非
假设你有一个更大的文件然后你有内存来处理.您希望轮流读取n个字节的文件,并且不会在此过程中被阻止

>读一个块
>将其传递给一个帖子
>读另一个块
>将其传递给一个帖子

我尝试了不同的事情并取得了不同的成功,但阻塞似乎总是存在问题.

请提供一个获取访问权限的非阻塞方式示例,例如byte []

解决方法

你不能.

在等待磁盘为您提供数据时,您将始终阻止.如果您对每个数据块有很多工作要做,那么使用第二个线程可能有所帮助:该线程可以对数据执行CPU密集型工作,而第一个线程被阻塞,等待下一次读取完成.

但这听起来不像你的情况.

您最好的选择是尽可能大地读取数据(例如,1MB或更多).这最小化了内核中阻塞的时间,并且可能导致等待磁盘的时间更少(如果正在读取的块恰好是连续的).

这是代码

ExecutorService exec = Executors.newFixedThreadPool(1);

// use RandomAccessFile because it supports readFully()
RandomAccessFile in = new RandomAccessFile("myfile.dat","r");
in.seek(0L);

while (in.getFilePointer() < in.length())
{
    int readSize = (int)Math.min(1000000,in.length() - in.getFilePointer());
    final byte[] data = new byte[readSize];
    in.readFully(data);
    exec.execute(new Runnable() 
    {
        public void run() 
        {
            // do something with data
        }
    });
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读