java - 分割先前从文件中读取的字节数组

标签 java arrays file split

我有一个递归函数,它接受一个字节数组(从文件中读取)作为参数,然后尝试将其分成两部分以进行递归调用。

文件格式例如是这样的:

word1 word2
word3 word4
   ....
word97 word98
word99 word100

因此,要阅读它,我使用以下代码:

byte[] content = new byte[(int) file.length()];
FileInputStream fileInputStream = null;

fileInputStream = new FileInputStream(file);
fileInputStream.read(content);

但是我想将内容数组分成两部分,每部分代表原始文件的一半。例如,如果原始文件包含四行,则firstHalf数组将包含原始文件的前两行,secondHalf数组将包含原始文件的最后两行。

我用的是这个:

int halfTheLengthOfContent = (int) Math.ceil(content.length / 2.0);
firstHalf = Arrays.copyOfRange(content, 0, halfTheLengthOfContent)
and 

secondHalf = Arrays.copyOfRange(content, halfTheLengthOfContent + 1, content.length)

但它不起作用,因为生成的数组与我想要的不符。 我想要的是,firstHalf 数组将包含与我完成此操作相同的内容(这次 file1 包含原始文件内容的前半部分,file2 包含原始文件内容的后半部分):

byte[] firstHalf = new byte[(int) file1.length()];
FileInputStream fileInputStream = null;

fileInputStream = new FileInputStream(file1);
fileInputStream.read(firstHalf);

byte[] secondHalf = new byte[(int) file2.length()];
FileInputStream fileInputStream = null;

fileInputStream = new FileInputStream(file2);
fileInputStream.read(secondHalf);

例如,如果原始文件是这样的:

word1 word2
word3 word4
word5 word6
word7 word8

那么 file1 是:

word1 word2
word3 word4

文件2是这样的:

word5 word6
word7 word8

你能帮我一下吗?

最佳答案

“字节”和“行”的概念不能很好地结合在一起。

字节是文件的核心元素,每个字符可能有一个字节。可能有两个。

将包含整个文件的 byte[] 拆分为两个偶数部分不太可能导致拆分为两个包含相同行数的 byte[]。分割甚至不可能发生在换行符上,更有可能发生在单词的中间。

您需要的是按读取文件并对其进行操作。例如:

final List<String> lines = Files.readAllLines(Paths.get("path", "to", "file"));
final int middle = lines.size() / 2;
final List<String> firstHalf = lines.subList(0, middle);
final List<String> secondHalf = lines.subList(middle, lines.size());

如果文件有 4 行,则 middle 将为 2。前半部分将包含行 0, 1,后半部分将包含行 2, 3。请记住,List 是零索引的,而 sublist 不包括上限。

行数为奇数时,后半部分将包含额外的元素。

关于java - 分割先前从文件中读取的字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26419841/

相关文章:

java - 对于 Seam 中的 Quartz 作业,可以使用 JobStoreTX 而不是 JobStoreCMT 吗?

java - 静态变量设置为 null 可用于 GC?

java - 具有依赖关系(外键)的多个 DAO

c++ - 指针给出整个数组而不是C++ RayLib中的一个字符

python - 将 CSV 转换为 txt 并使用 Python 每 10 个值开始新行

c - 将文件中的内容添加到链表

Java 结束语

javascript - 为什么我的 for 循环返回正确答案,但我的 forEach 却没有?

C# 字节字符串到字节数组

c - 在c中将字节写入可执行文件