Android 数据存储与IO之File存储
2015-08-19 16:22
411 查看
本文主要是介绍Android 数据存储与IO之File存储,方便今后使用。
(一)文件存储的核心代码
文件存储
(1)FileOutputStream out = context.openFileOutput(String filename,int mode); 以mode模式获得文件输出流
(2)out.write(byte[]b);
注意:文件默认会存储到/data/data/package/files中;
文件读取
(1)FileInputStream in = context.openFileInput(String filename); 获得某个文件的文件流
(2)int length = in.read(byte[]);
实例1:
(二)读写SD卡上的文件
在AndroidManifest.xml中设置:
存储到SD卡的核心代码:
读取SD卡核心代码:
实例二:
实例三:SD卡文件浏览器
1.MainActivity.java
2.布局文件(1):main.xml
布局文件(2):line.xml
3.配置文件AndroidManifest.xml
添加权限
(一)文件存储的核心代码
文件存储
(1)FileOutputStream out = context.openFileOutput(String filename,int mode); 以mode模式获得文件输出流
(2)out.write(byte[]b);
FileOutputStream out = null; out = context.openFileOutput(filename, Context.MODE_***); out.write(filecontent.getBytes("UTF-8")); out.close();
注意:文件默认会存储到/data/data/package/files中;
文件读取
(1)FileInputStream in = context.openFileInput(String filename); 获得某个文件的文件流
(2)int length = in.read(byte[]);
/* * *每次读取固定的字节,并将此字节输出到字节输出流中,当全部读取完毕后,将字节流中的内容一并输出 */ FileInputStream in = null; ByteArrayOutputStream bout = null; byte[]buf = new byte[1024]; bout = new ByteArrayOutputStream(); int length = 0; in = context.openFileInput(filename); //获得输入流 while((length=in.read(buf))!=-1){ bout.write(buf,0,length); } byte[] content = bout.toByteArray(); filecontentEt.setText(new String(content,"UTF-8")); //设置文本框为读取的内容 in.close(); bout.close();注意:默认会读取/data/data/package/files的文件;
实例1:
public class MainActivity extends Activity { final String FILE_NAME = "crazyit.bin"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); System.out.println(new StringBuilder("a").append("b").append("c") .toString()); // 获取两个按钮 Button read = (Button) findViewById(R.id.read); Button write = (Button) findViewById(R.id.write); // 获取两个文本框 final EditText edit1 = (EditText) findViewById(R.id.edit1); final EditText edit2 = (EditText) findViewById(R.id.edit2); // 为write按钮绑定事件监听器 write.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { // 将edit1中的内容写入文件中 write(edit1.getText().toString()); edit1.setText(""); } }); read.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 读取指定文件中的内容,并显示出来 edit2.setText(read()); } }); } private String read() { try { // 打开文件输入流 FileInputStream fis = openFileInput(FILE_NAME); byte[] buff = new byte[1024]; int hasRead = 0; StringBuilder sb = new StringBuilder(""); // 读取文件内容 while ((hasRead = fis.read(buff)) > 0) { sb.append(new String(buff, 0, hasRead)); } // 关闭文件输入流 fis.close(); return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } private void write(String content) { try { // 以追加模式打开文件输出流 FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND); // 将FileOutputStream包装成PrintStream PrintStream ps = new PrintStream(fos); // 输出文件内容 ps.println(content); // 关闭文件输出流 ps.close(); } catch (Exception e) { e.printStackTrace(); } } }注意:默认会读取/data/data/package/files的文件;
(二)读写SD卡上的文件
在AndroidManifest.xml中设置:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
存储到SD卡的核心代码:
File f = new File(Environment.getExternalStorageDirectory(),filename); out = new FileOutputStream(f,true); out.write(filecontent.getBytes("UTF-8"));
读取SD卡核心代码:
File f = new File(Environment.getExternalStorageDirectory(),filename); in = new FileInputStream(f); while((length=in.read(buf))!=-1){ bout.write(buf,0,length); } byte[] content = bout.toByteArray();
实例二:
public class MainActivity extends Activity { final String FILE_NAME = "/crazyit.bin"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取两个按钮 Button read = (Button) findViewById(R.id.read); Button write = (Button) findViewById(R.id.write); // 获取两个文本框 final EditText edit1 = (EditText) findViewById(R.id.edit1); final EditText edit2 = (EditText) findViewById(R.id.edit2); // 为write按钮绑定事件监听器 write.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { // 将edit1中的内容写入文件中 write(edit1.getText().toString()); edit1.setText(""); } }); read.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 读取指定文件中的内容,并显示出来 edit2.setText(read()); } }); } private String read() { try { // 如果手机插入了SD卡,而且应用程序具有访问SD的权限 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 获取SD卡对应的存储目录 File sdCardDir = Environment.getExternalStorageDirectory(); System.out.println("----------------" + sdCardDir); // 获取指定文件对应的输入流 FileInputStream fis = new FileInputStream( sdCardDir.getCanonicalPath() + FILE_NAME); // 将指定输入流包装成BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(fis)); StringBuilder sb = new StringBuilder(""); String line = null; // 循环读取文件内容 while ((line = br.readLine()) != null) { sb.append(line); } // 关闭资源 br.close(); return sb.toString(); } } catch (Exception e) { e.printStackTrace(); } return null; } private void write(String content) { try { // 如果手机插入了SD卡,而且应用程序具有访问SD的权限 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 获取SD卡的目录 File sdCardDir = Environment.getExternalStorageDirectory(); File targetFile = new File(sdCardDir .getCanonicalPath() + FILE_NAME); // 以指定文件创建 RandomAccessFile对象 RandomAccessFile raf = new RandomAccessFile( targetFile, "rw"); // 将文件记录指针移动到最后 raf.seek(targetFile.length()); // 输出文件内容 raf.write(content.getBytes()); // 关闭RandomAccessFile raf.close(); } } catch (Exception e) { e.printStackTrace(); } } }
实例三:SD卡文件浏览器
1.MainActivity.java
public class MainActivity extends Activity { ListView listView; TextView textView; // 记录当前的父文件夹 File currentParent; // 记录当前路径下的所有文件的文件数组 File[] currentFiles; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取列出全部文件的ListView listView = (ListView) findViewById(R.id.list); textView = (TextView) findViewById(R.id.path); // 获取系统的SD卡的目录 File root = new File("/mnt/sdcard/"); // 如果 SD卡存在 if (root.exists()) { currentParent = root; currentFiles = root.listFiles(); // 使用当前目录下的全部文件、文件夹来填充ListView inflateListView(currentFiles); } // 为ListView的列表项的单击事件绑定监听器 listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 用户单击了文件,直接返回,不做任何处理 if (currentFiles[position].isFile()) return; // 获取用户点击的文件夹下的所有文件 File[] tmp = currentFiles[position].listFiles(); if (tmp == null || tmp.length == 0) { Toast.makeText(MainActivity.this , "当前路径不可访问或该路径下没有文件", Toast.LENGTH_SHORT).show(); } else { // 获取用户单击的列表项对应的文件夹,设为当前的父文件夹 currentParent = currentFiles[position]; // ② // 保存当前的父文件夹内的全部文件和文件夹 currentFiles = tmp; // 再次更新ListView inflateListView(currentFiles); } } }); // 获取上一级目录的按钮 Button parent = (Button) findViewById(R.id.parent); parent.setOnClickListener(new OnClickListener() { @Override public void onClick(View source) { try { if (!currentParent.getCanonicalPath() .equals("/mnt/sdcard")) { // 获取上一级目录 currentParent = currentParent.getParentFile(); // 列出当前目录下所有文件 currentFiles = currentParent.listFiles(); // 再次更新ListView inflateListView(currentFiles); } } catch (IOException e) { e.printStackTrace(); } } }); } private void inflateListView(File[] files) // ① { // 创建一个List集合,List集合的元素是Map List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>(); for (int i = 0; i < files.length; i++) { Map<String, Object> listItem = new HashMap<String, Object>(); // 如果当前File是文件夹,使用folder图标;否则使用file图标 if (files[i].isDirectory()) { listItem.put("icon", R.drawable.folder); } else { listItem.put("icon", R.drawable.file); } listItem.put("fileName", files[i].getName()); // 添加List项 listItems.add(listItem); } // 创建一个SimpleAdapter SimpleAdapter simpleAdapter = new SimpleAdapter(this , listItems, R.layout.line , new String[]{ "icon", "fileName" } , new int[]{R.id.icon, R.id.file_name }); // 为ListView设置Adapter listView.setAdapter(simpleAdapter); try { textView.setText("当前路径为:" + currentParent.getCanonicalPath()); } catch (IOException e) { e.printStackTrace(); } } }
2.布局文件(1):main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 显示当前路径的的文本框 --> <TextView android:id="@+id/path" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_alignParentTop="true"/> <!-- 列出当前路径下所有文件的ListView --> <ListView android:id="@+id/list" android:layout_width="wrap_content" android:layout_height="wrap_content" android:divider="#000" android:dividerHeight="1px" android:layout_below="@id/path"/> <!-- 返回上一级目录的按钮 --> <Button android:id="@+id/parent" android:layout_width="38dp" android:layout_height="34dp" android:background="@drawable/home" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true"/> </RelativeLayout>
布局文件(2):line.xml
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 定义一个ImageView,用于作为列表项的一部分。 --> <ImageView android:id="@+id/icon" android:layout_width="40dp" android:layout_height="40dp" android:paddingLeft="10dp"/> <!-- 定义一个TextView,用于作为列表项的一部分。 --> <TextView android:id="@+id/file_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp" android:gravity="center_vertical" android:paddingLeft="10dp" android:paddingTop="10dp" android:paddingBottom="10dp"/> </LinearLayout>
3.配置文件AndroidManifest.xml
添加权限
<!-- 在SD卡中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 向SD卡写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
相关文章推荐
- Android基础入门教程——2.3.9 RatingBar(星级评分条)
- 【Android】四大组件(4)ContentProvider
- Android Studio导入SlidingMenu流程详解及相关问题
- Android Studio中R文件丢失
- Android之如何在XML中添加单击事件
- Android 好看的搜索界面,大赞Animation
- android studio进行第三方开源项目的导入,当作library
- Android 好看的搜索界面,大赞Animation
- android休眠之后 定时任务TimerTask不生效
- Android(java)学习笔记178:BroadcastReceiver之 自定义广播
- Android源码——通讯录联系人(一):Contacts数据库初识
- Android 环境配置第一节
- Android进程通信之binder驱动源码的理解
- Android layer-list的属性和使用详解
- Android中<uses-sdk>属性和target属性分析
- Android笔记(一)AndroidManifest.xml
- android 代码混淆后出现:TypeReference constructed without actual type information这个错误的解决方法
- 【Android应用开发技术:应用组件】Android事件处理机制
- Android用RadioGroup控件实现Tab选项卡效果
- 关于Android生命周期的一些知识