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