拆分先前从文件中读取的字节数组

时间:2014-10-17 07:16:28

标签: java arrays file split

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

文件格式例如如下:

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数组将包含相同的内容,就好像我已经这样做了(这次包含文件1包含原始文件内容的前半部分,文件2包含其后半部分):

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

和file2是这样的:

word5 word6
word7 word8

你能帮我吗?

1 个答案:

答案 0 :(得分:3)

"字节"的概念和"线"不能很好地协同工作。

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

将包含整个文件的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排除上限。

对于奇数行,后半部分将包含额外元素。