如何在没有被阻止的情况下以块的形式读取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 } }); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |