Android 文件读写操作方法总结

Android 文件读写操作方法总结

在Android中的文件放在不同位置,它们的读取方式也有一些不同。

本文对android中对资源文件的读取、数据区文件的读取、SD卡文件的读取及RandomAccessFile的方式和方法进行了整理。供参考。

一、资源文件的读取:

1) 从resource的raw中读取文件数据:

String res = "";
try{ 

 //得到资源中的Raw数据流
 InputStream in = getResources().openRawResource(R.raw.test); 

 //得到数据的大小
 int length = in.available();   

 byte [] buffer = new byte[length];   

 //读取数据
 in.read(buffer);   

 //依test.txt的编码类型选择合适的编码,如果不调整会乱码
 res = EncodingUtils.getString(buffer, "BIG5"); 

 //关闭
 in.close();    

 }catch(Exception e){
  e.printStackTrace();
 }

2) 从resource的asset中读取文件数据

String fileName = "test.txt"; //文件名字
String res="";
try{ 

 //得到资源中的asset数据流
 InputStream in = getResources().getAssets().open(fileName); 

 int length = in.available();
 byte [] buffer = new byte[length];   

 in.read(buffer);
 in.close();
 res = EncodingUtils.getString(buffer, "UTF-8");  

 }catch(Exception e){ 

  e.printStackTrace();   

 }

二、读写/data/data/<应用程序名>目录上的文件:

//写数据
public void writeFile(String fileName,String writestr) throws IOException{
 try{ 

  FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE); 

  byte [] bytes = writestr.getBytes(); 

  fout.write(bytes); 

  fout.close();
  } 

  catch(Exception e){
  e.printStackTrace();
  }
} 

//读数据
public String readFile(String fileName) throws IOException{
 String res="";
 try{
   FileInputStream fin = openFileInput(fileName);
   int length = fin.available();
   byte [] buffer = new byte[length];
   fin.read(buffer);
   res = EncodingUtils.getString(buffer, "UTF-8");
   fin.close();
  }
  catch(Exception e){
   e.printStackTrace();
  }
  return res; 

}

三、读写SD卡中的文件。也就是/mnt/sdcard/目录下面的文件 :

//写数据到SD中的文件
public void writeFileSdcardFile(String fileName,String write_str) throws IOException{
 try{ 

  FileOutputStream fout = new FileOutputStream(fileName);
  byte [] bytes = write_str.getBytes(); 

  fout.write(bytes);
  fout.close();
  } 

  catch(Exception e){
  e.printStackTrace();
  }
 } 

//读SD中的文件
public String readFileSdcardFile(String fileName) throws IOException{
 String res="";
 try{
   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();
  } 

  catch(Exception e){
   e.printStackTrace();
  }
  return res;
}

四、使用File类进行文件的读写:

//读文件
public String readSDFile(String fileName) throws IOException { 

  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();
   return res;
} 

//写文件
public void writeSDFile(String fileName, String write_str) throws IOException{ 

  File file = new File(fileName); 

  FileOutputStream fos = new FileOutputStream(file); 

  byte [] bytes = write_str.getBytes(); 

  fos.write(bytes); 

  fos.close();
}

五、另外,File类还有下面一些常用的操作:

String Name = File.getName(); //获得文件或文件夹的名称:
String parentPath = File.getParent(); //获得文件或文件夹的父目录
String path = File.getAbsoultePath();//绝对路经
String path = File.getPath();//相对路经
File.createNewFile();//建立文件
File.mkDir(); //建立文件夹
File.isDirectory(); //判断是文件或文件夹
File[] files = File.listFiles(); //列出文件夹下的所有文件和文件夹名
File.renameTo(dest); //修改文件夹和文件名
File.delete(); //删除文件夹或文件

六、使用RandomAccessFile进行文件的读写:

RandomAccessFile的使用方法比较灵活,功能也比较多,可以使用类似seek的方式可以跳转到文件的任意位置,从文件指示器

当前位置开始读写。

它有两种构造方法

new RandomAccessFile(f,"rw");//读写方式
new RandomAccessFile(f,"r");//只读方式

使用事例:

/*
 * 程序功能:演示了RandomAccessFile类的操作,同时实现了一个文件复制操作。
 */ 

import java.io.*; 

public class RandomAccessFileDemo {
 public static void main(String[] args) throws Exception {
 RandomAccessFile file = new RandomAccessFile("file", "rw");
 // 以下向file文件中写数据
 file.writeInt(20);// 占4个字节
 file.writeDouble(8.236598);// 占8个字节
 file.writeUTF("这是一个UTF字符串");// 这个长度写在当前文件指针的前两个字节处,可用readShort()读取
 file.writeBoolean(true);// 占1个字节
 file.writeShort(395);// 占2个字节
 file.writeLong(2325451l);// 占8个字节
 file.writeUTF("又是一个UTF字符串");
 file.writeFloat(35.5f);// 占4个字节
 file.writeChar('a');// 占2个字节 

 file.seek(0);// 把文件指针位置设置到文件起始处 

 // 以下从file文件中读数据,要注意文件指针的位置
 System.out.println("——————从file文件指定位置读数据——————");
 System.out.println(file.readInt());
 System.out.println(file.readDouble());
 System.out.println(file.readUTF()); 

 file.skipBytes(3);// 将文件指针跳过3个字节,本例中即跳过了一个boolean值和short值。
 System.out.println(file.readLong()); 

 file.skipBytes(file.readShort()); // 跳过文件中“又是一个UTF字符串”所占字节,注意readShort()方法会移动文件指针,所以不用加2。
 System.out.println(file.readFloat()); 

 //以下演示文件复制操作
 System.out.println("——————文件复制(从file到fileCopy)——————");
 file.seek(0);
 RandomAccessFile fileCopy=new RandomAccessFile("fileCopy","rw");
 int len=(int)file.length();//取得文件长度(字节数)
 byte[] b=new byte[len];
 file.readFully(b);
 fileCopy.write(b);
 System.out.println("复制完成!");
 }
}

七、读取资源文件时能否实现类似于seek的方式可以跳转到文件的任意位置,从指定的位置开始读取指定的字节数呢?

答案是可以的。

在FileInputStream和InputStream中都有下面的函数:

public long skip (long byteCount); //从数据流中跳过n个字节
public int read (byte[] buffer, int offset, int length); //从数据流中读取length数据存在buffer的offset开始的位置。offset是相对于buffer的开始位置的,不是数据流。 

可以使用这两个函数来实现类似于seek的操作,请看下面的测试代码:
[java] view plain copy
//其中read_raw是一个txt文件,存放在raw目录下。
//read_raw.txt文件的内容是:"ABCDEFGHIJKLMNOPQRST"
public String getRawString() throws IOException { 

 String str = null; 

 InputStream in = getResources().openRawResource(R.raw.read_raw); 

 int length = in.available();
 byte[] buffer = new byte[length]; 

 in.skip(2); //跳过两个字节
 in.read(buffer,0,3); //读三个字节 

 in.skip(3); //跳过三个字节
 in.read(buffer,0,3); //读三个字节 

 //最后str="IJK"
 str = EncodingUtils.getString(buffer, "BIG5"); 

 in.close(); 

 return str;
}

从上面的实例可以看出skip函数有点类似于C语言中的seek操作,但它们之间有些不同。

需要注意的是:

1、skip函数始终是从当前位置开始跳的。在实际应用当中还要再判断一下该函数的返回值。
2、read函数也始终是当前位置开始读的。
3、另外,还可以使用reset函数将文件的当前位置重置为0,也就是文件的开始位置。

如何得到文件的当前位置?

我没有找到相关的函数和方法,不知道怎么样才能得到文件的当前位置,貌似它也并不是太重要。

八、如何从FileInputStream中得到InputStream?

public String readFileData(String fileName) throws IOException{
 String res="";
 try{
   FileInputStream fin = new FileInputStream(fileName);
  InputStream in = new BufferedInputStream(fin); 

   ... 

  }
  catch(Exception e){
   e.printStackTrace();
  } 

}

九、APK资源文件的大小不能超过1M,如果超过了怎么办?我们可以将这个数据再复制到data目录下,然后再使用。复制数据的代码如下:

public boolean assetsCopyData(String strAssetsFilePath, String strDesFilePath){
  boolean bIsSuc = true;
  InputStream inputStream = null;
  OutputStream outputStream = null; 

  File file = new File(strDesFilePath);
  if (!file.exists()){
   try {
    file.createNewFile();
    Runtime.getRuntime().exec("chmod 766 " + file);
   } catch (IOException e) {
    bIsSuc = false;
   } 

  }else{//存在
   return true;
  } 

  try {
   inputStream = getAssets().open(strAssetsFilePath);
   outputStream = new FileOutputStream(file); 

   int nLen = 0 ; 

   byte[] buff = new byte[1024*1];
   while((nLen = inputStream.read(buff)) > 0){
    outputStream.write(buff, 0, nLen);
   } 

   //完成
  } catch (IOException e) {
   bIsSuc = false;
  }finally{
   try {
    if (outputStream != null){
     outputStream.close();
    } 

    if (inputStream != null){
     inputStream.close();
    }
   } catch (IOException e) {
    bIsSuc = false;
   } 

  } 

  return bIsSuc;
 }

 总结:

1、apk中有两种资源文件,使用两种不同的方式进行打开使用。

raw使用InputStream in = getResources().openRawResource(R.raw.test);
asset使用InputStream in = getResources().getAssets().open(fileName);

这些数据只能读取,不能写入。更重要的是该目录下的文件大小不能超过1M。

同时,需要注意的是,在使用InputStream的时候需要在函数名称后加上throws IOException。

2、SD卡中的文件使用FileInputStream和FileOutputStream进行文件的操作。

3、存放在数据区(/data/data/..)的文件只能使用openFileOutput和openFileInput进行操作。

注意不能使用FileInputStream和FileOutputStream进行文件的操作。

4、RandomAccessFile类仅限于文件的操作,不能访问其他IO设备。它可以跳转到文件的任意位置,从当前位置开始读写。

5、InputStream和FileInputStream都可以使用skip和read(buffre,offset,length)函数来实现文件的随机读取。

(0)

相关推荐

  • Android Studio下添加assets目录的实现方法

    有时候需要放置一些文件而且不被proguard压缩,可以放到assets目录中. 但是工程默认并未创建assets目录,那么如何在android studio中创建assets目录呢? 目录位置为:XXX\src\main\assets XXX代表你的项目的路径,assets放在src\main目录下. 以上这篇Android Studio下添加assets目录的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Android 中raw和assets文件夹的区别

    Android 中raw和assets文件夹的区别 以下是我通过整理网上与自己的经验所得. raw 和 assets 的相同点 它们会被原封不动的拷贝到APK中,而不会像其它资源文件那样被编译成二进制的形式. raw 和 assets 的不同点 1.它们在代码中的不同方式 : assets: InputStream assets = getAssets().open("xxxx"); raw: InputStream raw = getResources().openRawResour

  • android文件操作——读取assets和raw文件下的内容

    来自Resources和Assets 中的文件只可以读取而不能进行写的操作. assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件. 1. 先在Activity里面调用getAssets() 来获取AssetManager引用. 2. 再用AssetManager的open(String fileName, int accessMode) 方法则指定读取的文件以及访问模式就能得到输入流InputStream. 3. 然后就是用已经open fi

  • Android获取assets文件夹中的数据并写入SD卡示例

    本文示例主要实现了Android获取assets文件夹中的数据并将其写入到SD卡中,该程序实现的步骤主要为:首先读取assets文件夹中的数据库,再将其写入到SD存储卡中. 完整示例代码如下: import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import android.content.Context; /*将assets文件

  • Android开发之文件操作模式深入理解

    一.基本概念 复制代码 代码如下: // 上下文对象 private Context context; public FileService(Context context) { super(); this.context = context; } // 保存文件方法 public void save(String filename, String fileContent) throws Exception { FileOutputStream fos = context.openFileOut

  • Android 加载assets中的资源文件实例代码

    Android 加载assets资源 在android中,如何加载assets目录下的文件夹呢?方法很简单,使用 AssetManager, 即 AssetManager assetManager = getAssets(); 例子如下: AssetManager assetManager = getAssets(); try { String[] files = assetManager.list("Files"); for(int i=0; i<FILES.LENGTH; {

  • 读写Android中assets目录下的文件的方法详解

    Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可: 第二种是assets目录下存放的原生资源文件: 因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.XXX.ID的方式访问它们.那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.apk目录下,以apk形式存在,asset/r

  • Android 文件操作方法

    数据存储与访问常用方式:文件SharedPreferences(偏好参数设置)SQLite数据库内容提供者(Content provider)网络 Activity(Context)Context.getCacheDir()方法用于获取/data/data/<package name>/cache目录Context.getFilesDir()方法用于获取/data/data/<package name>/files目录 Activity(Context)提供了openFileOut

  • Android操作存放在assets文件夹下SQLite数据库的方法

    本文实例讲述了Android操作存放在assets文件夹下SQLite数据库的方法.分享给大家供大家参考.具体如下: 因为这次的项目需要自带数据,所以就就把数据都放到一个SQLite的数据库文件中了,之后把该文件放到了assets文件夹下面.一开始打算每次都从assets文件夹下面把该文件夹拷贝到手机的SD卡或者手机自身的存储上之后再使用,后来考虑到每次都拷贝的话效率不高,并且如果涉及到对数据库的修改操作的话拷贝之后数据就被恢复了. 因此就写了该封装,该封装只是在第一次使用数据库文件的时候把该文

  • android读取assets中Excel表格并显示

    本文实例为大家分享了android读取assets中Excel的具体代码,供大家参考,具体内容如下 1.在assets下放的excel表格,命名为excel.xls 2.添加读取excel需要的jar包"jxl.jar",assets是建在main级别目录下,建错地方找不到文件 3.读取excel中的文件 /*获取excel表格中的数据不能在主线程中调用 xlsName 为表格的名称 index 表示第几张表格 */ public ArrayList<ExcelBean>

  • Android读取assets目录下的所有图片并显示的方法

    本文实例讲述了Android读取assets目录下的所有图片并显示的方法.分享给大家供大家参考.具体方法分析如下: 在assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件. 1. 先在Activity里面调用getAssets() 来获取AssetManager引用. 2. 再用AssetManager的open(String fileName, int accessMode) 方法则指定读取的文件以及访问模式就能得到输入流InputStrea

  • Android API编程之Assets文件操作示例

    本文实例讲述了Android API Assets文件操作.分享给大家供大家参考,具体如下: public class ReadAssetActivity extends Activity { private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.re

随机推荐