首页 > 代码库 > Android学习笔记十七.Android数据存储与IO.File存储常用API

Android学习笔记十七.Android数据存储与IO.File存储常用API

    Android通过一套完整的I/O流体系,包括FileInputStream、FileOutputStream等,通过这些I/O流来访问手机存储上的文件。
一、API
1.File
(1)功能:该类提供一些有限的功能-获取或设置文件的权限、文件类型、最后依次修改时间等,通常它所代表的文件名(包含路径)将被转换为UTF-8字节序列被使用。
(2)继承关系
  java.lang.Object
     ? java.io.File
(3)构造方法
 File(File dir, String name):构造一个新文件对象,且文件对象包含指定的路径和文件名
File(String path):构造一个新文件对象,且文件对象包含指定的路径
File(String dirPath, String name):构造一个新文件对象,且文件对象使用指定的目录路径和文件名
File(URI uri):构造一个新文件对象,且文件对象使用指定的URI路径
(4)常用方法
boolean createNewFile():根据存储在文件对象中的路径信息,在此路径下新建一个空的新文件
boolean delete():删除该文件
String getAbsolutePath():返回该文件的绝对路径,且为字符串形式
String getCanonicalPath():返回表示与此抽象路径名相同的文件或目录的规范路径名字符串
String getPath():返回相对路径名,且为字符串形式
long lastModified() :返回该文件被最后修改的时间,这里需要注意的是返回的是从1970.1.1.00.00  到当前的毫秒量
File[] listFiles() :返回该文件所在目录的所有文件到一个File数组
String toString() :返回一些关于该文件简洁可读的相关信息
URI toURI() :返回该文件的统一资源标志符
setXXX..:设置文件对象对应文件的属性

2.FileInputStream
(1)功能:一个输入流,用于从文件读出字节数据。该输入流不是缓冲空间,大部分方法调用需要用BufferedInputStream类来包装该流。我们还可以通过 FileRead类向文件写入字符数据。
   File file = ...
   InputStream in = null;
   try {
     in = new BufferedInputStream(new FileInputStream(file));
     ...
    finally {
     if (in != null) {
       in.close();
     }
   }
 }
(2)继承关系
java.lang.Object
   ? java.io.InputStream
     ? java.io.FileInputStream
(3)构造方法
FileInputStream(File file)
Constructs a new FileInputStream that reads from file.
FileInputStream(FileDescriptor fd)
Constructs a new FileInputStream that reads from fd.
FileInputStream(String path)
Equivalent to new FileInputStream(new File(path)).
(4)常用方法
Public int available() :返回文件还有多少可读或跳过的数据字节数
Public void close() :关闭输入流
Public int read() :从输入流中读取出一个字节数据,并将其转换为整型数据(0-255)返回
Public int read(byte[] buffer, int byteOffset, int byteCount) :从输入流读取byteCount个字节数据到buffer数组中,从byteOffset位置开始存储。
Public long skip(long byteCount) :Skips at most byteCount bytes in this stream. 
Protected void finalize() :确定该输入流所有资源释放被是否并准备被垃圾回收器回收

3.FileOutputStream
(1)功能:文件输出流,用于写入字节数据到文件中。如果该输出流存在,则替换或者追加文件中的内容;如果文件输出流不存在,则创建一个新文件。注意:该输出流不是缓冲空间,大部分方法调用需要用BufferedOutputStream类来包装该流。我们还可以通过 FileWriter类向文件写入字符数据
  File file = ...
   OutputStream out = null;
   try {
     out = new BufferedOutputStream(new FileOutputStream(file));
     ...
    finally {
     if (out != null) {
       out.close();
     }
   }
 }
(2)继承关系
java.lang.Object
   ? java.io.OutputStream
     ? java.io.FileOutputStream
(3)构造方法
FileOutputStream(File file) :构造一个 FileOutputStream 实例,用于写字节数据到File对象对应的文件
FileOutputStream(File file, boolean append)
FileOutputStream(FileDescriptor fd):构造一个 FileOutputStream 实例,用于写字节数据到文件描述符对应的文件
FileOutputStream(String path)
FileOutputStream(String path, boolean append)
(4)常用方法
void close() :关闭输出流
void write(byte[] buffer, int byteOffset, int byteCount) :从数组的Offset位置开始写Count个字节到该输出流
void write(int oneByte) :写一个字节到该输出流

4.Context
(1)Context提供了两个方法来打开本应用程序的数据文件夹的文件I/O流(输入流、输出流)
FileInputStream openFileInput(String):打开应用程序的数据文件夹下的name文件对应输入流;
FileOutputStream openFileOutput(String name,int mode):打开应用程序的数据文件夹下的name文件对应输出流;
其中,第二个参数值如下:
    MODE_PRIVATE:该文件只能被当前程序读写;
    MODE_APPEND:以追加方式打开文件,应用程序可以想该文件中追加内容;
    MODE_WORLD_READABLE:该文件的内容可以被其他程序读取;
    MODE_WORLD_WRITEABLE:该文件的内容可被其他程序读、写
(2)Context提供几种方法用于访问应用程序的数据文件夹
getDir(String name,int mdoe):在应用程序的数据文件夹下获取或创建name对应的子目录
File getFilesDir():获取该应用程序的数据文件夹的绝对路径
String[] fileList():返回该应用程序的数据文件夹下的全部文件
deleteFile(String):删除该应用程序的数据文件夹下的指定文件
二、实例分析
1.实现:读写应用程序数据文件夹内的文件
2.文件读取开发思路
(1)从输入流读取数据:a.打开一个文件输入流;b.创建一个数组缓冲空间;c.从输入流循环读取buffer.length个字节数据到缓冲空间并最后存放到StringBuilder中。
FileInputStream fis=openFileInput("test.txt");
byte[] buff=new byte[1024]; 
 int hasRead=0; 
StringBuilder sb=new StringBuilder(""); 
while( (hasRead=fis.read(buff)) >0 )    //将文件数据读到buff数组中并返回字节数,等价于 read(buffer, 0, buffer.length)
{
        sb.append(new String(buff,0,hasRead));//从buff缓冲中读取从0位置开始hasRead个字节数的内容存放到StringBuilder对象中
}
   fis.close();
   return sb.toString(); //返回读取到的数据
(2)写数据到文件输出流:a.以追加模式打开一个文件输出流;b.将输出流打包成PrintStream;c.向PrintStream追加写入传入的数据
 FileOutputStream fos=openFileOutput(FILE_NAME,MODE_APPEND); 
PrintStream ps=new PrintStream(fos); 
ps.append(content); 
ps.close(); 

3.源码
package com.example.android_sdcard_0;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class FileTest extends Activity {
 final String FILE_NAME="test.txt";
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 //0.获取界面组件
  Button write=(Button)findViewById(R.id.writeBtn);
  Button read=(Button)findViewById(R.id.readBtn);
  final EditText edit1=(EditText)findViewById(R.id.edit1);
  final EditText edit2=(EditText)findViewById(R.id.edit2);
 //1.为按钮设置监听器并实现相应功能(写、读)
  write.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
    write(edit2.getText().toString());	//获取文本编辑框中的数据并写入到文件中
    edit2.setText(""); //清空文本编辑框
   }
  });
 
  read.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
    edit1.setText(read()); //读取指定文件中的内容并显示出来
   }
  });
 }
 //2.实现read()方法:从指定文件中读取数据
 private String read(){
 
  try {
   FileInputStream fis=openFileInput(FILE_NAME);//a.打开文件输入流
   byte[] buff=new byte[1024];	 //b.开辟一段缓冲空间
   int hasRead=0;	 //c.读取位置标志位
   StringBuilder sb=new StringBuilder("");	 //d.实例化一个StringBuilder对象
   while( (hasRead=fis.read(buff)) >0 )	 //将文件数据读到buff数组中并返回字节数,等价于 read(buffer, 0, buffer.length).
   {
    sb.append(new String(buff,0,hasRead));	//从buff缓冲中读取从0位置开始hasRead个字节数的内容存放到StringBuilder对象中
   }
   fis.close();
   return sb.toString();	 //返回读取到的数据
   
  }
  catch (Exception e) {
   e.printStackTrace();
  }
  return null;
 }
 //3.将文本编辑框中的数据追加写入到指定文件中
 private void write(String content) {
  try {
   FileOutputStream fos=openFileOutput(FILE_NAME,MODE_APPEND);	//以追加模式打开指定文件(输出流)
   PrintStream ps=new PrintStream(fos);	 //将FileOutputStream包装成PrintStream
   ps.append(content);	//将传递进来的数据参数写入指定文件中
   ps.close();	 //关闭文件
  }
  catch (FileNotFoundException e) {
   e.printStackTrace();
  }
 }
}
效果演示:/data/data/<包名>/files/test.txt
技术分享
技术分享
参考:http://wear.techbrood.com/reference/java/io/FileInputStream.html

Android学习笔记十七.Android数据存储与IO.File存储常用API