Android:檔案下載和寫入SD卡學習小結
今天剛剛學習完Android檔案下載和寫入SD卡的,隨即做一個小結,以供以後學習查閱:
一、檔案下載
Android開發中,有時需要從網上下載一些資源以供使用者使用,Android API中已經提供了很多直接可以用的類供大家使用,一般檔案下載需要通過三個步驟:
1.建立一個HttpURLConnection物件:
// 建立一個URL物件,urlStr指的是網路IP地址
url = new URL(urlStr);
// 建立一個HttpURLConnection連線
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
2.獲得一個InputStream物件:
InputStream input=null;
input=urlConn.getInputStream();
3.設定訪問網路的許可權:
//在AndroidManifest.xml配置檔案中加入許可權資訊
<uses-permission android:name="android.permission.INTERNET"/>
二、訪問並寫入SD卡
由於手機記憶體有限,所以一般需要將資料放入大容量容器SD卡中,不同手機SD卡所在目錄不一樣,這就需要我們們通過一個統一的函式找到SD卡所在的目錄,再對它進行操作,Android中提供了一個函式,可以查詢到基本上所有型別型號的手機SD卡所在的目錄:
//得到當前裝置SD卡的目錄
Environment.getExternalStorageDirectory();
在訪問SD卡前還必須在配置檔案中設定許可權,這樣才可以最SD卡進行存取操作:
//在AndroidManifest.xml配置檔案中加入許可權資訊
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
以下是一個對SD操作經常用到的類,以後如果需要對SD卡操作,直接可以拿過來用:
public class FileUtils {
private String SDPATH;
public String getSDPATH() {
return SDPATH;
}
public FileUtils() {
//得到當前外部儲存裝置的目錄
// /SDCARD
SDPATH = Environment.getExternalStorageDirectory() + "/";
}
/**
* 在SD卡上建立檔案
*
* @throws IOException
*/
public File creatSDFile(String fileName) throws IOException {
File file = new File(SDPATH + fileName);
file.createNewFile();
return file;
}
/**
* 在SD卡上建立目錄
*
* @param dirName
*/
public File creatSDDir(String dirName) {
File dir = new File(SDPATH + dirName);
dir.mkdir();
return dir;
}
/**
* 判斷SD卡上的資料夾是否存在
*/
public boolean isFileExist(String fileName){
File file = new File(SDPATH + fileName);
return file.exists();
}
/**
* 將一個InputStream裡面的資料寫入到SD卡中
*/
public File write2SDFromInput(String path,String fileName,InputStream input){
File file = null;
OutputStream output = null;
try{
creatSDDir(path);
file = creatSDFile(path + fileName);
output = new FileOutputStream(file);
byte buffer [] = new byte[4 * 1024];
while((input.read(buffer)) != -1){
output.write(buffer);
}
output.flush();
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
output.close();
}
catch(Exception e){
e.printStackTrace();
}
}
return file;
}
}
三、例項演示
在對以上檔案下載和SD卡訪問基本知識瞭解的基礎上,下面進行舉例說明:
檔案下載一般有文字檔案和位元組檔案,不同檔案下載的方式不同,但是都需要通過上面所說的一般步驟,即都需要首先得到一個InputStream物件,然後在對這個物件進行不同的操作,以下是對一個圖片檔案(位元組檔案)進行處理,我們在以上FileUtils類的基礎上建立一個HttpDownLoader類,以供檔案下載時作為工具類呼叫:
public class HttpDownloader {
private URL url=null;
FileUtils fileUtils=new FileUtils();
public int downfile(String urlStr,String path,String fileName)
{
if(fileUtils.isFileExist(path+fileName))
{return 1;}
else{
try {
InputStream input=null;
input = getInputStream(urlStr);
File resultFile=fileUtils.write2SDFromInput(path, fileName, input);
if(resultFile==null)
{
return -1;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return 0;
}
//由於得到一個InputStream物件是所有檔案處理前必須的操作,所以將這個操作封裝成了一個方法
public InputStream getInputStream(String urlStr) throws IOException
{
InputStream is=null;
try {
url=new URL(urlStr);
HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
is=urlConn.getInputStream();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return is;
}
}
下面編寫Activity檔案進行檔案的操作:
public class MainActivity extends Activity {
private Button downfile=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
downfile=(Button)findViewById(R.id.downfile);
downfile.setOnClickListener(new View.OnClickListener() {
downfile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
HttpDownloader httpDownLoader=new HttpDownloader();
int result=httpDownLoader.downfile("http://219.216.197.96:8080/test//file.jpg", "test/", "test.jpg");
if(result==0)
{
Toast.makeText(MainActivity.this, "下載成功!", Toast.LENGTH_SHORT).show();
}
else if(result==1) {
Toast.makeText(MainActivity.this, "已有檔案!", Toast.LENGTH_SHORT).show();
}
else if(result==-1){
Toast.makeText(MainActivity.this, "下載失敗!", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
注:在編寫檔案下載的IP地址時,不要用本地地址,比如:127.0.0.1,由於我在測試時用的Tomcat伺服器,IP就直接用的本地地址,程式執行後一直沒有報錯,但是去SD卡中找檔案時一直沒有找到檔案,最後改為電腦的IP地址後問題解決了。
上例中首先定義了一個HttpDownLoader類的物件httpdownloader,再呼叫該物件的downfile()方法,方法中第一個引數指的是檔案下載的URL,第二個引數指的是準備存放到SD卡中的目錄,第三個引數指的是檔案存放的名稱。
相關文章
- Android向SD卡和ROM寫檔案AndroidSD卡
- Android 各版本 SD卡檔案讀寫變化及其音樂播放AndroidSD卡
- 【Android APK】解析SD卡上的APK檔案AndroidAPKSD卡
- Android--手持PDA讀取SD卡中檔案AndroidSD卡
- Android開發之SD卡上檔案操作 (轉)AndroidSD卡
- 結構體資訊寫入SD卡,記憶體不連續結構體SD卡記憶體
- 播放SD卡上全部音訊檔案SD卡音訊
- 微信小程式檔案預覽和下載-檔案系統微信小程式
- sd卡刪除的檔案如何恢復SD卡
- Android斷點下載小結Android斷點
- Android:Sqlitedatabase學習小結AndroidSQLiteDatabase
- 如何從壞掉的SD卡恢復檔案SD卡
- Android 對SD卡的操作AndroidSD卡
- Spring學習總結(24)——Spring配置檔案載入路徑總結Spring
- android監聽SD卡掛載並獲取路徑AndroidSD卡
- Linux學習筆記 檔案讀寫小細節Linux筆記
- Python 3 學習筆記之——鍵盤輸入和讀寫檔案Python筆記
- 學習筆記:在windows和linux下寫檔案的些許不同筆記WindowsLinux
- Android小知識-如何載入外部dex檔案中的類Android
- TC中開啟檔案和寫入檔案
- Linux-檔案寫入和檔案同步Linux
- sd卡中的資料夾刪除了怎麼恢復,SD卡刪除的檔案如何恢復SD卡
- Android學習系列(38)--Android原始碼下載和編譯Android原始碼編譯
- Arduino+ESP32 之 SD卡讀寫UISD卡
- android使用webview載入flash檔案AndroidWebView
- Android學習之 WebView使用小結AndroidWebView
- Yaml檔案語法及讀寫小結YAML
- 檔案下載漏洞練習(一)
- SD卡中FAT32檔案格式快速入門(圖文詳細介紹)【轉】SD卡
- sd卡防寫不能格式化win10_win10系統sd卡防寫怎麼格式化SD卡Win10
- 04小白學nodejs 檔案寫入NodeJS
- 使用ContentResolver查詢SD卡中特定的檔案SD卡
- 驅動載入到proc檔案下
- Profile配置和載入配置檔案
- 載入和儲存properties檔案
- Android 的 so 檔案載入機制Android
- js 透過連結下載檔案JS
- js動態載入 js檔案和 css檔案JSCSS