【发布时间】:2013-07-29 14:59:58
【问题描述】:
我正在尝试开发一个多线程 Java 程序,用于将大文本文件拆分为较小的文本文件。创建的较小文件必须具有前缀行数。 例如: 如果输入文件的行数是 100 并且输入的数量是 10,我的程序的结果是把输入文件分成 10 个文件。 我已经开发了我的程序的单线程版本:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class TextFileSingleThreaded {
public static void main(String[] args) {
if (args.length != 2) {
System.out.println("Invalid Input!");
}
//first argument is the file path
File file = new File(args[0]);
//second argument is the number of lines per chunk
//In particular the smaller files will have numLinesPerChunk lines
int numLinesPerChunk = Integer.parseInt(args[1]);
BufferedReader reader = null;
PrintWriter writer = null;
try {
reader = new BufferedReader(new FileReader(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
String line;
long start = System.currentTimeMillis();
try {
line = reader.readLine();
for (int i = 1; line != null; i++) {
writer = new PrintWriter(new FileWriter(args[0] + "_part" + i + ".txt"));
for (int j = 0; j < numLinesPerChunk && line != null; j++) {
writer.println(line);
line = reader.readLine();
}
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
writer.close();
long end = System.currentTimeMillis();
System.out.println("Taken time[sec]:");
System.out.println((end - start) / 1000);
}
}
我想编写这个程序的多线程版本,但我不知道如何从指定行开始读取文件。请帮帮我。 :(
【问题讨论】:
-
如果有任何问题,我怀疑您的应用程序的多线程版本是否会运行得更快,因为您很可能受 IO 限制。如果您运行您的程序并且它使用的处理器显着少于 100%,那么添加更多线程很可能只会给您带来适度的速度提升(如果有的话)。仅供参考。
-
你为什么要这样做?如果是为了性能,你应该知道一个线程更简单,通常也更快。要确定一行的开始位置,您需要阅读上一行,这意味着它基本上是一个单线程进程。
-
@Gray,我想如果程序从一个 HDD 读取并写入另一个 HDD,那么实际上具有生产者/消费者模式会加快速度。如果进程正在读取和写入同一个 HDD,那么单个线程几乎肯定会更快,因为多个线程会导致硬盘抖动。
-
没错,我必须证明在这种情况下多线程会导致垃圾。
-
但首先我必须编写一个使用多线程的程序进行实验,并且我还需要了解这种方法的优缺点。如果我有更多 HDD 或分布式文件系统多线程工作良好
标签: java multithreading file-io split