Android 数据存储与IO之File存储

来源:互联网 发布:下载word制表软件 编辑:程序博客网 时间:2024/05/03 05:37

本文主要是介绍Android 数据存储与IO之File存储,方便今后使用。

(一)文件存储的核心代码

文件存储

(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";@Overridepublic 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(){@Overridepublic void onClick(View source){// 将edit1中的内容写入文件中write(edit1.getText().toString());edit1.setText("");}});read.setOnClickListener(new OnClickListener(){@Overridepublic 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包装成PrintStreamPrintStream 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";@Overridepublic 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(){@Overridepublic void onClick(View source){// 将edit1中的内容写入文件中write(edit1.getText().toString());edit1.setText("");}});read.setOnClickListener(new OnClickListener(){@Overridepublic 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);// 将指定输入流包装成BufferedReaderBufferedReader br = new BufferedReader(newInputStreamReader(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());// 关闭RandomAccessFileraf.close();}}catch (Exception e){e.printStackTrace();}}}


实例三:SD卡文件浏览器

1.MainActivity.java

public class MainActivity extends Activity {ListView listView;TextView textView;// 记录当前的父文件夹File currentParent;// 记录当前路径下的所有文件的文件数组File[] currentFiles;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 获取列出全部文件的ListViewlistView = (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();// 使用当前目录下的全部文件、文件夹来填充ListViewinflateListView(currentFiles);}// 为ListView的列表项的单击事件绑定监听器listView.setOnItemClickListener(new OnItemClickListener(){@Overridepublic 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;// 再次更新ListViewinflateListView(currentFiles);}}});// 获取上一级目录的按钮Button parent = (Button) findViewById(R.id.parent);parent.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){try{if (!currentParent.getCanonicalPath().equals("/mnt/sdcard")){// 获取上一级目录currentParent = currentParent.getParentFile();// 列出当前目录下所有文件currentFiles = currentParent.listFiles();// 再次更新ListViewinflateListView(currentFiles);}}catch (IOException e){e.printStackTrace();}}});}private void inflateListView(File[] files)  // ①{// 创建一个List集合,List集合的元素是MapList<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);}// 创建一个SimpleAdapterSimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.line, new String[]{ "icon", "fileName" }, new int[]{R.id.icon, R.id.file_name });// 为ListView设置AdapterlistView.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"><!-- 显示当前路径的的文本框 --><TextViewandroid:id="@+id/path"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_alignParentTop="true"/><!-- 列出当前路径下所有文件的ListView --><ListViewandroid: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"/>



0 0