温故知新----5种数据存储方式之File
来源:互联网 发布:保利水管 知乎 编辑:程序博客网 时间:2024/05/16 14:56
File储存有两种,一种是处理应用程序的数据文件夹的文件,另一种是处理SD卡上的文件。
一、处理应用程序的数据文件夹文件
FileOutputStream openFileOutput(String name):打开应用程序的数据文件夹下的name文件对应的输出流
FileInputStream openFileIntput(String name,int mode):打开应用程序的数据文件夹下的name文件对应的输入流
注意:
1.方法的第一参数用于指定文件名称,不能包含路径分隔符“/”
2.如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录
public static final int MODE_APPEND = 32768; 以追加方式打开该文件,应用程序可以向该文件中追加内容
public static final int MODE_PRIVATE = 0; 该文件只能被当前程序读写
public static final int MODE_WORLD_READABLE = 1; 给文件内容可以被其他程序读取
public static final int MODE_WORLD_WRITEABLE = 2; 给文件内容可以被其他程序读写
3.context下的几个访问应用程序的数据文件夹方法
处理应用程序的数据文件夹的文件:
写入文件方法
/** * 写入文件 * 文件存储在应用程序的数据文件夹下 * @param content */ private void write(String content) { FileOutputStream fos = null; try { //以context的openFileOutput和追加的模式打开文件输出流 fos = openFileOutput("haha.txt", MODE_APPEND); //输出流,写入文件 fos.write(content.getBytes()); } catch (Exception e) { e.printStackTrace(); } finally { try { if (fos != null) { fos.close(); fos=null; } } catch (IOException e) { e.printStackTrace(); } } }读取文件方法
/** * 读取文件 * 文件存储在应用程序的数据文件夹下 */ private String read() { FileInputStream fis = null; try { //使用context的openFileInput方法打开输入流 fis = openFileInput("haha.txt"); byte b[] = new byte[1024]; int hasRead = 0; //记录读出内容 StringBuilder sb = new StringBuilder(""); //读取文件内容,hasRead表示已经读取的 while ((hasRead = fis.read(b)) > 0) { sb.append(new String(b, 0, hasRead)); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); fis=null; } } catch (IOException e) { e.printStackTrace(); } } return null; }
结果:
处理SD卡上的文件:
读写前准备:
1.判断是否有sd卡
/** * 检查SD卡是否存在且能否读写 * @return True if external storage is writable. False otherwise. */ public static boolean isExternalStorageMounted() { return Environment.MEDIA_MOUNTED.equals( Environment.getExternalStorageState()); }
2.检测用户是否有读写sd卡权限
/** * 检查用户是否有读/写SD卡权限 * @param context The Context to check the permissions for. * @return True if granted the permissions. False otherwise. */ public static boolean hasWritePermissionToExternalStorage(Context context) { return ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; }
3.如果没有则为用户申请权限
/** * 请求读写权限 * @param activity */ public static void requestPermission(Activity activity){ ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); }
4.获取sd卡目录
File sdCardDir = Environment.getExternalStorageDirectory();
5.Androidmanifest加入读写sd卡的
<!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
写入文件方法:
/** * 写入SD卡下的文件 * @param content */ private void writeSD(String content) { //如果sd卡存在 if (Util.isExternalStorageMounted()){ //如果没有权限读写操作,则申请 if (!Util.hasWritePermissionToExternalStorage(this)){ Util.requestPermission(this); }else{ FileOutputStream fos=null; try { //获取SDCard目录 File sdCardDir = Environment.getExternalStorageDirectory(); //生成一个文件 File textFile = new File(sdCardDir,"HEIHEI.txt"); fos = new FileOutputStream(textFile); fos.write(content.getBytes()); } catch (IOException e) { e.printStackTrace(); }finally { try { if (fos!=null){ fos.close(); fos = null; } } catch (IOException e) { e.printStackTrace(); } } } } }读取文件方法:
/** * 读取sd卡下的文件 * @return */ private String readSD() { FileInputStream fis = null; try { //输入流,名字由路径+文件名组成 fis = new FileInputStream(Environment.getExternalStorageDirectory()+"/HEIHEI.txt"); byte b[] = new byte[1024]; int hasRead = 0; //记录读出内容 StringBuilder sb = new StringBuilder(""); //读取文件内容,hasRead表示已经读取的 while ((hasRead = fis.read(b)) > 0) { sb.append(new String(b, 0, hasRead)); } return sb.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { if (fis!=null){ fis.close(); fis = null; } } catch (IOException e) { e.printStackTrace(); } } return null; }结果:
完整代码:
FileActivity.Java
package tplusr.storagetest.file;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.TextView;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import tplusr.storagetest.R;import tplusr.storagetest.Util;public class FileActivity extends AppCompatActivity implements View.OnClickListener{ private TextView t; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_file); setContentView(R.layout.activity_main); Button b1 = (Button) findViewById(R.id.b1); Button b2 = (Button) findViewById(R.id.b2); Button b3 = (Button) findViewById(R.id.b3); Button b4 = (Button) findViewById(R.id.b4); t = (TextView) findViewById(R.id.result); b1.setOnClickListener(this); b2.setOnClickListener(this); b3.setOnClickListener(this); b4.setOnClickListener(this); //获取应用程序的数据文件夹的绝对路径 Log.d("File", "绝对路径"+getFilesDir().toString()); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.b1: write("YSJHDASKDHAKSHDAKSDHKHWUIFGEWK我我我我我我我我我我放假放到沙发上看3847829#$%……(*&%"); Log.d("File", "----------------创建文件---------------"); //获取应用程序的数据文件夹下的所有文件 Log.d("File", "文件数量"+fileList().length + ""); for (int i=0;i<fileList().length;i++){ Log.d("File", "文件:"+fileList()[i]+""); } break; case R.id.b2: Log.d("File", "----------------读取文件---------------"); t.setText(read()); Log.d("File", "文件内容:" + read()); Log.d("File", "----------------删除文件---------------"); //删除应用程序的数据文件夹下的绝对路径 deleteFile("haha.txt"); Log.d("File", fileList().length + ""); break; case R.id.b3: writeSD("DHADHIUFHEUWI右边还是福 is 返回非大煞风景#$……*(*)&"); break; case R.id.b4: Log.d("File", "----------------SD卡读取文件结果---------------"); t.setText(readSD()); Log.d("File", readSD()); break; } } /** * 写入文件 * 文件存储在应用程序的数据文件夹下 * @param content */ private void write(String content) { FileOutputStream fos = null; try { //以context的openFileOutput和追加的模式打开文件输出流 fos = openFileOutput("haha.txt", MODE_APPEND); //输出流,写入文件 fos.write(content.getBytes()); } catch (Exception e) { e.printStackTrace(); } finally { try { if (fos != null) { fos.close(); fos=null; } } catch (IOException e) { e.printStackTrace(); } } } /** * 读取文件 * 文件存储在应用程序的数据文件夹下 */ private String read() { FileInputStream fis = null; try { //使用context的openFileInput方法打开输入流 fis = openFileInput("haha.txt"); byte b[] = new byte[1024]; int hasRead = 0; //记录读出内容 StringBuilder sb = new StringBuilder(""); //读取文件内容,hasRead表示已经读取的 while ((hasRead = fis.read(b)) > 0) { sb.append(new String(b, 0, hasRead)); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); fis=null; } } catch (IOException e) { e.printStackTrace(); } } return null; } /** * 写入SD卡下的文件 * @param content */ private void writeSD(String content) { //如果sd卡存在 if (Util.isExternalStorageMounted()){ //如果没有权限读写操作,则申请 if (!Util.hasWritePermissionToExternalStorage(this)){ Util.requestPermission(this); }else{ FileOutputStream fos=null; try { //获取SDCard目录 File sdCardDir = Environment.getExternalStorageDirectory(); //生成一个文件 File textFile = new File(sdCardDir,"HEIHEI.txt"); fos = new FileOutputStream(textFile); fos.write(content.getBytes()); } catch (IOException e) { e.printStackTrace(); }finally { try { if (fos!=null){ fos.close(); fos = null; } } catch (IOException e) { e.printStackTrace(); } } } } } /** * 读取sd卡下的文件 * @return */ private String readSD() { FileInputStream fis = null; try { //输入流,名字由路径+文件名组成 fis = new FileInputStream(Environment.getExternalStorageDirectory()+"/HEIHEI.txt"); byte b[] = new byte[1024]; int hasRead = 0; //记录读出内容 StringBuilder sb = new StringBuilder(""); //读取文件内容,hasRead表示已经读取的 while ((hasRead = fis.read(b)) > 0) { sb.append(new String(b, 0, hasRead)); } return sb.toString(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { if (fis!=null){ fis.close(); fis = null; } } catch (IOException e) { e.printStackTrace(); } } return null; }}Util.Java
package tplusr.storagetest.sharedpreferences;import android.Manifest;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager;import android.os.Environment;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;/** * Created by tangjiarao on 16/9/6. */public class Util { /** * 检查SD卡是否存在且能否读写 * @return True if external storage is writable. False otherwise. */ public static boolean isExternalStorageMounted() { return Environment.MEDIA_MOUNTED.equals( Environment.getExternalStorageState()); } /** * 检查用户是否有读/写SD卡权限 * @param context The Context to check the permissions for. * @return True if granted the permissions. False otherwise. */ public static boolean hasWritePermissionToExternalStorage(Context context) { return ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; } /** * 请求读写权限 * @param activity */ public static void requestPermission(Activity activity){ ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); }}
http://www.cnblogs.com/elleniou/archive/2012/05/17/2505630.html
0 0
- 温故知新----5种数据存储方式之File
- 温故知新----5种数据存储方式之SharedPreferences
- 温故知新----5种数据存储方式之SQLiteOpenHelper
- Android的5种数据存储方式之文件存储
- 5种数据存储方式之文件和Preferences
- android学习之-5种数据存储方式
- Android的5种数据存储方式之sharedpreference
- Android的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式。
- Android中的5种数据存储方式。
- Android中的5种数据存储方式
- Android的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中5种数据存储方式
- 阿里、Facebook、Cloudera等巨头的数据收集框架全攻略
- 2016 Multi-University Training Contest 8 1001 Ball
- Android中MVC,MVP,MVVM的区别
- php操作dom节点
- Reveal使用教程
- 温故知新----5种数据存储方式之File
- ExpandableListView+CheckBox使用注意事项
- Android 7.0 Vold工作流程
- 说一下字典的:addEntriesFromDictionary用法
- 数据库安装过程
- Android开发技术总结
- 迭代法求N的阶乘
- 关于如何设置UITableView的Cell有间隔
- 在 centos 6.X中安装 activemq