編輯:關於Android編程
上節學習了如何在手機內部存儲中讀寫文件,本節學習如何在手機的外部存儲中讀寫文件。那就是如何在Sdcard中讀寫文件。
那我們還是用以前登錄界面的例子舉例說明,(登錄界面請看上節Android 存儲學習之在內部存儲中讀寫文件)
先我們顯示寫的代碼:
當點擊確定並且自動登錄的鉤是選中的,則就會在sdcard文件夾寫創建一個info.txt文件
public void login(View v) { String name = ed_nam.getText().toString(); String passwd = ed_passwd.getText().toString(); //判斷用戶名或者密碼是否輸入 if((name.equals()) || (passwd.equals())) { Toast.makeText(this, 用戶名或密碼不能為空, Toast.LENGTH_SHORT).show(); } else { //如果選中自動登錄,我們就需要保存用戶名和密碼 if(cb.isChecked()) { //創建一個文件,用戶保存用戶名和密碼 File file = new File(sdcard/info.txt); try { FileOutputStream fos = new FileOutputStream(file); //寫入用戶名和密碼,以name##passwd的格式寫入 fos.write((name + ## + passwd).getBytes()); //關閉輸出流 fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } Toast.makeText(this, 登錄成功, Toast.LENGTH_SHORT).show(); } } }
執行後,顯示效果如下:
同理讀也就是將上節讀取的路徑改為sdcard的路徑即可:
public void readInfo() { File file = new File(sdcard/info.txt); //如果文件存在,則讀取 if(file.exists()) { try { FileInputStream fin = new FileInputStream(file); //把字節流轉化為字符流 BufferedReader buffer = new BufferedReader(new InputStreamReader(fin)); //讀取文件中的用戶名和密碼 String text = buffer.readLine(); //以##為關鍵字分割字符 String s[] = text.split(##); //設置進EditText ed_nam.setText(s[0]); ed_passwd.setText(s[1]); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
//創建一個文件,用戶保存用戶名和密碼 //File file = new File(sdcard/info.txt); File file = new File(Environment.getExternalStorageDirectory(), info.txt);設想一種情況,當我們往sdcard中寫一個文件,但是由於sdcard容量有限,不足與放下此文件,所以在用戶打算放入一個文件到sdcard中時,需要先判斷存儲空間是不滿足,不滿足請用戶給予提醒即可。
那如何獲得sdcard的當前可用容量:
//用戶判斷是否文件大小超過sdcard的容量 public Boolean sdcardAvailable(int size) { File file = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(file.getPath()); //每個塊的大小 long blockSize = stat.getBlockSize(); //公共分為多少個塊 long totalBlocks = stat.getBlockCount(); //共有多少可用的空間,單位為字節 long availableBlocks = stat.getAvailableBlocks(); if(availableBlocks > size) { return true; } return false; }
當寫入一個文件時,先和sdcard的可用空間比較即可:
try { FileOutputStream fos = new FileOutputStream(file); //寫入用戶名和密碼,以name##passwd的格式寫入 //要寫入的數據長度,單位是字節 int len = (name + ## + passwd).getBytes().length/8; if(sdcardAvailable(len)) { fos.write((name + ## + passwd).getBytes()); } else { Toast.makeText(this, sdcard存儲空間不足, Toast.LENGTH_SHORT).show(); } //關閉輸出流 fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
再設想一種情況,當我們突然往sdcard中寫入內容時,如果sdcard出現某些問題,沒有掛載,那也是不能寫入東西的。所以,讀寫之前需要判斷sdcard是否正常運行
if(cb.isChecked()) { //創建一個文件,用戶保存用戶名和密碼 //File file = new File(sdcard/info.txt); /* MEDIA_CHECKING: sd卡正在准備 * MEDIA_MOUNTED:sd卡已經掛載,並且正在讀寫訪問 * MEDIA_REMOVED:沒有sd卡 * MEDIA_UNKNOWN:不能識別sd卡 * MEDIA_UNMOUNTED:sd卡存在,但沒有掛載 * */ if(Environment.getExternalStorageDirectory().equals(Environment.MEDIA_MOUNTED)) { File file = new File(Environment.getExternalStorageDirectory(), info2.txt); try { FileOutputStream fos = new FileOutputStream(file); //寫入用戶名和密碼,以name##passwd的格式寫入 //要寫入的數據長度,單位是字節 int len = (name + ## + passwd).getBytes().length/8; if(sdcardAvailable(len)) { fos.write((name + ## + passwd).getBytes()); } else { Toast.makeText(this, sdcard存儲空間不足, Toast.LENGTH_SHORT).show(); } //關閉輸出流 fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } Toast.makeText(this, 登錄成功, Toast.LENGTH_SHORT).show(); }
也就是在讀寫時,先判斷sdcard是否已經正在運行,如果sdcard的狀態是ok的。則執行接下來的操作即可
AbSlidingPlayView是AndBase框架中的功能之一,今天就來嘗試用AbSlidingPlayView來做一個好多類新聞app都會涉及到的,廣播輪播效果,能
android調試橋: adb命令使用需要在系統環境遍歷中path中追加adb.exe的完整路徑D:\IDE\adt-bundle-windows-x86-2013072
三星s7微信消息推送收不到怎麼辦?不少用戶反映手機出現爆音、收不到微信、qq消息推送,那麼三星s7微信不提示怎麼辦?三星s7收不到微信消息推送怎麼解決?下文
有時候作為非官方開發的APP集成了官方的所有信息,但是現在需要實現另一個功能那就是登錄發表評論到官方的網站,而非官方的APP並不知道官方網站是怎麼實現登錄與評論的,而且越