2013-02-24 47 views
0

我有一段代码。有没有办法将文件的1/4写入字符串缓冲区?

File file = new File(path); 
FileReader fr = new FileReader(file); 
BufferedReader br = new BufferedReader(fr); 
String temp; 
StringBuffer sb=new StringBuffer(); 
while((temp=br.readLine())!=null){   
    sb.append(temp); 
    sb.append(" "); 
} 

这将读取文件的每一行并将其存储在StringBuffer中。我的文件非常庞大,我有一个多线程的需求,以便处理速度更快。 有没有办法说像我只想要将文件的1/4写入缓冲区?

我知道我不能说这个。但我想要的东西等同于此。

for(int i=0; i<reader.length/4; i++) 
+0

我不认为你可以,但如果你知道提前四分之一的时间,你可以停止阅读。 – Dukeling 2013-02-24 00:18:59

+0

你的处理究竟涉及什么? (你在使用'StringBuffer'后对数据做了什么?)? – cheeken 2013-02-24 00:20:51

+1

你是什么意思与“相当巨大”?该文件是否总是适合内存,或者它是如此巨大,你必须以这种方式避免OutOfMemoryException? – 2013-02-24 00:24:27

回答

0

不,你不能得到解决这个问题,因为你不能读取文件同时,如果只有一个线程在同一时间流中读取数据,这会同时发生,也没有并行。所以没有任何好处,除此之外,你将有一个更难以编写和读取的代码,以及很多线程上下文切换和线程仲裁,这些并不便宜。

你可以做的是不写一个大文件,写更多的小文件,如果读数据的处理很耗时,读一个缓冲区,然后在缓冲区加载到内存中并行处理它,这将工作得很好。

此外,如果您使用单个线程,请使用StringBuilder而不是StringBuffer。

希望这会有所帮助。

+0

我正在四核运行这个。排除制造基板时的功率效率因素,我认为并行编程是具有多个内核的目的之一。如果我错了,请纠正我。 – Prasanna 2013-02-24 00:35:27

1

您应该能够为每个线程创建1 file channel,并通过该文件在偏移处使用该线程。从文件通道中,您可以获取文件的大小以计算分割并设置其当前位置。

相关问题