java多线程写入csv
时间: 2023-06-30 22:19:58 浏览: 63
在Java中,可以使用多线程来并行写入CSV文件以提高写入效率。以下是一个简单的示例代码:
```java
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.opencsv.CSVWriter;
public class CSVWriterExample {
public static void main(String[] args) throws IOException {
String csvFile = "output.csv";
int numThreads = 4;
// 创建线程池
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
// 需要写入的数据
List<String[]> data = new ArrayList<>();
data.add(new String[] {"Name", "Age", "Gender"});
data.add(new String[] {"John", "25", "Male"});
data.add(new String[] {"Jane", "30", "Female"});
data.add(new String[] {"Bob", "35", "Male"});
data.add(new String[] {"Alice", "27", "Female"});
// 创建CSVWriter对象
CSVWriter writer = new CSVWriter(new FileWriter(csvFile));
// 将数据分配给不同的线程进行写入
int blockSize = data.size() / numThreads;
for (int i = 0; i < numThreads; i++) {
int startIndex = i * blockSize;
int endIndex = (i == numThreads - 1) ? data.size() : (i + 1) * blockSize;
List<String[]> blockData = data.subList(startIndex, endIndex);
Runnable task = new WriteTask(writer, blockData);
executor.execute(task);
}
// 关闭writer和线程池
writer.close();
executor.shutdown();
}
}
class WriteTask implements Runnable {
private CSVWriter writer;
private List<String[]> data;
public WriteTask(CSVWriter writer, List<String[]> data) {
this.writer = writer;
this.data = data;
}
@Override
public void run() {
// 写入数据
writer.writeAll(data);
}
}
```
在上面的示例中,我们使用了Java中的ExecutorService和Runnable接口来创建多个线程并行写入CSV文件。我们首先创建一个线程池,并指定线程池的大小。然后,我们将要写入的数据存储在一个List<String[]>中,该List将被分配给不同的线程进行写入。接下来,我们创建一个CSVWriter对象,并将其传递给每个线程的任务中。每个任务都是一个Runnable接口的实现类,它将分配给线程池进行执行。在任务的run()方法中,我们使用CSVWriter的writeAll()方法来写入数据。最后,我们关闭CSVWriter对象和线程池。
请注意,我们需要适当地分配数据块给不同的线程,以确保每个线程都写入了适当数量的数据。在上面的示例中,我们将数据均匀地分成了若干块,并将每个块分配给不同的线程。