編輯:關於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做一個廣告輪播效果
AbSlidingPlayView是AndBase框架中的功能之一,今天就來嘗試用AbSlidingPlayView來做一個好多類新聞app都會涉及到的,廣播輪播效果,能
adb的常用命令淺析(android debud bridge)
android調試橋: adb命令使用需要在系統環境遍歷中path中追加adb.exe的完整路徑D:\IDE\adt-bundle-windows-x86-2013072
三星s7微信不提示怎麼辦 三星s7收不到微信消息推送解決方法
三星s7微信消息推送收不到怎麼辦?不少用戶反映手機出現爆音、收不到微信、qq消息推送,那麼三星s7微信不提示怎麼辦?三星s7收不到微信消息推送怎麼解決?下文
Android模擬登錄評論CSDN實現代碼
有時候作為非官方開發的APP集成了官方的所有信息,但是現在需要實現另一個功能那就是登錄發表評論到官方的網站,而非官方的APP並不知道官方網站是怎麼實現登錄與評論的,而且越