gpt4 book ai didi

Java - 按 block 读取文本文件

转载 作者:行者123 更新时间:2023-12-03 22:52:47 24 4
gpt4 key购买 nike

我想读取不同 block 中的日志文件,使其成为多线程。该应用程序将在具有多个硬盘的服务器端环境中运行。读入 block 后,应用程序将处理每个 block 的每一行。

我已经使用 bufferedreader 完成了对每个文件行的读取,我可以结合使用 RandomAccessFile 和 MappedByteBuffer 对我的文件进行分块,但是将这两者结合起来并不容易。

问题是 block 只是切入了我的 block 的最后一行。我从来没有完整的 block 的最后一行,所以处理最后一行日志是不可能的。我正在尝试找到一种方法,根据行尾将我的文件切割成可变长度的 block 。

有没有人有这样做的代码?

最佳答案

在开始处理 block 之前,您可以在文件中找到位于行边界的偏移量。通过将文件大小除以 block 数从偏移量开始,然后查找直到找到行边界。然后将这些偏移量输入您的多线程文件处理器。这是一个完整的示例,它使用可用处理器的数量作为 block 的数量:

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ReadFileByChunks {
public static void main(String[] args) throws IOException {
int chunks = Runtime.getRuntime().availableProcessors();
long[] offsets = new long[chunks];
File file = new File("your.file");

// determine line boundaries for number of chunks
RandomAccessFile raf = new RandomAccessFile(file, "r");
for (int i = 1; i < chunks; i++) {
raf.seek(i * file.length() / chunks);

while (true) {
int read = raf.read();
if (read == '\n' || read == -1) {
break;
}
}

offsets[i] = raf.getFilePointer();
}
raf.close();

// process each chunk using a thread for each one
ExecutorService service = Executors.newFixedThreadPool(chunks);
for (int i = 0; i < chunks; i++) {
long start = offsets[i];
long end = i < chunks - 1 ? offsets[i + 1] : file.length();
service.execute(new FileProcessor(file, start, end));
}
service.shutdown();
}

static class FileProcessor implements Runnable {
private final File file;
private final long start;
private final long end;

public FileProcessor(File file, long start, long end) {
this.file = file;
this.start = start;
this.end = end;
}

public void run() {
try {
RandomAccessFile raf = new RandomAccessFile(file, "r");
raf.seek(start);

while (raf.getFilePointer() < end) {
String line = raf.readLine();
if (line == null) {
continue;
}

// do what you need per line here
System.out.println(line);
}

raf.close();
} catch (IOException e) {
// deal with exception
}
}
}
}

关于Java - 按 block 读取文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5510979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com