Android SD卡簡單的文件讀寫操作



最近有這樣的需求,把每次統計到的數據,以txt形式保存到手機SD卡或是手機內存中,遇到一些問題,記錄下來。


首先如果要在程序中使用sdcard進行存儲,我們必須要在AndroidManifset.xml文件進行下面的權限設置:

  <!-- SDCard中創建與刪除文件權限 -->
  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
 <!-- 向SDCard寫入數據權限 -->
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  接着在使用SDcard進行讀寫的時候 會用到Environment類下面的幾個靜態方法  : 

    1: getDataDirectory() 獲取到Android中的data數據目錄(sd卡中的data文件夾)
    2:getDownloadCacheDirectory() 獲取到下載的緩存目錄(sd卡中的download文件夾)
    3:getExternalStorageDirectory() 獲取到外部存儲的目錄 一般指SDcard(/storage/sdcard0)
    4:getExternalStorageState() 獲取外部設置的當前狀態 一般指SDcard,比較常用的應該是 MEDIA_MOUNTED(SDcard存在並且可以進行讀寫)還有其他的一些狀態,可以在文檔中進行查找。

    5:getRootDirectory()  獲取到Android Root路徑


好,以下是具體操作,直接看代碼:

1,判斷SD卡是否存在

	/**
	 * 判斷SDCard是否存在 [當沒有外掛SD卡時,內置ROM也被識別爲存在sd卡]
	 * 
	 * @return
	 */
	public static boolean isSdCardExist() {
		return Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED);
	}

2,獲取SD卡根目錄

	/**
	 * 獲取SD卡根目錄路徑
	 * 
	 * @return
	 */
	public static String getSdCardPath() {
		boolean exist = isSdCardExist();
		String sdpath = "";
		if (exist) {
			sdpath = Environment.getExternalStorageDirectory()
					.getAbsolutePath();
		} else {
			sdpath = "不適用";
		}
		return sdpath;

	}

3,獲取默認的文件存放路徑

	/**
	 * 獲取默認的文件路徑
	 * 
	 * @return
	 */
	public static String getDefaultFilePath() {
		String filepath = "";
		File file = new File(Environment.getExternalStorageDirectory(),
				"abc.txt");
		if (file.exists()) {
			filepath = file.getAbsolutePath();
		} else {
			filepath = "不適用";
		}
		return filepath;
	}

4-1,使用FileInputStream讀取文件

        try {
    		File file = new File(Environment.getExternalStorageDirectory(),
    				"test.txt");
            FileInputStream is = new FileInputStream(file);
            byte[] b = new byte[inputStream.available()];
            is.read(b);
            String result = new String(b);
            System.out.println("讀取成功:"+result);
        } catch (Exception e) {
        	e.printStackTrace();
        }

4-2,使用BufferReader讀取文件

		try {
			File file = new File(Environment.getExternalStorageDirectory(),
					DEFAULT_FILENAME);
			BufferedReader br = new BufferedReader(new FileReader(file));
			String readline = "";
			StringBuffer sb = new StringBuffer();
			while ((readline = br.readLine()) != null) {
				System.out.println("readline:" + readline);
				sb.append(readline);
			}
			br.close();
			System.out.println("讀取成功:" + sb.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}

httpConnection讀取流保存成String數據

			URL url = new URL(getForwardUrl("/queryUserByUNorIP"));
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			InputStream is = conn.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			StringBuilder sb = new StringBuilder();
			String readline = null;
			while ((readline = br.readLine()) != null) {
				sb.append(readline);
			}
			System.out.println("result"+sb.toString());
等效於使用ByteArrayOutputStream

				InputStream is = conn.getInputStream();
				ByteArrayOutputStream bos = new ByteArrayOutputStream();
				byte[] buffer = new byte[1024];
				int len =-1 ;
				while ((len=is.read(buffer))!=-1) {
					bos.write(buffer, 0, len);
				}
				is.close();
				bos.close();
				String result = new String(bos.toByteArray());
				System.out.println("result"+result);

5-1,使用FileOutputStream寫入文件

		try {
			File file = new File(Environment.getExternalStorageDirectory(),
					DEFAULT_FILENAME);
	         FileOutputStream fos = new FileOutputStream(file);
	         String info = "I am a chinanese!";
             fos.write(info.getBytes());
             fos.close();
			System.out.println("寫入成功:");
		} catch (Exception e) {
			e.printStackTrace();
		}

5-2,使用BufferedWriter寫入文件

		try {
			File file = new File(Environment.getExternalStorageDirectory(),
					DEFAULT_FILENAME);
			//第二個參數意義是說是否以append方式添加內容
			BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
			String info = " hey, yoo,bitch";
			bw.write(info);
			bw.flush();
			System.out.println("寫入成功");
		} catch (Exception e) {
			e.printStackTrace();
		}


讀取和寫入我們都實現了,貌似很簡單的樣子,但是我們現在想每隔30秒進行一次數據整理,然後把他們寫入到我們制定的txt文件中,但是我想每次都能在上一次的結尾處開始寫入,這樣在電腦上通過文本打開時,就能看到每一行的數據了。

這其實要求我們每一次寫入數據時,都要有換行的操作符號,比如:\n,並且IO讀寫能以追加的方式寫入到文件裏。

剛開始我很笨的想到,每次寫入前,先把文件讀取出來並且生成一個StringBuffer,然後再append,然後再寫入.....這種方式導致每次都要2次以上的IO操作,讀和寫。其實系統寫入時就給我們自帶了append方式,還是要勤看文檔啊!

BufferedWriter

使用BufferedWriter,在構造BufferedWriter時,把第二個參數設爲true
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(  
                    new FileOutputStream(file, true)));  
         out.write(conent);  

FileWriter

構造函數中的第二個參數true表示以追加形式寫文件  
         FileWriter writer = new FileWriter(fileName, true);  
         writer.write(content);  
         writer.close();

// 打開一個隨機訪問文件流,按讀寫方式  
RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");  
// 文件長度,字節數  
long fileLength = randomFile.length();  
// 將寫文件指針移到文件尾。  
randomFile.seek(fileLength);  
randomFile.writeBytes(content);  
randomFile.close(); 



問題:我在file寫入時,沒一次寫完後,明明都添加了換行符(bw.write("\n")),爲什麼在Window的文本文檔中看不到換行呢?而在EditPlus或是notepad++中就能看到換行後的效果?

			BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
			String info = " hey, yoo,bitch";
			bw.write(info);
			bw.write("\n");
			bw.flush();

如上代碼所示,可是在windows的文本文檔中:


但是在諸如notepad++或EditPlus中看到卻是沒問題的:



這是爲什麼呢?

這是windows與linux系統的編碼模式不同造成的。android系統是linux內核,與windows不同。windows是採用的是DOS編碼方式,所用的換行符是DOS換行符CR/LF,也就是我們俗稱的\r\n,(如果不理解可以去百度一下轉義字符,一般程序員會用到這些知識),而linux系統的換行符爲UNIX換行符LF,也就是\n,蘋果的MAC系統用的是MAC換行符CR,也就是\r,現在我想你也差不多理解了。你在android手機裏建立的文檔肯定用的是UNIX換行符,也就是一個\n,但是這個文檔你拿到windows裏用記事本打開的話,因爲windows記事本是DOS換行符\r\n,所以你少了個\r,所以沒法識別成換行,只能給你識別成一個小方塊了,解決辦法很簡單,你可以用EditPlus或者UltraEdit軟件打開,UltraEdit也能轉換這些編碼模式,轉換成DOS模式就可以了。


所以,我們只需要添加:\r\n  

			BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
			String info = " hey, yoo,bitch";
			bw.write(info);
			bw.write("\r\n");
			bw.flush();


ok,先到這裏,之後繼續補充。

發佈了95 篇原創文章 · 獲贊 123 · 訪問量 486萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章