Java Android读取大文件崩溃应用程序

Java Android读取大文件崩溃应用程序,java,android,io,md5,java-io,Java,Android,Io,Md5,Java Io,您好,正如您在下面看到的,我正在尝试制作一个(android)应用程序来检查文件的md5散列 此代码仅适用于小文件 有人能帮我吗 final TextView informations = (TextView) findViewById(R.id.Informations); final EditText input = (EditText) findViewById(R.id.ToCrack); String filepath = data.ge

您好,正如您在下面看到的,我正在尝试制作一个(android)应用程序来检查文件的md5散列 此代码仅适用于小文件 有人能帮我吗

final TextView informations = (TextView) findViewById(R.id.Informations);
            final EditText input = (EditText) findViewById(R.id.ToCrack);
            String filepath = data.getDataString();
            String rawtext;
            String hash;
            StringBuilder text = new StringBuilder();
            filepath = filepath.split("//")[1];
            File file = new File(filepath);
            Toast.makeText(getApplicationContext(),"Loading: "+filepath,Toast.LENGTH_LONG).show();
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            DataInputStream dis = null;
            try{
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                dis = new DataInputStream(bis);
                while (dis.available() != 0){
                    text.append(dis.readLine()+"\n");
                }
            }
            catch (IOException e){
                e.printStackTrace();
            }
            finally {
                try{
                    fis.close();
                    bis.close();
                    dis.close();
                }
                catch (IOException ex){
                    ex.printStackTrace();
                }
            }
            rawtext = text.toString().substring(0, text.length()-1);
            hash = new MD5(rawtext).hexdigest();
            if (hash.equals(input.getText().toString())){
                informations.setText("Hash correspond with the file!");
            }
            else{
                informations.setText("File hash= "+hash+"\nHashes does not correspond :(");
            }
            Toast.makeText(getApplicationContext(),"Copied file hash to clipboard.",Toast.LENGTH_LONG).show();

Android等移动设备环境对应用程序可以消耗的内存量有限制。因此,像在代码中那样(使用
StringBuffer
)将大文件读取到内存中的数据存储将抛出OutOfMemory错误


查看以了解如何克服此问题。

您是否尝试过使用AsyncTask在后台线程中读取文件?我没有尝试过,但此代码会直接使应用程序崩溃,因此我想它不会工作编辑您的问题并包括堆栈跟踪。请删除
available()
测试。当((line=in.readLine())!=null)时,您的代码将与
的工作方式相同。
available()
的正确用法很少,这不是其中之一。我发现这很有趣,因为在android上使用python sl4a,我能够非常轻松、快速地计算md5和其他内容,而不会发生任何崩溃,谷歌花更多的时间为用户界面和其他东西制作api,而不是简化应用程序的“背景”,比如只打开一个文件……我不熟悉sl4a,我猜它是在本地应用程序流程中运行的。我想指出,SDK(而不是NDK)中编写的每个应用程序都在自己的Dalvik VM中运行。