我有一个递归函数,它将一个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
你能帮我吗?
答案 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
排除上限。
对于奇数行,后半部分将包含额外元素。