我有一个递归函数,它接受一个字节数组(从文件中读取)作为参数,然后尝试将其分成两部分以进行递归调用。
文件格式例如是这样的:
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/