第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

復(fù)制的文檔文件與原始文檔文件的大小和哈希值不同

復(fù)制的文檔文件與原始文檔文件的大小和哈希值不同

拉丁的傳說(shuō) 2023-09-27 14:49:06
我正在嘗試在 Android 應(yīng)用程序中復(fù)制/復(fù)制 DocumentFile,但在檢查創(chuàng)建的副本時(shí),它似乎與原始文件并不完全相同(這導(dǎo)致了問(wèn)題,因?yàn)槲倚枰獙?duì)文件進(jìn)行 MD5 檢查)下次調(diào)用副本時(shí)這兩個(gè)文件,以避免覆蓋相同的文件)。流程如下:用戶從 ACTION_OPEN_DOCUMENT_TREE 選擇文件獲取源文件類型目標(biāo)位置的新文檔文件已初始化第一個(gè)文件的內(nèi)容復(fù)制到第二個(gè)文件中初始階段通過(guò)以下代碼完成:// Get the source file's typeString sourceFileType = MimeTypeMap.getSingleton().getExtensionFromMimeType(contextRef.getContentResolver().getType(file.getUri()));// Create the new (empty) fileDocumentFile newFile = targetLocation.createFile(sourceFileType, file.getName());// Copy the fileCopyBufferedFile(new BufferedInputStream(contextRef.getContentResolver().openInputStream(file.getUri())), new BufferedOutputStream(contextRef.getContentResolver().openOutputStream(newFile.getUri())));主要復(fù)制過(guò)程是使用以下代碼片段完成的:    void CopyBufferedFile(BufferedInputStream bufferedInputStream, BufferedOutputStream bufferedOutputStream)    {        // Duplicate the contents of the temporary local File to the DocumentFile        try        {            byte[] buf = new byte[1024];            bufferedInputStream.read(buf);            do            {                bufferedOutputStream.write(buf);            }            while(bufferedInputStream.read(buf) != -1);        }        catch (IOException e)        {            e.printStackTrace();        }        finally        {            try            {                if (bufferedInputStream != null) bufferedInputStream.close();                if (bufferedOutputStream != null) bufferedOutputStream.close();            }            catch (IOException e)            {                e.printStackTrace();            }        }    }我面臨的問(wèn)題是,雖然文件復(fù)制成功并且可用(它是一張貓的圖片,并且在目的地仍然是一張貓的圖片),但它略有不同。文件大小已從 2261840 更改為 2262016 (+176)MD5 哈希值已完全改變我的復(fù)制代碼是否有問(wèn)題導(dǎo)致文件略有更改?提前致謝。
查看完整描述

1 回答

?
狐的傳說(shuō)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊

您復(fù)制的代碼不正確。它假設(shè)(錯(cuò)誤地)每次調(diào)用read都會(huì)返回buffer.lengthbytes 或 return -1。


您應(yīng)該做的是捕獲每次在變量中讀取的字節(jié)數(shù),然后準(zhǔn)確寫(xiě)入該字節(jié)數(shù)。您用于關(guān)閉流的代碼很冗長(zhǎng)并且(理論上1)也有錯(cuò)誤。


這是解決這兩個(gè)問(wèn)題以及其他一些問(wèn)題的重寫(xiě)。


void copyBufferedFile(BufferedInputStream bufferedInputStream,

? ? ? ? ? ? ? ? ? ? ? BufferedOutputStream bufferedOutputStream)

? ? ? ? ?throws IOException?

{

? ? try (BufferedInputStream in = bufferedInputStream;

? ? ? ? ?BufferedOutputStream out = bufferedOutputStream)?

? ? {

? ? ? ? byte[] buf = new byte[1024];

? ? ? ? int nosRead;

? ? ? ? while ((nosRead = in.read(buf)) != -1)? // read this carefully ...

? ? ? ? {

? ? ? ? ? ? out.write(buf, 0, nosRead);

? ? ? ? }

? ? }

}

正如您所看到的,我已經(jīng)擺脫了虛假的“捕獲和擠壓異常”處理程序,并使用 Java 7+?try with resources修復(fù)了資源泄漏。

仍然存在幾個(gè)問(wèn)題:

  1. 復(fù)制函數(shù)最好將文件名字符串(或File對(duì)象Path)作為參數(shù)并負(fù)責(zé)打開(kāi)流。

  2. 鑒于您正在執(zhí)行塊讀取和寫(xiě)入,因此使用緩沖流沒(méi)有什么價(jià)值。(事實(shí)上,它可能會(huì)使 I/O 變慢。)最好使用普通流并使緩沖區(qū)的大小與類使用的默認(rèn)緩沖區(qū)大小相同或Buffered*更大。

1 - 理論上,如果拋出bufferedInputStream.close()異常,bufferedOutputStream.close()調(diào)用將被跳過(guò)。實(shí)際上,關(guān)閉輸入流不太可能引發(fā)異常。但無(wú)論哪種方式,嘗試資源方法都會(huì)正確且更加簡(jiǎn)潔地處理這個(gè)問(wèn)題。


查看完整回答
反對(duì) 回復(fù) 2023-09-27
  • 1 回答
  • 0 關(guān)注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)