Android 浅析 文件读写

前言

Linus Benedict Torvalds : RTFSC – Read The Funning Source Code

概述

Android 作为基于 Linux 的系统,所以文件的操作也继承于 Linux 那一套。文件的读写可以分为这么几个,对文件进行读、写操作 :FileReader、FileWriter、FileInputStream、FileOutputStream 总共包括四大操作方式。

  1. 数据区的读写:存放在数据区(/data/data/..)的文件只能使用openFileOutput和openFileInput进行操作。注意这里不能使用FileInputStream和FileOutputStream进行文件的操作。
  2. SD的读写:SD卡中的文件使用FileInputStream和FileOutputStream进行文件的操作。

数据区的读写

默认情况下,保存到内部存储的文件是应用的私有文件,其他应用(和用户)不能访问这些文件。 当用户卸载您的应用时,这些文件也会被移除。

写入操作

  1. 使用文件名称和操作模式调用 openFileOutput()。这将返回一个 FileOutputStream。
  2. 使用 write() 写入到文件。
  3. 使用 close() 关闭流式传输。

操作模式:

  1. MODE_PRIVATE:默认模式,只能在应用内使用。
  2. MODE_APPEND:如果文件存在则会从文件的尾端开始写入。
1
2
3
4
5
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();

读取操作

  1. 调用 openFileInput() 并向其传递要读取的文件名称。这将返回一个 FileInputStream。
  2. 使用 read() 读取文件字节。
  3. 然后使用 close() 关闭流式传输。
1
2
3
4
5
6
7
8
String FILENAME = "hello_file";
String string = "hello world!";
FileInputStream fin = openFileput(FILENAME);
int length = fin.available();
byte [] buffer = new byte[length];
fin.read(buffer);
res = EncodingUtils.getString(buffer, "UTF-8");
fin.close();

外部存储读写

首先要获取到读取和写入外部存储的权限:

如果存在SDCard并且想要访问里面的资源则首先要判断是否存在SDCard。Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED
Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())

Stream 写入操作

1
2
3
4
FileOutputStream fout = new FileOutputStream(fileName);
byte [] bytes = write_str.getBytes();
fout.write(bytes);
fout.close();

Stream 读取操作

1
2
3
4
5
6
FileInputStream fin = new FileInputStream(fileName);
int length = fin.available();
byte [] buffer = new byte[length];
fin.read(buffer);
res = EncodingUtils.getString(buffer, "UTF-8");
fin.close();

File 写入操作

1
2
3
4
5
File file = new File(fileName);
FileOutputStream fos = new FileOutputStream(file);
byte [] bytes = write_str.getBytes();
fos.write(bytes);
fos.close();

File 读取操作

1
2
3
4
5
6
7
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
int length = fis.available();
byte [] buffer = new byte[length];
fis.read(buffer);
res = EncodingUtils.getString(buffer, "UTF-8");
fis.close();

File 功能

1
2
3
4
5
6
7
8
9
10
File.getName(); //获得文件或文件夹的名称:
File.getParent(); //获得文件或文件夹的父目录
File.getAbsoultePath(); //绝对路经
File.getPath(); //相对路经
File.createNewFile(); //建立文件
File.mkDir(); //建立文件夹
File.isDirectory(); //判断是文件或文件夹
File.listFiles(); //列出文件夹下的所有文件和文件夹名
File.renameTo(dest); //修改文件夹和文件名
File.delete(); //删除文件夹或文件

RandomAccessFile

随机访问类一般可以用RandomAccessFile 来实现文件的随机访问。它可以用seek()方法来访问文件,并进行读写。RandomAccessFile是不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它甚至都没有用InputStream和OutputStream已经准备好的功能,它是一个完全独立的类。

RandomAccessFile的绝大多数功能,已经被JDK1.4的nio的“内存映射文件(memory-mapped files)”给取代了。

getFilePointer ()

返回当前的移动的地标。

seek (long offset)

设置当前文件的移动标志,确定读取文件的起点。如果设置的长度大于文件长度,文件长度也不会被改变。

write (byte[] b, int off, int len)

把指定的字节数组b从当前off标志处写入len个字节。

write (byte[] b)

把指定的字节数组b字节从当前文件指针处开始写入到此文件。

read (byte[] b, int off, int len)

off游标处读取len的字节到字节组b里面。这个方法会一直阻塞直到字节读完。

read (byte[] b)

读取字节到字节组b里面。这个方法会一直阻塞直到字节读完。