Android 根據文件路徑base64字符串和文件互相轉換

android 本地存文件,通過base64轉碼文件存儲到本地

  1. 根據版本獲取文件管理目錄 API 29之后需要按下方的方法獲取文件路徑
    public static String getSDPath(Context context){
        String path = "";
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.Q){
            path =context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS).toString() + "/intelligentKit";
        }else{
            path = Environment.getExternalStorageDirectory().toString() + "/intelligentKit";
        }
        return path;
    }

2.Base64字符串轉文件
先通過BASE64Decoder 將base64字符串解碼轉為字節(jié)數組,在通過字節(jié)流將字節(jié)數組寫入文件中,通過bytes.length 屬性可查看base64字符串轉字節(jié)是否有缺失,比對文件大小查看是否一樣

//Base64字符串轉為文件谓厘,base64為字符串,filaName為保存的文件名稱,savePath為保存路徑
//import sun.misc.BASE64Decoder;
//import sun.misc.BASE64Encoder;
    public static void base64ToFile(String base64, String fileName, String savePath) {
        //前臺在用Ajax傳base64值的時候會把base64中的+換成空格,所以需要替換回來。
        //有的后臺傳的數據還有image:content..., 轉換的時候都需要替換掉,轉換之前盡量把base64字符串檢查一遍
        base64 = base64.replaceAll(" ", "+");

        File file = null;
        //創(chuàng)建文件目錄
        String filePath = savePath;
        File dir = new File(filePath);
        if (!dir.exists()) {
            boolean a = dir.mkdirs();
            Log.d(TAG, "base64ToFile: 文件不存在,創(chuàng)建"+a);
        }
        BASE64Decoder decoder = new BASE64Decoder();
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        java.io.FileOutputStream fos = null;
        try {
            byte[] bytes = decoder.decodeBuffer(base64);//base64編碼內容轉換為字節(jié)數組
            ByteArrayInputStream byteInputStream = new ByteArrayInputStream(bytes);
            bis = new BufferedInputStream(byteInputStream);
            Log.d(TAG, "base64ToFile: ${bytes}=="+bytes.length);

            file= new File(filePath +"/"+ fileName);
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);

            byte[] buffer = new byte[1024];
            int length = bis.read(buffer);
            while(length != -1){
                bos.write(buffer, 0, length);
                length = bis.read(buffer);
            }
            bos.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

3.將文件轉為Base64字符串
這個沒什么可說的,跟上面的流程相反,通過字節(jié)流讀文件,然后將讀出的字節(jié)數組通過BASE64Encoder 編碼

public static String PDFToBase64(File file) {
        BASE64Encoder encoder = new BASE64Encoder();
        FileInputStream fin =null;
        BufferedInputStream bin =null;
        ByteArrayOutputStream baos = null;
        BufferedOutputStream bout =null;
        try {
            fin = new FileInputStream(file);
            bin = new BufferedInputStream(fin);
            baos = new ByteArrayOutputStream();
            bout = new BufferedOutputStream(baos);
            byte[] buffer = new byte[1024];
            int len = bin.read(buffer);
            while(len != -1){
                bout.write(buffer, 0, len);
                len = bin.read(buffer);
            }
            //刷新此輸出流并強制寫出所有緩沖的輸出字節(jié)
            bout.flush();
            byte[] bytes = baos.toByteArray();
            return encoder.encodeBuffer(bytes).trim();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                fin.close();
                bin.close();
                bout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谷市,隨后出現(xiàn)的幾起案子蛋哭,更是在濱河造成了極大的恐慌运沦,老刑警劉巖泵额,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異携添,居然都是意外死亡嫁盲,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門烈掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羞秤,“玉大人,你說我怎么就攤上這事向叉∽赌澹” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵母谎,是天一觀的道長瘦黑。 經常有香客問我,道長奇唤,這世上最難降的妖魔是什么幸斥? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮咬扇,結果婚禮上甲葬,老公的妹妹穿的比我還像新娘。我一直安慰自己懈贺,他們只是感情好经窖,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梭灿,像睡著了一般画侣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堡妒,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天配乱,我揣著相機與錄音,去河邊找鬼皮迟。 笑死搬泥,一個胖子當著我的面吹牛,可吹牛的內容都是我干的伏尼。 我是一名探鬼主播忿檩,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爆阶!你這毒婦竟也來了燥透?” 一聲冷哼從身側響起代赁,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兽掰,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體徒役,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡孽尽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忧勿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杉女。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鸳吸,靈堂內的尸體忽然破棺而出熏挎,到底是詐尸還是另有隱情,我是刑警寧澤晌砾,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布坎拐,位于F島的核電站,受9級特大地震影響养匈,放射性物質發(fā)生泄漏哼勇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一呕乎、第九天 我趴在偏房一處隱蔽的房頂上張望积担。 院中可真熱鬧,春花似錦猬仁、人聲如沸帝璧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽的烁。三九已至,卻和暖如春叭爱,著一層夾襖步出監(jiān)牢的瞬間撮躁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工买雾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留把曼,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓漓穿,卻偏偏與公主長得像嗤军,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晃危,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容

  • 大家早上好叙赚! 由于心里承受能力差老客,需要住院治療! 精神分裂癥郁郁一發(fā)作好折磨人震叮,一整個晚上睡不著胧砰,還害怕焦慮緊張,...
    a888e55ebc58閱讀 85評論 0 0
  • 慶幸的是苇瓣,我己經堅持了一個月了尉间,早起的感覺真好。 但還是不能完全做到早睡击罪,導致經常不能按時起來哲嘲,本來計劃5點多,這...
    文字先生閱讀 85評論 0 0
  • 背景 使用git push命令上傳代碼到倉庫時媳禁,因為項目中有10M的模型文件眠副,最后出現(xiàn)如下錯誤: 根據錯誤信息應該...
    頸椎以上癱瘓閱讀 774評論 0 0
  • 我早知這世間萬物實在難及你分毫, 你就該端坐高堂上竣稽, 不要染塵埃囱怕, 所以我借起千江明月, 萬古詞賦毫别, 于微薄的雪色...
    完顏茉閱讀 489評論 0 3
  • 時光過得太快光涂,喜歡的留不住,想要的太遙遠拧烦。六月的風忘闻,七月的雨,來得匆匆恋博,消失地無影無蹤齐佳。
    浮生若夢ldx閱讀 30評論 0 0