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路径 |
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)) . |
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() :确定该输入流所有资源释放被是否并准备被垃圾回收器回收
(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) |
void close() :关闭输出流
void write(byte[] buffer, int byteOffset, int byteCount) :从数组的Offset位置开始写Count个字节到该输出流
void write(int oneByte) :写一个字节到该输出流
(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