問題發現:從後臺獲取文字信息的時候,經過抓包發現含有rn換行符,顯示在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,使用的時候讀出;指針
方法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(); } }
讀文件方法:get
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; }
File類是java.io包下表明與平臺無關的文件和目錄,即無論是文件仍是目錄都是使用File來操做的,File能新建、刪除、重命名文件和目錄,但不能訪問文件內容自己。
訪問文件名相關的方法:
文件檢測相關的方法:
獲取常規文件信息:
文件操做相關的方法:
目錄操做相關方法:
訪問文件的節點流:
這些節點流讀和寫方法中的容器參數,分別表明讀到容器內,將容器內的內容寫出去。
經常使用的處理流:
簡介:能夠直接跳轉到文件的任意地方來讀寫文件,但一個最大的侷限是隻能讀寫文件,不能讀寫其餘節點。指針的移動單位是字節。
方法: