Android 回車換行的持久化

問題發現:從後臺獲取文字信息的時候,經過抓包發現含有\r\n換行符,顯示在TextView上可以正確的換行,可是經過以下方法將String寫進File,再次使用的時候從File中讀取的時候會發現再也不有換行效果。java

寫文件方法數組

public static void saveJson(String fileName, String info) {
    try {
        FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        BufferedWriter bw = new BufferedWriter(osw);
        bw.write(info);
        bw.flush();
        bw.close();
        osw.close();
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
複製代碼

讀文件方法緩存

public static String getJson(String fileName) {
    String info = null;
    try {
        FileInputStream fis = context.openFileInput(fileName);
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader br = new BufferedReader(isr);
        String Line;
        StringBuffer info2 = new StringBuffer();
        while ((Line = br.readLine()) != null) {
            info2.append(Line);
        }
        info = info2.toString();
        br.close();
        isr.close();
        fis.close();

    } catch (Exception e) {
        LogSwitchUtils.logD(FileUtils2.class, "緩存的異常爲:" + e);
        return null;
    }
    return info;
}
複製代碼

經過分析,是由於FileOutputStream、OutputStreamWriter、BufferedWriter等一些流在處理這些轉義字符的時候沒有將其寫入,或者是FileInputStream、InputStreamReader、BufferedReader等沒有將其讀出。PS:應惡補這些知識。app

問題解決dom

方法1:依然使用上述兩個Method,不過在調用以前先對目標String進行編碼/解碼,如URLEncoder.encode(schoolDesc)URLDecoder.decode(schoolDescTemp)編碼

方法2:將帶有特殊字符的String寫進SharedPreferences,使用的時候讀出;spa

方法3:使用字節流進行處理,可是該方法有一個不足之處,見讀文件方法的註釋。方法以下;指針

寫文件方法code

public static void saveStringToFileByByte(Context context, String fileName, String info) {
    try {
        FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
        byte[] buf = info.getBytes();
        fos.write(buf);
        fos.close();
    } catch (Exception e) {
        LogSwitchUtils.logE(FileUtils2.class, "fos寫緩存時候的異常爲:" + e);
        e.printStackTrace();
    }
}
複製代碼

讀文件方法對象

public static String getStringFromFileByByte(Context context, String fileName) {
    String result = null;
    StringBuffer sb = new StringBuffer();
    File file = new File(context.getFilesDir().getAbsolutePath() +"/"+ fileName);
    if (!file.exists()) {
        return result;
    }
    try {
        FileInputStream fis = new FileInputStream(file);
        byte[] buf = new byte[1024 * 2];//數組的容量不容易肯定,若是給的太大,浪費內容;給的過小,在new String的時候將會發生亂碼,所以該方法適用於長度固定的String的File寫入及讀出
        while (fis.read(buf) > 0) {
            sb.append(new String(buf));
        }
        result = sb.toString();
        fis.close();
    } catch (Exception e) {
        LogSwitchUtils.logE(FileUtils2.class, "fis寫緩存時候的異常爲:" + e);
        e.printStackTrace();
    }
    return result;
}
複製代碼

方法4:使用RandomAccessFile進行讀寫,方法以下:

寫文件方法

public static void saveFileByRaf(Context context, String fileName, String info) {
    File path = new File(context.getFilesDir().getAbsolutePath() + "/baike_detail");
    if (!path.exists()) {
        path.mkdir();
    }
    File file = new File(path, fileName);
    if (file.exists()) {
        file.delete();
    }
    try {
        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        raf.writeUTF(info);
    } catch (Exception e) {
        LogSwitchUtils.logE(FileUtils2.class, "寫緩存時候的異常爲:" + e);
        e.printStackTrace();
    }
}
複製代碼

讀文件方法

public static String getFileByRaf(Context context, String fileName) {
    String result = null;
    File path = new File(context.getFilesDir().getAbsolutePath() + "/baike_detail");
    if (!path.exists()) {
        return result;
    };
    File file = new File(path, fileName);
    if (!file.exists()) {
        return result;
    }
    try {
        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        result = raf.readUTF();
    } catch (Exception e) {
        LogSwitchUtils.logE(FileUtils2.class, "讀緩存時候的異常爲:" + e);
        e.printStackTrace();
    }
    return result;
}
複製代碼

Java的IO流

##File

File類是java.io包下表明與平臺無關的文件和目錄,即無論是文件仍是目錄都是使用File來操做的,File能新建、刪除、重命名文件和目錄,但不能訪問文件內容自己。

訪問文件名相關的方法

  1. String getName():返回此File對象所表示的文件名或路徑名(若是是路徑,則返回最後一級子路徑名)
  2. String getPath():返回此File對象所對應的路徑名
  3. File getAbsoluteFile():返回此File對象的絕對路徑(File形式)
  4. String getAbsolutePath():返回此File對象所對應的絕對路徑(String形式)
  5. String getParent():返回此File對象所對應的父目錄名
  6. boolean renameTo(File newName):重命名此File對象所對應的文件或目錄,若成功則返回true

文件檢測相關的方法

  1. boolean exists():判斷File對象所對應的文件或目錄是否存在
  2. boolean canWrite():判斷File對象所對應的文件或目錄是否可寫
  3. boolean canRead():判斷File對象所對應的文件或目錄是否可讀
  4. boolean isFile():判斷File對象所對應的是不是文件,而不是目錄
  5. Boolean isDirectory():判斷File對象所對應的是不是目錄,而不是文件
  6. boolean isAbsolute():判斷File對象所對應的文件或目錄是不是絕對路徑

獲取常規文件信息

  1. long lastModified():返回文件的最後修改時間
  2. long length():返回文件內容的長度

文件操做相關的方法

  1. boolean createNewFile():當此File對象所對應的文件不存在時,該方法將新建一個該File對象所指定的新文件,若是建立成功則返回true,不然返回false
  2. boolean delete():刪除File對象所對應的文件或路徑
  3. void deleteOnExit():註冊一個刪除鉤子,指定當Java虛擬機退出時,刪除File對象所對應的文件和目錄。
  4. static File createTempFile(String prefix,String suffix)
  5. static File createTempFile(STring prefix,STring suffix,File directory):建立臨時文件

目錄操做相關方法

  1. boolean mkdir():視圖建立一個File對象(目錄而非文件)所對應的目錄
  2. String[] list():列出File對象的全部子文件名和路徑名
  3. File[] listFiles():列出File對象全部子文件和路徑
  4. static File[] listRoots():列出系統的全部的根路徑

##IO流的分類

  1. 輸入流和輸出流
  2. 字節流(InputStream和OutputStream)和字符流(Reader和Writer)
  3. 節點流和處理流:直接鏈接到數據源的是節點流,處理流的使用是爲了簡單與高效

訪問文件的節點流

  1. FileInputStream
  2. FileReader
  3. FileOutputStream
  4. FileWiter

這些節點流讀和寫方法中的容器參數,分別表明讀到容器內,將容器內的內容寫出去。

經常使用的處理流

  1. 緩衝流:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
  2. 轉換流:InputStreamReader、OutputStreamWriter

##RandomAccessFile

簡介:能夠直接跳轉到文件的任意地方來讀寫文件,但一個最大的侷限是隻能讀寫文件,不能讀寫其餘節點。指針的移動單位是字節。

方法:

  1. long getFilePointer():返回文件記錄指針的當前位置。
  2. void seek(long pos):將文件記錄指針定位到pos位置。
  3. read()
  4. write()
  5. readXxx()
  6. writeXxx()
  7. mode值:"r","rw"
相關文章
相關標籤/搜索