Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中以更快的速度编程下载文件_Android_Download - Fatal编程技术网

如何在android中以更快的速度编程下载文件

如何在android中以更快的速度编程下载文件,android,download,Android,Download,Hi使用inputstream和cipheroutputstream(用于加密)以编程方式实现了文件下载。下载速度非常慢。然而,如果我尝试通过下载管理器下载,速度非常快。如何改进代码并提高文件的下载速度。下面是我的代码 private void saveFileUsingEncryption(String aMineType, long length) throws Exception { int bufferSize = 1024*4; //byte[] buffer =

Hi使用inputstream和cipheroutputstream(用于加密)以编程方式实现了文件下载。下载速度非常慢。然而,如果我尝试通过下载管理器下载,速度非常快。如何改进代码并提高文件的下载速度。下面是我的代码

 private void saveFileUsingEncryption(String aMineType, long length) throws Exception {

    int bufferSize = 1024*4;

    //byte[] buffer = new byte[1024];
    byte[] buffer = new byte[bufferSize];
    int bytesRead = 0;
    long totalRead = 0;

    FileOutputStream outStream = null;

    File f = new File(Constants.DWLPATH);
    if (!f.exists()) {
        f.mkdirs();
    }

    try {

        Cipher aes = Cipher.getInstance("ARC4");
        aes.init(Cipher.ENCRYPT_MODE,  new SecretKeySpec("mykey".getBytes(), "ARC4"));

        if(contDisp==null || contDisp.length()==0) {
            // downloadFileName = downloadFileName.replaceAll("[^a-zA-Z0-9_]+", "");
            downloadFileName = downloadFileName + "." + getFileExtension(aMineType);

        }

        outStream = new FileOutputStream(Constants.DWLPATH +  downloadFileName,true);
        CipherOutputStream out = new CipherOutputStream(outStream, aes);

        while ((bytesRead = inputStream.read(buffer, 0, bufferSize)) >= 0) {

            out.write(buffer, 0, bytesRead);

            try{
                // Adjust this value. It shouldn't be too small.
                Thread.sleep(50);
            }catch (InterruptedException e){
              TraceUtils.logException(e);
            }
            totalRead += bytesRead;
            sb=sb.append("\n Total bytes Read:"+totalRead);
            Log.e("--",sb.toString());
           /* if (this.length > 0) {
                Long[] progress = new Long[5];
                progress[0] = (long) ((double) totalRead / (double) this.length * 100.0);


                publishProgress(progress);
            }*/

            if (this.isCancelled()) {
                if (conn != null)
                    conn.disconnect();
                conn = null;
                break;
            }

        }
        Log.e("Download completed","success");
        out.flush();
        //Utils.putDownloadLogs(requestUrl,mimeType,length, downloadFileName,"Download is Successful",sb.toString(), context);
        outStream.close();


        buffer = null;


    } catch (Exception e) {
        TraceUtils.logException( e);

        file_newsize = storedFileSizeInDB + totalRead;
        if (totalFileSize == 0)
            totalFileSize = length;

        callback.onRequestInterrupted(file_newsize,totalFileSize);

        StringWriter errors = new StringWriter();
        e.printStackTrace(new PrintWriter(errors));
        // Utils.putDownloadLogs(requestUrl,mimeType,length,downloadFileName,"failure---" + errors.toString(),sb.toString(), context);


        throw e;

    } finally {
        if (outStream != null)
            outStream.close();
        outStream = null;
    }
}

您可以使用默认下载管理器下载文件,因为它非常容易实现,并提供更好的功能,如响应internet连接、提供在状态栏中添加通知的可访问性、,通过在下载管理器对象上运行查询,可以找到总字节和剩余字节,以便计算进度,下载完成后,点击通知可以执行所需的操作

还有很多图书馆可以用来实现这一点


本库为您提供暂停、下载、恢复下载、跟踪进度和取消下载功能


您还可以根据需要对其进行自定义。

以下是下载的
和EncryptFileTask.class
,可通过加密下载

public class DownloadAndEncryptFileTask extends AsyncTask<Void, Void, Void> {

private String mUrl;
private File mFile;
private Cipher mCipher;

InputStream inputStream;
FileOutputStream fileOutputStream;
CipherOutputStream cipherOutputStream;

public DownloadAndEncryptFileTask(String url, File file, Cipher cipher) {
    if (url == null || url.isEmpty()) {
        throw new IllegalArgumentException("You need to supply a url to a clear MP4 file to download and encrypt, or modify the code to use a local encrypted mp4");
    }
    mUrl = url;
    mFile = file;
    mCipher = cipher;
}

private void downloadAndEncrypt() throws Exception {

    URL url = new URL(mUrl);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    if (mFile.length() > 0) {
        connection.setRequestProperty("Range", "bytes=" + mFile.length() + "-");
    }
    connection.connect();

    Log.e("length", mFile.length() + "");


    if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
        throw new IOException("server error: " + connection.getResponseCode() + ", " + connection.getResponseMessage());
    }


    inputStream = connection.getInputStream();
    if (mFile.length() > 0) {
        //connection.connect();
        fileOutputStream = new FileOutputStream(mFile, true);

    } else {
        fileOutputStream = new FileOutputStream(mFile);
    }

    CipherOutputStream cipherOutputStream = new CipherOutputStream(fileOutputStream, mCipher);

    byte buffer[] = new byte[1024 * 1024];
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        Log.d(getClass().getCanonicalName(), "reading from http...");

        cipherOutputStream.write(buffer, 0, bytesRead);
    }

    inputStream.close();
    cipherOutputStream.close();
    connection.disconnect();
}

@Override
protected Void doInBackground(Void... params) {
    try {
        downloadAndEncrypt();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

@Override
protected void onPostExecute(Void aVoid) {
    Log.d(getClass().getCanonicalName(), "done");
}
}

我的要求是下载程序,而不是通过下载管理器。如果你可以提供任何改进我张贴的代码,这将是有帮助的,我知道这一切,并已使用。我唯一的要求是如何提高下载速度。
new DownloadAndEncryptFileTask(
    myFeedsModel.getVideo().getVideo360(),
    new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), myFeedsModel.getFile_name()),
    OBJECT OF YOUR CIPHER