跳过文件的一部分

时间:2019-06-17 15:48:23

标签: java

我已经编写了一个代码,可以根据给定的大小获取在哪里分割文件的值。问题是当文件长度改变时,我在应该分割文件的位置得到了错误的值。

这是代码:(我不确定这是否是确定我应该在哪里分割文件的最快方法。)

long parts = 5L;
long len = 123456L;
long partLen = len / parts;
long tmp = 1L;
for (int i = 0; i < parts; i++) {
    tmp += partLen;
    long start = tmp - partLen;
    long end = tmp - 1L;
    System.out.printf("%d to %d\n", start, end);
}

这将输出:

1 to 24691
24692 to 49382
49383 to 74073
74074 to 98764
98765 to 123455  

这些值是字节。我将使用这些值来读取文件的一部分并将其写入。
例如读取1字节到24691字节,然后将其写入文件...

请注意,123455并非完全123456。如何添加剩余字节?
我应该使用什么来读取文件RandomAccessFile的{​​{1}} + seek()?或read(byte[] b)的{​​{1}}?

1 个答案:

答案 0 :(得分:0)

您看到的最后一个字节和长度之间的差异是余数。您正在执行整数数学运算,而len并没有完全分为几部分。以下结果均返回相同的partLen值

System.out.println(123455 / 5);
System.out.println(123456 / 5);
System.out.println(123457 / 5);
System.out.println(123458 / 5);
System.out.println(123459 / 5);

产生以下输出

24691
24691
24691
24691
24691

计算分区大小时,需要考虑到这一点。如果有剩余,则分区大小需要大1。如果没有余数,那么您当前的计算是正确的。

您可以使用RandomAccessFileBufferedInputStream,具体取决于您要如何处理分区。我个人的喜好是只打开一次BufferedInputStream并在读取分区长度后切换输出文件。但是使用RandomAccessFile分别处理每个分区并没有错。

进一步:

  1. 通常,您将使用基于0的索引来引用字节(并且确实,如果您使用的是RandomAccessFile.seek(),则期望以0而不是1开头的查找位置),因此请初始化tmp变量为0。

  2. 我确定您知道,但是最后一个分区必须是end和len的最小值(如果更改为基于0的索引,则为len-1)。