如何使用java中的多个线程从文件的不同部分读取并且它是否有效?

时间:2016-03-24 18:41:15

标签: java multithreading nio java-io

我需要以有效的方式阅读文件。

我会读取文件,读取文件中的每个单词都会查看自定义词典并确定文件中单词的偏移量。

我为此提出了以下解决方案

制作人线程

从文件中逐行读取并将每行放入ConcurrentHashMap。

消费者线程

从地图中读取该行并查找单词的字典。

我非常确定实现消费者但不确定使用线程来读取文件会有所帮助。不确定使用java IO或java NIO

更新了用于从文件更新读取以映射生产者

的示例代码
public class DocumentManager {


    Map<Location, String> map = null;


    public DocumentManager(Map<Location, String> map) {
        this.map = map;
    }

    public void readFile(String path) throws IOException{
        BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(path)));

        String line = "";

        while((line = bufferedReader.readLine()) != null){
            map.put(new Location(0, 0), line);
            //location is dummy at the moment
        }
  }

}

2 个答案:

答案 0 :(得分:0)

您可以在每个线程中使用RandomAccessFile来读取文件的不同部分。 RandomAccessFile允许您从文件指针开始读取字节,并使文件指针超过读取的字节。

答案 1 :(得分:0)

使用线程不是免费的,并且通过阻塞队列在线程之间传递对象可能会非常昂贵。但是,更新Map虽然不是免费的,但比在线程之间传递工作要便宜得多。

您很可能会将大部分时间花在阅读和解析文件上。如果你有一个文本文件,使用多个线程很难做到这一点,甚至比仅仅在一个线程中读取它更加快速。