打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android读写文件

      Android读写文件

 

Android getResources的用法  

今天做一个Android的文件管理器,里面用到很多的地方用到了getResources。

Drawable currentIcon = null;

………………

currentIcon = getResources().getDrawable(R.drawable.folder);

………………

currentIcon = getResources().getDrawable(R.drawable.image);

…………

一开始不是很理解为什么用c getResources()这个方法就可以获取存在系统的资源。于是看了一下文档和翻阅了一下资料:


例如:把资源文件放到应用程序的/raw/raw下,那么就可以在应用中使用getResources获取资源后,以openRawResource方法(不带后缀的资源文件名)打开这个文件。例如:

Resources myResources = getResources();
InputStream myFile = myResources.openRawResource(R.raw.myfilename);

和传统的java文件操作一样,在android Api中提供了openFileInput和openFileOutput方法来读取设备上的文件。

简写
InputStream fs =this.getResources().openRawResource(R.raw.kb); (资源文件名为kb.html, 不需要带后缀.html)
InputStreamReader read = new InputStreamReader (fs,”gb2312″);
BufferedReader in = new BufferedReader(read);

读取res/drawable目录下的png或者bmg
//得到Resources对象
Resources r = this.getContext().getResources();
//以数据流的方式读取资源
Inputstream is = r.openRawResource(R.drawable.my_background_image);
BitmapDrawable bmpDraw = new BitmapDrawable(is);
Bitmap bmp = bmpDraw.getBitmap();

或者
InputStream is = getResources().openRawResource(R.drawable.icon);
Bitmap mBitmap = BitmapFactory.decodeStream(is);
Paint mPaint = new Paint();
canvas.drawBitmap(mBitmap, 40, 40, mPaint);

数据包package:android.content.res
主要类:Resources

InputStream openRawResource(int id) 获取资源的数据流,读取资源数据

把一个图片资源,添加你的文件到你工程中res/drawable/目录中去,从这里,你就可以引用它到你的代码或你的XML布局中,也就是说,引用它也可以用资源编号,比如你选择一个文件只要去掉后缀就可以了(例如:my_image.png 引用它是就是my_image)。

 

一、       resource中的raw文件夹中获取文件并读取数据(资源文件只能读不能写)

String res = ""; 

try{ 

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

//\Test\res\raw\bbi.txt,

   int length = in.available();       

   byte [] buffer = new byte[length];        

   in.read(buffer);         

   //res = EncodingUtils.getString(buffer, "UTF-8");

   //res = EncodingUtils.getString(buffer, "UNICODE"); 

   res = EncodingUtils.getString(buffer, "BIG5"); 

   //bbi.txt的编码类型选择合适的编码,如果不调整会乱码

   in.close();            

   }catch(Exception e){ 

      e.printStackTrace();         

   } 

myTextView.setText(res);//把得到的内容显示在TextView

 

二、       asset中获取文件并读取数据(资源文件只能读不能写)

String fileName = "yan.txt"; //文件名字

String res=""; 

try{ 

   InputStream in = getResources().getAssets().open(fileName);

   // \Test\assets\yan.txt这里有这样的文件存在

   int length = in.available();         

byte [] buffer = new byte[length];        

in.read(buffer);            

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

}catch(Exception e){ 

      e.printStackTrace();         

   }

 

三、       sdcard中去读文件,首先要把文件通过\android-sdk-windows\tools\adb.exe把本地计算机上的文件copysdcard上去,adb.exe push e:/Y.txt /sdcard/, 不可以用adb.exe push e:\Y.txt \sdcard\ 同样: 把仿真器上的文件copy到本地计算机上用: adb pull ./data/data/com.tt/files/Test.txt e:/

 

String fileName = "/sdcard/Y.txt";

//也可以用String fileName = "mnt/sdcard/Y.txt";

String res="";     

try{ 

FileInputStream fin = new FileInputStream(fileName);

//FileInputStream fin = openFileInput(fileName);  

//用这个就不行了,必须用FileInputStream

    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(); 

} 

myTextView.setText(res);

 

四、       写文件, 一般写在\data\data\com.test\files\里面,打开DDMS查看file explorer是可以看到仿真器文件存放目录的结构的

   String fileName = "TEST.txt";

   String message = "FFFFFFF11111FFFFF" ;

writeFileData(fileName, message);

  

   public voidwriteFileData(String fileName,String message){ 

       try{ 

        FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE);

        byte [] bytes = message.getBytes(); 

        fout.write(bytes); 

         fout.close(); 

        } 

       catch(Exception e){ 

        e.printStackTrace(); 

       } 

   }    

 

五、       写, data/data/目录(相当AP工作目录)上的文件,openFileOutput

   //写文件在./data/data/com.tt/files/下面

   public voidwriteFileData(String fileName,String message){ 

       try{ 

        FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE);

        byte [] bytes = message.getBytes(); 

        fout.write(bytes); 

         fout.close(); 

        } 

       catch(Exception e){ 

        e.printStackTrace(); 

       } 

   }

//-------------------------------------------------------

//读文件在./data/data/com.tt/files/下面

   public String readFileData(String fileName){ 

        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; 

    }   

六、       写, sdcard目录上的文件,要用FileOutputStream 不能用openFileOutput

 

    //写在/mnt/sdcard/目录下面的文件

   public voidwriteFileSdcard(String fileName,String message){ 

       try{ 

        //FileOutputStream fout = openFileOutput(fileName, MODE_PRIVATE);

       FileOutputStream fout = newFileOutputStream(fileName);

        byte [] bytes = message.getBytes(); 

        fout.write(bytes); 

         fout.close(); 

        } 

       catch(Exception e){ 

        e.printStackTrace(); 

       } 

   }

  

   //读在/mnt/sdcard/目录下面的文件

   public String readFileSdcard(String fileName){

        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; 

   }

 注: openFileOutput是在raw里编译过的,FileOutputStream是任何文件都可以

 

              Android读写文件

 一, RandomAccessFile写文件函数

  String str = "nigelyan";

   String file = "./sdcard/mm.txt";

    writefile(file,str);

    public void writefile(String filename , String message)

    {

        RandomAccessFile rf;

      try {

          rf = new RandomAccessFile(filename, "rw");

          try {

             rf.writeChar(0xFEFF);

             rf.writeChars(message);//这个要根据不同的情况改变,

             rf.close();

          } catch (IOException e) {

             // TODO Auto-generated catch block

             e.printStackTrace();

          }

      } catch (FileNotFoundException e) {

          // TODO Auto-generated catch block

          e.printStackTrace();

      } 

    }

 

二,RandomAccessFile读文件函数

 

    //RandomAccessFile读文件

    public String readfile(String filename)

    {

       String str = null;

      byte[] strbuf = null;

       long  lenfile = 0 ;

        RandomAccessFile rf;

      try {

          rf = newRandomAccessFile(filename, "rw");

          try {

             lenfile = rf.length(); //得到文件长度

             int size = (int) lenfile;//强制转换类型

             strbuf = new byte[size]; //申请空间

             rf.read(strbuf, 0, size);//读文件到strbuf

             str = new String(strbuf, DEFAULT_CHARSET);

             rf.close();

          } catch (IOException e) {

             // TODO Auto-generated catch block

             e.printStackTrace();

          }

      } catch(FileNotFoundException e) {

          // TODO Auto-generated catch block

          e.printStackTrace();

      } 

      return str;

    }

 

三, 可能碰到的问题

 

(一)写出来的文件,有0X00这样的字,给人的感觉是空了一个格再写下一个字的

  在写文件时候要写一UNICODE个头rf.writeChar(0xFEFF);

  读的时候也会读到这个头的,可以跳过去的

rf.read(strbuf, 2, size-2); //size是文件的长度,不读头,就要减2,要么就有异常发生。

也可以加判断,如果有头在的就rf.read(strbuf, 2, size-2);没有头的就这样rf.read(strbuf, 0, size);

(二)参考JDK_API_1_6_zh_CN.CHMRandomAccessFile对读写文件的一些函数

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android
android获取string.xml的值
android中读写文件
Android 私有文件夹 文件的写入与读取 2
16. 文件的保存与读取
(SMATRIX知识库) DES/3DES加密算法源代码 JAVA技术知识库 Smatri...
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服