【Android开发】 文件读写操作——总结

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

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

 

一、资源文件的读取:

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

 1 String res = "";   
 2 try{   
 3    
 4     //得到资源中的Raw数据流  
 5     InputStream in = getResources().openRawResource(R.raw.test);   
 6   
 7     //得到数据的大小  
 8     int length = in.available();         
 9   
10     byte [] buffer = new byte[length];          
11   
12     //读取数据  
13     in.read(buffer);           
14   
15     //依test.txt的编码类型选择合适的编码,如果不调整会乱码   
16     res = EncodingUtils.getString(buffer, "BIG5");   
17       
18     //关闭      
19     in.close();              
20   
21    }catch(Exception e){   
22       e.printStackTrace();           
23    }

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

 1 String fileName = "test.txt"; //文件名字   
 2 String res="";   
 3 try{   
 4   
 5    //得到资源中的asset数据流  
 6    InputStream in = getResources().getAssets().open(fileName);   
 7   
 8    int length = in.available();           
 9    byte [] buffer = new byte[length];          
10   
11    in.read(buffer);              
12    in.close();  
13    res = EncodingUtils.getString(buffer, "UTF-8");       
14   
15   }catch(Exception e){   
16   
17       e.printStackTrace();           
18   
19    }

 

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

 1 //写数据  
 2 public void writeFile(String fileName,String writestr) throws IOException{   
 3   try{   
 4   
 5         FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE);   
 6   
 7         byte [] bytes = writestr.getBytes();   
 8   
 9         fout.write(bytes);   
10   
11         fout.close();   
12       }   
13   
14         catch(Exception e){   
15         e.printStackTrace();   
16        }   
17 }   
18   
19 //读数据  
20 public String readFile(String fileName) throws IOException{   
21   String res="";   
22   try{   
23          FileInputStream fin = openFileInput(fileName);   
24          int length = fin.available();   
25          byte [] buffer = new byte[length];   
26          fin.read(buffer);       
27          res = EncodingUtils.getString(buffer, "UTF-8");   
28          fin.close();       
29      }   
30      catch(Exception e){   
31          e.printStackTrace();   
32      }   
33      return res;   
34   
35 }

 

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

 1 //写数据到SD中的文件  
 2 public void writeFileSdcardFile(String fileName,String write_str) throws IOException{   
 3  try{   
 4   
 5        FileOutputStream fout = new FileOutputStream(fileName);   
 6        byte [] bytes = write_str.getBytes();   
 7   
 8        fout.write(bytes);   
 9        fout.close();   
10      }  
11   
12       catch(Exception e){   
13         e.printStackTrace();   
14        }   
15    }   
16   
17     
18 //读SD中的文件  
19 public String readFileSdcardFile(String fileName) throws IOException{   
20   String res="";   
21   try{   
22          FileInputStream fin = new FileInputStream(fileName);   
23   
24          int length = fin.available();   
25   
26          byte [] buffer = new byte[length];   
27          fin.read(buffer);       
28   
29          res = EncodingUtils.getString(buffer, "UTF-8");   
30   
31          fin.close();       
32         }   
33   
34         catch(Exception e){   
35          e.printStackTrace();   
36         }   
37         return res;   
38 } 

 

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

 1 //读文件  
 2 public String readSDFile(String fileName) throws IOException {    
 3   
 4         File file = new File(fileName);    
 5   
 6         FileInputStream fis = new FileInputStream(file);    
 7   
 8         int length = fis.available();   
 9   
10          byte [] buffer = new byte[length];   
11          fis.read(buffer);       
12   
13          res = EncodingUtils.getString(buffer, "UTF-8");   
14   
15          fis.close();       
16          return res;    
17 }    
18   
19 //写文件  
20 public void writeSDFile(String fileName, String write_str) throws IOException{    
21   
22         File file = new File(fileName);    
23   
24         FileOutputStream fos = new FileOutputStream(file);    
25   
26         byte [] bytes = write_str.getBytes();   
27   
28         fos.write(bytes);   
29   
30         fos.close();   
31 } 

 

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

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

 

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

 

RandomAccessFile的使用方法比较灵活,功能也比较多,可以使用类似seek的方式可以跳转到文件的任意位置,从文件指示器当前位置开始读写。
它有两种构造方法
new RandomAccessFile(f,"rw");//读写方式
new RandomAccessFile(f,"r");//只读方式
使用事例:

 1 /*  
 2  * 程序功能:演示了RandomAccessFile类的操作,同时实现了一个文件复制操作。  
 3  */    
 4     
 5 import java.io.*;    
 6     
 7 public class RandomAccessFileDemo {    
 8  public static void main(String[] args) throws Exception {    
 9   RandomAccessFile file = new RandomAccessFile("file", "rw");    
10   // 以下向file文件中写数据    
11   file.writeInt(20);// 占4个字节    
12   file.writeDouble(8.236598);// 占8个字节    
13   file.writeUTF("这是一个UTF字符串");// 这个长度写在当前文件指针的前两个字节处,可用readShort()读取    
14   file.writeBoolean(true);// 占1个字节    
15   file.writeShort(395);// 占2个字节    
16   file.writeLong(2325451l);// 占8个字节    
17   file.writeUTF("又是一个UTF字符串");    
18   file.writeFloat(35.5f);// 占4个字节    
19   file.writeChar(‘a‘);// 占2个字节    
20     
21   file.seek(0);// 把文件指针位置设置到文件起始处    
22     
23   // 以下从file文件中读数据,要注意文件指针的位置    
24   System.out.println("——————从file文件指定位置读数据——————");    
25   System.out.println(file.readInt());    
26   System.out.println(file.readDouble());    
27   System.out.println(file.readUTF());    
28     
29   file.skipBytes(3);// 将文件指针跳过3个字节,本例中即跳过了一个boolean值和short值。    
30   System.out.println(file.readLong());    
31     
32   file.skipBytes(file.readShort()); // 跳过文件中“又是一个UTF字符串”所占字节,注意readShort()方法会移动文件指针,所以不用加2。    
33   System.out.println(file.readFloat());    
34       
35   //以下演示文件复制操作    
36   System.out.println("——————文件复制(从file到fileCopy)——————");    
37   file.seek(0);    
38   RandomAccessFile fileCopy=new RandomAccessFile("fileCopy","rw");    
39   int len=(int)file.length();//取得文件长度(字节数)    
40   byte[] b=new byte[len];    
41   file.readFully(b);    
42   fileCopy.write(b);    
43   System.out.println("复制完成!");    
44  }    
45 }

 

总结:

 

1、apk中有两种资源文件,使用两种不同的方式进行打开使用。
raw使用InputStream in = getResources().openRawResource(R.raw.test);
asset使用InputStream in = getResources().getAssets().open(fileName);

这些数据只能读取,不能写入。
2、SD卡中的文件使用FileInputStream和FileOutputStream进行文件的操作。
3、存放在数据区(/data/data/..)的文件只能使用openFileOutput和openFileInput进行操作。
注意不能使用FileInputStream和FileOutputStream进行文件的操作。
4、RandomAccess类仅限于文件的操作,不能访问其他IO设备。它可以跳转到文件的任意位置,从当前位置开始读写。

 

 转自:http://blog.csdn.net/ztp800201/article/details/7322110

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。