Android学习笔记之数据的Sdcard存储方法及操作sdcard的工具类
(1)文件的目录
(2)各文件的代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignRight="@+id/button1" android:layout_marginRight="44dp" android:layout_marginTop="78dp" android:src="@drawable/ic_launcher" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/imageView1" android:layout_marginLeft="96dp" android:layout_marginTop="106dp" android:text="Button" /> </RelativeLayout>
package com.example.data_storage_sdcard.file; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.os.Environment; /** * sdcard的存在于上下文无关 * * @author piaodangdehun * */ public class FileService { /* * 存放在sdcard的根目录 */ public boolean saveFileToSdcardRoot(String fileName, byte[] data) { boolean flag = false; /* * 先判断sdcard的状态,是否存在 */ String state = Environment.getExternalStorageState(); FileOutputStream outputStream = null; File rootFile = Environment.getExternalStorageDirectory(); // 获得sdcard的根路径 /* * 表示sdcard挂载在手机上,并且可以读写 */ if (state.equals(Environment.MEDIA_MOUNTED)) { File file = new File(rootFile, fileName); try { outputStream = new FileOutputStream(file); try { outputStream.write(data, 0, data.length); flag = true; } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } return flag; } /* * 存放在sdcard下自定义的目录 */ public boolean saveFileToSdcardDir(String fileName, byte[] data) { boolean flag = false; /* * 先判断sdcard的状态,是否存在 */ String state = Environment.getExternalStorageState(); FileOutputStream outputStream = null; File rootFile = Environment.getExternalStorageDirectory(); // 获得sdcard的根路径 /* * 表示sdcard挂载在手机上,并且可以读写 */ if (state.equals(Environment.MEDIA_MOUNTED)) { File file = new File(rootFile.getAbsoluteFile() + "/txt"); if (!file.exists()) { file.mkdirs(); } try { outputStream = new FileOutputStream(new File(file, fileName)); try { outputStream.write(data, 0, data.length); flag = true; } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } return flag; } /* * 用于读取sdcard的数据 */ public String readContextFromSdcard(String fileName) { String state = Environment.getExternalStorageState(); File rooFile = Environment.getExternalStorageDirectory(); // 获得sdcard的目录 FileInputStream inputStream = null;// 用于度取数据的流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 用于存放独处的数据 if (state.equals(Environment.MEDIA_MOUNTED)) { File file = new File(rooFile.getAbsoluteFile() + "/txt/");// 在sdcard目录下创建一个txt目录 File file2 = new File(file, fileName); int len = 0; byte[] data = new byte[1024]; if (file2.exists()) { try { inputStream = new FileInputStream(file2); try { while ((len = inputStream.read(data)) != -1) { outputStream.write(data, 0, data.length); } } catch (IOException e) { e.printStackTrace(); } return new String(outputStream.toByteArray()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } return null; } /** * 对文件进行分类的保存到固定的文件中去 * * @param fileName * @param data */ public void saveFileToSdcardBySuff(String fileName, byte[] data) { // File file = Environment.getExternalStoragePublicDirectory(""); // 保存文件的目录 File file = null; if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { /* * 将不同的文件放入到不同的类别中 */ if (fileName.endsWith(".mp3")) { file = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC); } else if (fileName.endsWith(".jpg") || fileName.endsWith(".png") || fileName.endsWith(".gif")) { file = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); } else if (fileName.endsWith(".mp4") || fileName.endsWith(".avi") || fileName.endsWith(".3gp")) { file = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); } else { file = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); } FileOutputStream outputStream = null; try { outputStream = new FileOutputStream(new File(file, fileName)); try { outputStream.write(data, 0, data.length); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } /* * 删除一个文件 */ public boolean deleteFileFromSdcard(String folder, String fileName) { boolean flag = false; File file = Environment.getExternalStorageDirectory(); if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { File exitFile = new File(file.getAbsoluteFile() + "/" + folder); if (exitFile.exists()) { exitFile.delete(); } } return flag; } }
HttpUtils.java访问网络的
package com.example.data_storage_sdcard.http; import java.io.IOException; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; public class HttpUtils { /* * */ public static byte[] getImage(String path) { byte[] data = null; HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(path); try { HttpResponse response = httpClient.execute(httpPost); if (response.getStatusLine().getStatusCode() == 200) { data = EntityUtils.toByteArray(response.getEntity()); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { httpClient.getConnectionManager().shutdown(); } return data; } }
ImageCache.java将文件放到cache中的:
package com.example.data_storage_sdcard.img; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.os.Environment; public class ImageCache { public static String saveImageCache(String fileName, byte[] data) { File file = Environment.getExternalStorageDirectory(); // 根目录 FileOutputStream outputStream = null; if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { try { outputStream = new FileOutputStream(new File(file, fileName)); outputStream.write(data, 0, data.length); return file.getAbsolutePath() + "/" + fileName; } catch (Exception e) { e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } return null; } }
MainActivity.java
package com.example.data_storage_sdcard; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import com.example.data_storage_sdcard.http.HttpUtils; import com.example.data_storage_sdcard.img.ImageCache; public class MainActivity extends Activity { private Button button; private ImageView imageView; private ProgressDialog progressDialog; private String imageName; private final String pathString = "http://www.baidu.com/img/bd_logo1.png"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) this.findViewById(R.id.button1); imageView = (ImageView) this.findViewById(R.id.imageView1); progressDialog = new ProgressDialog(this); progressDialog.setTitle("下载提示"); progressDialog.setMessage("load..."); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new MyTask().execute(pathString); } }); } class MyTask extends AsyncTask<String, Void, byte[]> { @Override protected void onPreExecute() { super.onPreExecute(); progressDialog.show(); } @Override protected byte[] doInBackground(String... params) { String name = params[0]; imageName = name .substring(name.lastIndexOf("/") + 1, name.length()); return HttpUtils.getImage(params[0]); } @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); } @Override protected void onPostExecute(byte[] result) { super.onPostExecute(result); if (result != null) { Bitmap bm = BitmapFactory.decodeByteArray(result, 0, result.length); imageView.setImageBitmap(bm); ImageCache.saveImageCache("", result); } else { imageView.setImageResource(R.drawable.ic_launcher); } progressDialog.dismiss(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
测试类:
package com.example.data_storage_sdcard; import java.io.FileWriter; import com.example.data_storage_sdcard.file.FileService; import android.nfc.Tag; import android.test.AndroidTestCase; import android.util.Log; public class MyTest extends AndroidTestCase { public void saveFileToSdcardTest() { FileService fileService = new FileService(); fileService.saveFileToSdcardRoot("aa.txt", "jkhdsfjkhdskjfhdsjf".getBytes()); } public void saveFileToSdcardDir() { FileService fileService = new FileService(); fileService.saveFileToSdcardRoot("aa.txt", "jkhdsfjkhdskjfhdsjf".getBytes()); } public void readContextFromSdcardTest() { FileService fileService = new FileService(); String msg = fileService.readContextFromSdcard("aa.txt"); System.err.println("-->" + msg); } public void saveFileToSdcardBySuffTest() { FileService fileService = new FileService(); fileService.saveFileToSdcardBySuff("aa.avi", "asdfkajsgdhagsdfhdgsf".getBytes()); } public void delFile() { FileService fileService = new FileService(); boolean flag = fileService.deleteFileFromSdcard("txt", "aa.txt"); } }
需要在请单位按中加入访问网络的权限、操作sdcard的权限、测试的权限
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.data_storage_sdcard" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.data_storage_sdcard" > </instrumentation> <!-- 添加访问sdcard的权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 添加访问网络的权限 --> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <uses-library android:name="android.test.runner" /> <activity android:name="com.example.data_storage_sdcard.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library> </uses-library> </application> </manifest>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。