首页 > 试题广场 >

请仔细阅读下面代码,其中 MDSinputStream 继承

[问答题]

请仔细阅读下面代码,其中 MDSinputStream 继承自 java.io.BufferedInputStream 类; showProcess ()是该类的私有函数,用于计算进度: MD5.asHex() 是一个公共函数,用于将 MD5 计算结果转换为可显示的字符串。


private String computeMD5(FILE file) throws IOException {
    int buf_size = 65536;
    byte[] buf = new byte[buf_size];
    MD5InputStream close_me = null;
    try{
        close_me = new MD5InputStream new(File InputStream(file));
        int completed = 0;while ((completed = close_me.read(buf)) != -1) {
            this.showProcess(completed);     
        }
        String result = MD5.asHex(in.hash());
        close_me.close();
        close_me = null;
        return result;
   }catch (IOException e) {
        throw e;
   }
}
请指出上述代码最关键的问题,并改正:
第一,方法已经抛出异常了,所以不需要异常处理,其次如果出现异常,方法将没有返回值,必定错误。 第二,close_me = new MD5InputStream new(File InputStream(file));很明显的错误,改为close_me = new MD5InputStream(new FileInputStream(file)); 第三,既然流已经关闭,那么close_me = null;也就多于了。 最后,还没找到其他错误,in.hash()感觉怪怪的。
编辑于 2017-08-30 11:15:12 回复(0)
我觉得是关闭流需要在finally中,不然如果try语句里的捕获异常以后就关不了了。
发表于 2017-08-25 16:24:47 回复(0)
应该另起一个局部变量tmp,用来保存每次读取的字节数,然后传入tmp+completed给showProcess。

以前学Python时,在终端上写过进度条这样的小程序,意思是每隔1秒或几秒秒更新进度,显然每次传入的应该是变化了。
length = int(flag)
widgets = ['Progress: ', progressbar.Percentage(),' ',progressbar.Bar(marker='#', left='[', right=']'),' ', progressbar.ETA(), ' ', progressbar.FileTransferSpeed()]
pbar = progressbar.ProgressBar(widgets=widgets, maxval=length).start()

还有一点就是,它的时间间隔在哪?内存读取很快的?

另外,如果文件很大,超过INT的范围,有怎么办,这个函数的只适合计算小文件的MD5.
发表于 2017-08-27 17:32:47 回复(0)

我特意在eclipse里试了一下,居然没问题,代码精简了许多留下关键的,我先说一下我的版本java1.8.0,Eclipse Java EE IDE for Web Developers. Version: Neon.3 Release (4.6.3)。

private String computeMD5(File file) throws IOException  {
        String result = "cs";
        try {
            InputStream is = new FileInputStream(file);
            return result;
        } catch (IOException e) {
            throw e;
        }
    }

下面的代码反而会出问题,一般的括号不支持必须加return

private String computeMD52(File file) throws IOException  {
        String result = "cs";
        for(int i=0;i<10;i++){
            return "for";
        }

    }
编辑于 2017-08-24 11:15:44 回复(8)
感觉应该是buf.hash()才对?in是从哪冒出来的,buf根本就没有处理然后就又被覆盖了吧
发表于 2017-08-31 12:19:16 回复(0)
个人观点,并非正确答案,希望大家帮忙纠正,1,showprocess方法是这个类的父类私有方法,子类是无法调用父类的私有方法的。2,像楼上说的,return被try包起来了,无法执行。
发表于 2017-08-22 23:22:57 回复(2)
答案是返回结果的问题,有两种理解思路,一是因为现在的返回结果被try包围,所以上层无法识别里面的结果,就和局部变量的范围是一样的,另一种思路是,因为这是在try块中代表的是有可能发生异常,而发生异常以后代码不会执行,所以无法到返回语句,则造成无法返回的问题,所以这个返回结果必须放在方法体的最后一句才能正常的编译。
发表于 2017-02-11 22:52:24 回复(0)