当前位置: 首页 > 编程日记 > 正文

安卓学习-其他-文件读写

在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的操作,请看下面的测试代码:

//其中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;}    

转载时请注明出处:http://blog.csdn.net/ztp800201/article/details/7322110


总结:

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)函数来实现文件的随机读取。

转载于:https://www.cnblogs.com/weijj/p/4195787.html

相关文章:

X5同层播放器应用实践

移动端浏览器中的video元素是比较特别的&#xff0c;早期无论是在iOS还是Android的浏览器中&#xff0c;它都位于页面的最顶层&#xff0c;无法被遮挡。后来&#xff0c;这个问题在iOS下得到了解决。但是对Android的大部分浏览器来说&#xff0c;问题仍然存在。X5是腾讯基于Web…

1007 Maximum Subsequence Sum(两种思路)

1.解法1 思路 对于动态规划来说&#xff0c;最关键的就是找到状态转移方程&#xff0c;本题设置一个前向数组&#xff0c;元素predp[i]表示的是以元素i结尾的连续数列和的最大值&#xff0c;转移方程是predp[i] max(predp[i-1]a[i],a[i])。要做的事就是完成这个dp数组&#x…

C#学习-EF在三层中使用

1.搭建普通三层 DAL层&#xff0c;BLL层&#xff0c;Model层&#xff0c;Web层&#xff1b; DAL层引用Model层 BLL层引用DAL层和Model层 Web层引用BLL层和Model层 2.实现EF三层的搭建&#xff08;添加引用&#xff0c;修改配置信息&#xff09; 2.1添加EF对象 在Model中添加一个…

各大IT公司笔试真题汇总开发人员一定要加入收藏夹的网站(收藏)

巨人网络java笔试基础题分享 http://www.coderarea.net/bbs/read.php?tid834 百度笔试题 http://www.coderarea.net/bbs/read.php?tid811 百度2010校招运维部门笔试 http://www.coderarea.net/bbs/read.php?tid779 百度2010年校园招聘软件测试笔试题 http://www.coderarea.n…

Python编写Hive UDF

2019独角兽企业重金招聘Python工程师标准>>> 1. 目的 从string类型的字段中解析并汇总每种category类型的总amount 2. 素材 表名&#xff1a;test_table order_no hotel_seq discount_detail D8662EF4E 10212527 NULL 45C024849 …

1045 Favorite Color Stripe(LIS解法)

解题思路 本题属于Longest Increasing Sequence最长不下降子序列&#xff0c;但是要注意&#xff0c;LIS当中不会有无效的元素&#xff0c;而本题是有的&#xff0c;所以先要把无效元素过滤掉&#xff0c;才能转化成为LIS问题。 这里用到了hashTable(用map更慢)&#xff0c;初…

5.8fork父子进程

实验4-2&#xff1a;fork父子进程 实验目的&#xff1a; 理解fork创建子进程的本质 实验要求&#xff1a; 1、按如下要求编写程序: &#xff08;1&#xff09;、打开一个有内容的文件; &#xff08;2&#xff09;、调用fork创建子进程; &#xff08;3&#xff09;、读文件…

word表格自动编号

选中全部内容--右键--项目符号和编号--自定义--编号样式--选01,02样式.则生成所有编号选中第二批编号,--重新编号,就又从01开始了转载于:https://www.cnblogs.com/wzshhynk/archive/2009/12/30/1635805.html

Vue API(directives) 自定义指令

前言&#xff1a;除了vue的内置指令以外&#xff0c;我们可以定义自定义指令。内置指令表相见&#xff1a;https://www.cnblogs.com/ilovexiaoming/p/6840383.html 我们定义一个最简单的 <script> export default {name: App,data(){return{yanse:red}},// 所有自定义指令…

1045 Favorite Color Stripe(LCS解法) 需再理解

解题思路 使用LCS方法解这一题&#xff0c;首先要把现有的颜色和Eva的颜色看成即将取材的序列s和e。 而且注意2个序列都要从1开始读入&#xff0c;因为递归边界&#xff08;待后叙&#xff09;。 dp[i][j]代表的是e[1]-e[i]和s[1]-s[j]的范围内&#xff0c;公共子序列的长度…

C++ primer第五版随笔--2015年1月6日

记录自己看这本书时的一些内容。 一、引用&#xff08;reference&#xff09; 引用为对象起了另外一个名字。例如&#xff1a; int ival1024&#xff1b; int &relVal1ival;//对&#xff0c;注意尽量不要用这方式&#xff1a;int& relvalival&#xff1b; int &rel…

Python性能分析指南——中

程序使用了多少内存&#xff1f;现在我们对计时有了较好的理解&#xff0c;那么让我们继续弄清楚程序使用了多少内存。我们很幸运&#xff0c;Fabian Pedregosa模仿Robert Kern的line_profiler实现了一个不错的内存分析器。首先使用pip安装:这里建议安装psutil包&#xff0c;因…

1040 Longest Symmetric String 需再做

解题思路 本题属于最长回文子串专题下。与之前的LIS和LCS的动规有两个较大的不同 1. 虽然最后也是要求长度&#xff0c;但是长度信息不再蕴含在dp数组当中&#xff0c;dp[i][j]表示的仅仅是从s[i]起s[j]止这一段是否是回文&#xff0c;所以为了提醒自己&#xff0c;我设置成了…

回顾2009,展望2010。

回顾2009&#xff0c;展望2010。 2009即将过去&#xff0c;总结2009年&#xff0c;计划2010年。 2009年12月31日。转载于:https://www.cnblogs.com/finehappy/archive/2009/12/31/1654975.html

Linux Mint 19 安装Gnome Boxes 新建失败

之前在Ubuntu论坛提出&#xff0c;一直没有解决.http://forum.ubuntu.org.cn/viewtopic.php?f65&t488821 后参照&#xff1a; https://askubuntu.com/questions/836703/ ... sue/836715对方报错&#xff1a; (gnome-boxes:15984): Boxes-WARNING **: wizard.vala:463: Fai…

1057 Stack

目录 解题思路 AC代码 解题思路 虽然题目的名字是栈&#xff0c;但是这题和栈的关系很小&#xff0c;甚至我都没有用到stack这个数据结构&#xff0c;而是用vector<int>的pop_back()来模拟栈的弹出。 主要考察的是&#xff1a;在线查询&#xff0c;也就是查询过程中…

【译】使用自定义ViewHelper来简化Asp.net MVC view的开发------part1

从开发者的角度来看&#xff0c;创建Asp.net MVC的View是一件很爽的事&#xff0c;因为你可以精确控制最终生成的HTML。具有讽刺意味的是不得不写出每一行HTML代码同时也是Asp.net MVC的View中让人不爽的地方。让我用我的一个经历来告诉我创建ASP.Net MVC view Helpers背后灵感…

看书挑剔,只看经典

如何选择经典&#xff0c;可以到网上做做功课&#xff0c;看看评价&#xff0c;综合分析一下。书籍是我们知识的主要来源。在选择书籍的时候做足功课是对我们自己时间的负责&#xff1b;这和在超市里买东西时对比各个品牌是一个道理&#xff1b;只不过奇怪的是&#xff0c;我很…

0-1背包使用一维dp数组时为何v要从大到小枚举

样例数据 5 8 3 5 1 2 2 4 5 2 1 3 如若不然&#xff0c;也就是让v按照从小到大的顺序枚举&#xff0c;就会出现 注意高亮的那一行&#xff0c;第一件物品的重量只有3&#xff0c;怎么会得到6呢&#xff1f; 代码如下 #include<cstdio> #include<cmath> #inclu…

异步编程模型--使用 IAsyncResult 对象

先推荐阅读下面的资料&#xff1a;MSDN&#xff1a;异步编程设计模式IBM developerworks&#xff1a; 使用异步 I/O 大大提高应用程序的性能参考博文&#xff1a;1、正确使用异步操作 2、Lab&#xff1a;体会ASP.NET异步处理请求的效果 3、WCF中的异步调用 4、WCF从理论到实践(…

对XX证券报关于物联网操作系统的几个问题的答复

XX证券报提问了几个关于物联网和物联网操作系统的问题&#xff0c;个人表达了一些粗陋的观点&#xff0c;在这里发表出来&#xff0c;与行业朋友交流和探讨。物联网行业最需要解决的问题是什么&#xff1f;虽然物联网这个行业被炒得比较热&#xff0c;但是截至目前&#xff0c;…

Java基础 - 面向对象 - 构造方法

在类中除了成员方法之外&#xff0c;还存在一种特殊类型的方法&#xff0c;那就是构造方法。构造方法是一个与类同名的方法&#xff0c;对象的创建就是通过构造方法完成的。每当类实例化一个对象时&#xff0c;类都会自动调用构造方法。 构造方法的特点&#xff1a; 构造方法没…

1105 Spiral Matrix 给定数组向螺旋矩阵中填入数据

两个测试用例超时&#xff0c;可直接跳转到 目录 超时点1 超时点2 ​​​​​​​ 要做的事情是&#xff0c;将数组按照非升序/降序&#xff0c;顺时针从外围到内部一圈一圈地把数据填到矩阵中&#xff0c;并打印出来。也就是将数组排好序后&#xff0c;将矩阵的坐标和数组…

一晚上就能让你小腹变小的方法 - 健康程序员,至尚生活!

仅一晚上针对小腹的锻炼就会让它明显收紧&#xff0c;很不可思议吧&#xff1f;但它确实发生了。形体教练向我们推荐&#xff1a;做30次转身运动(双手抱在脑后站立&#xff0c;迅速分别向左右两侧依次扭转上肢&#xff0c;注意不要以膝盖为轴&#xff0c;使运动轴心保持在骨盆以…

Alpha 冲刺 (2/10)

前言 队名&#xff1a;拖鞋旅游队组长博客&#xff1a;https://www.cnblogs.com/Sulumer/p/9960487.html作业博客&#xff1a;https://edu.cnblogs.com/campus/fzu/Grade2016SE/homework/2365组内情况 燃尽图任务分布github签入记录苏路明&#xff08;组长&#xff09;过去两天…

互联网对erp行业到底有什么影响

1 财务管理的影响 总账、 应收应付、资金计划&#xff0c;支付管理。 生产计划的影响。 重大的疑惑。 转载于:https://www.cnblogs.com/sdgxbooy/p/8892655.html

PAT甲级排队问题合集 (持续更新中)

已加入的习题 A1014,A1017 问题1和2共性 1. 都是排队问题 2. 都有一条黄线 3. 都需要找到最先离开人的队伍 4. 都有着服务时间段限制(迟于某个时间点来不予受理) 问题1&#xff1a;1014 Waiting in Line 问题链接&#xff1a;1014 Waiting in Line 这一题&#xff0c;…

第三章:创建用户界面组件--可视化组件(一)

1.可视化组件 1.1关于可视化组件 可视化组件的特征包括&#xff1a;size(大小&#xff09;、事件、样式、皮肤、行为。 行为&#xff1a;当组件被触发时&#xff0c;视觉&#xff0c;音乐效果的变化。 1.1 .1Spark and Halo 组件 Spark是flex 4中新加的组件。halo仍旧继承了以…

Rust 1.30带来更多元编程支持,并改进了模块系统

Rust的最新版本1.30扩展了过程宏&#xff0c;允许它们定义新的属性和类似于函数的宏。此外&#xff0c;它简化了Rust模块系统&#xff0c;使其更加一致、直观。 Rust 1.30引入了两种新类型的过程宏&#xff0c;“类属性的过程宏”和“类函数的过程宏”。过程宏是Rust元编程的基…

两种最大堆建堆方式

都是用完全二叉树的静态存储方式&#xff0c;下标从1开始。 No.1 先按照数组的次序填入完全二叉树&#xff0c;再从倒数第一个非叶子节点开始&#xff0c;一个个地看是不是要向下调整&#xff0c;一直下调到不能再调。 void downAdjust(int low,int high){int i low;int j …