我不明白对我的代码比较文件字节内容的批评。爪哇

问题描述 投票:0回答:1

前几天我要求对下面的代码进行一些审查。我正在编写代码来比较怀疑相同的文件的字节内容;它应该适用于任何文件类型和任何文件大小的文件。 这张图展示了一个人对此的批评的一部分。我需要一些帮助来理解这个特殊的批评,因为我根本不理解它,我无法诚实地理解它的头或尾:一方面,我什至无法判断缩进部分是否小标题为“3”应该通向其余部分——如果是的话,为什么其余部分没有类似地缩进呢?他们似乎认为使用

read(byte[])
是错误的做法,但我根本无法理解他们的推理;我不知道为什么他们谈论
read(byte[])
返回一个值,当我认为该方法只是将字节从
BufferedInputStream
传输到
byte[]
时,我不会想到它会返回任何内容否则——;我不知道他们从哪里获取
int len1
int len2
变量,我根本看不出它们与相关代码有何关系。

需要明确的是,我并不是要求对此处给定的代码进行审查,它还没有准备好。我只是要求对此人的批评做出解释,以便我能够理解他们认为其中的错误。

我还没有决定使用什么作为 While 循环的中断条件;为此我可以考虑几种不同的选择。我并不是在这里寻求这部分的帮助 - 我只是为了清楚起见指出它。

我也知道有现有的方法可用于比较文件的字节内容,我不需要任何帮助。

bin_1 = new BufferedInputStream(file_input_stream_1); 
bin_2 = new BufferedInputStream(file_input_stream_2);

byte[] barr_1 = new byte[8192];
byte[] barr_2 = new byte[8192]; 

while(/*enter break-condition of your choice*/){

    bin_1.read(barr_1); bin_2.read(barr_2);

    if(Arrays.equals(barr_1, barr_2) == false){
        break;
    }

    else{
        /*Byte-Arrays are Re-Assigned to ensure that no bytes from the previous loop 
          carry-over.*/
        barr_1 = new byte[8192]; 
        barr_2 = new byte[8192];
        continue;

    }
    
}
java arrays byte bufferedinputstream
1个回答
0
投票

我不知道他们为什么谈论

read(byte[])
返回一个值,当我认为该方法只是将字节从
BufferedInputStream
传输到
byte[]
时,我不会想到它会返回任何东西否则的话——

当对某个方法的作用有疑问时,请检查其描述。 Java API 中的每个公共方法都有一个,如果将鼠标悬停在方法调用上,每个像样的 Java 开发环境都会显示它。在这里这样做给出了以下描述:

从输入流中读取一定数量的字节并将它们存储到缓冲区数组 b 中。实际读取的字节数以整数形式返回。此方法会阻塞,直到输入数据可用、检测到文件结尾或引发异常。

如果b的长度为零,则不读取字节,返回0;否则,将尝试读取至少一个字节。如果由于流位于文件末尾而没有可用字节,则返回值 -1;否则,至少读取一个字节并将其存储到 b 中。

读取的第一个字节存储到元素 b[0] 中,下一个字节存储到 b[1] 中,依此类推。读取的字节数最多等于b的长度。令k为实际读取的字节数;这些字节将存储在元素 b[0] 到 b[k-1] 中,元素 b[k] 到 b[b.length-1] 不受影响。

也就是说,您的审阅者是正确的,

read(byte[])
可能会自行判断读取的字节数少于数组的长度。由于我们不知道两次读取的读取距离相等,因此即使文件相同,数组也可能看起来不同。

您的审阅者建议使用

readNBytes(int)
代替。它的描述是:

从输入流中读取最多指定数量的字节。此方法会阻塞,直到读取了请求的字节数、检测到流结束或引发异常为止。

也就是说,此方法承诺始终读取指定限制或文件长度允许的范围。它不会自行决定读取的内容少于该值。也就是说,如果我们用这种方法读取两个文件,只有文件不同时数组才会不同。

(旧方法读取的字节数可能少于请求的字节数的原因是性能优化,而现在这几乎无关紧要,至少在从文件读取时)

© www.soinside.com 2019 - 2024. All rights reserved.