Android 读写文件操作程序

 更新时间:2016年9月20日 19:59  点击:2062
现在安卓手机开发的人群越来越多了,下面我来介绍很基础的android文件操作之文件读写操作,有需要学习了解的朋友可参考本文章。
 代码如下 复制代码

数据存储与访问常用方式:
文件
SharedPreferences(偏好参数设置)
SQLite数据库
内容提供者(Content provider)
网络

Activity(Context)
Context.getCacheDir()方法用于获取/data/data/<package name>/cache目录
Context.getFilesDir()方法用于获取/data/data/<package name>/files目录

Activity(Context)提供了openFileOutput(filename,mode)方法用于把数据输出到文件中;
第一个参数用于指定文件名称,不能包含路径分隔符‘/'
第二个参数为操作模式:
Context.MODE_PRIVATE:私有操作模式创建出来的文件只能被本程序访问,如果文件不存在,会自动创建,另外:写入文件中的内容会覆盖原文件的内容;
Context.MODE_APPEND:模式会检查文件是否存在,如果存在则会追加内容,否则创建新文件;
Context.MODE_READABLE:表示当前文件可以被其它应用读取;
Context.MODE_WRITEABLE:表示当前文件可以被其它应用写入;

如果希望文件被其它应用读和写:传入(Context.MODE_READABLE+Context.MODE_WRITEABLE)
FileOutputStream outStream = context.openFileOutput(filename,Context.MODE_PRIVATE);

例子

//写数据
public void writeFile(String fileName,String writestr{
  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){
  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;

}  

//param 文件名称,操作方式

android有一套自己的安全模型,当应用程序(.apk)在安装时系统会分配给一个userid,当该应用去访问其它资源如文件的时候,会进行 userid的匹配,默认情况下任何应用创建的文件,sharedpreferences,数据库都是私有的(创建的文件保存在/data/data /<package name>/files目录下),只有指定操作模式为外部可读或写才可以被其它程序访问;

读取文件:

<1>
FileInputStream inStream = context.openFileInput(filename);
Log.i(TAG,inStream....)

<2>
path="/data/data/<package name>/files/hello.txt";
File file = new File(path);
FileInputStream inStream = new FileInputStream(file);
Log.i(TAG,inStream....)

ctrl + shift + x/y 大小写

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

现在我来给大家总结一个实例

 代码如下 复制代码

/**
 * 【文件操作】
 */
package Iwit.IwitTest;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import android.content.Context;
import android.widget.Toast;

/**
 * @author Shine
 *【文件读,写】
 */
public class FileOperate

 /**
  * 【读取文件】
  * @param context
  * @param fileName
  * @return
  */
 public String ReadText(Context context,String fileName)
 {
       FileInputStream fIn = null;
       InputStreamReader isr = null;      
       char[] inputBuffer = new char[255];
       String data = null;      
       try
       {
        fIn =context.openFileInput(fileName);     
           isr = new InputStreamReader(fIn);
           isr.read(inputBuffer);
           data = new String(inputBuffer);
           Toast.makeText(context, "read Succeed",Toast.LENGTH_SHORT).show();
       }
      catch (Exception e)
          {     
       e.printStackTrace();
       Toast.makeText(context, " not read",Toast.LENGTH_SHORT).show();
          }
       finally
       {
              try {
                     isr.close();
                     fIn.close();
                   }
              catch (IOException e)
              {
                    e.printStackTrace();
              }
           }
       return data;
   }
 
 /**
  * 【写入文件】
  * @param context
  * @param fileName
  * @param data
  */
 public void WriteText(Context context, String fileName,String data)
 {
       FileOutputStream fOut = null;
       OutputStreamWriter osw = null;
      
       try{
        fOut =context.openFileOutput(fileName, 1);
           osw = new OutputStreamWriter(fOut);
           osw.write(data);
           osw.flush();
           Toast.makeText(context, " saved",Toast.LENGTH_SHORT).show();
           }
           catch (Exception e)
           {     
           e.printStackTrace();
           Toast.makeText(context, " not saved",Toast.LENGTH_SHORT).show();
           }
           finally
           {
              try {
                     osw.close();
                     fOut.close();
                   }
              catch (IOException e)
               {
                    e.printStackTrace();
                 }
           }
  }
}

上面就可以实现对文件的读写操作了

SQLite 事务处理和我们在mysql中事物处理原理差不多可以大批量处理数据并且可以回滚,下面小编给大家来介绍Android SQLite 事务处理用法,有需要了解的机友可参考。

.使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。

 

 代码如下 复制代码
public void payment() {
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
db.beginTransaction();//开始事务
try {
db.execSQL("update person set amount=amount-10 where personid=2");
db.execSQL("update person set amount=amount+10 where personid=5");
db.setTransactionSuccessful();// 设置事务的标志为true,调用此方法会在执行到endTransaction()方法是提交事务,若没有调用此方法会在执行到endTransaction()方法回滚事务。
} catch (SQLException e) {
} finally {
db.endTransaction();
}
// 结束事务,有两种情况:commit,rollback,
// 事务的提交或回滚是由事务的标志决定的,如果事务的标志为true就会提交,否则回滚,默认情况下事务的标志为false
}

应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始5000条记录也就是要5000次读写磁盘操作。
而且不能保证所有数据都能同时插入

加事务处理,把5000条插入作为一个事务


我们使用SQLite的事务进行控制:

 代码如下 复制代码
        db.beginTransaction();  //手动设置开始事务
        try{
            //批量处理操作
            for(Collection c:colls){
                insert(db, c);
            }
            db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交
           }catch(Exception e){
               MyLog.printStackTraceString(e);
           }finally{
               db.endTransaction(); //处理完成
           }
无线网络通常我们讲到的是wifi网络,也就是大家笔记本电脑上的网,下面我来介绍小米2手机怎么连接无线网络吧,有需要的朋友可参考。

1、在你小米手机中点击“系统”-“WLAN”如下图所示。

小米2手机怎么连接无线网络

2、然后我们再点击“WLAN”和“自动搜索”功能

小米2手机怎么连接无线网络

3、点击自动搜索之后小米手机就会自动搜索附近可以连接wifi网络了解。

小米2手机怎么连接无线网络

4、找到可连接的网络之后我们再点击wifi然后再输入密码即可连接了。

小米2手机怎么连接无线网络

手机wifi连接上但不能上网怎么办呢,下面我来总结关于导致wifi连接上了但是无法上网的原因分析与解决方法介绍,有碰到此类问题的朋友可进入参考。

连接wifi不能上网

好的,第一步,我们先来确定无线路由器已经设定成功了。验证的方法的话,可以先在笔记本电脑上查看一下有没有我们的WIFI信号

 看到有WIFI信号是第一步。第二步的话需要看一下这个信号是不是实际来自宽带网络,还是只是路由器的一厢情愿。验证方法是点击连接,让笔记本连接WIFI,输入设定的密码,如果有密码的话,打开百度首页


 完成了上面的步骤之后,说明我们的WIFI信号已经完全没有问题。坐等接入新的移动设备。
好的,现在的问题是,我们手机明明显示已经接入WIFI信号了。可是还是上不了网,或者网速像蜗牛。点击进入WIFI设置,先看看是不是我们的WIFI信号

 是啊,现在大家的WIFI信号那么多,还有那么多的干扰,移动的联通的“免费”的信号,很有可能自动接入的不是我们自己的WIFI信号。这时候只要及时点击选着我们的WIFI登录即可
好的,还有一种情况就是,明明连接的也是我们的账号,笔记本可以上网,可是手机的速度还是很慢很慢。怎么办?处理办法是这样的:首先确认你的其他启动设备没有过多的占用网速,可以先关闭它们试试

 如果这一招还不管用,那么先试试重启一下我们的手机,或者关闭WIFI之后重新连接
如果步骤7还是不成功的话,我们需要使用杀手锏,那就是关闭无线路由器,让它休息10分钟。十分钟之后重新打开无线路由器电源。因为路由器经过长时间的使用难免出现状况。

wifi连接不上原因分析

检查附近的热点环境,确保手机处于wifi信号覆盖范围内。针对这种情况,一般在打开wifi的时候,会有附近热点的提示信息,如果没有提示信息,就可以确定附近没有热点,此时,应当重新配置热点。

 确保你的操作步骤正确。具体操作方法是:进入手机设置 -> 无线网络设置 -> WLAN(勾选),进入“WLAN设置”在出现的列表中搜索到周边存在的无线局域网络,点击连接,输入密码,确定即可。

 关闭并重启WiFi连接:    用手机上网,手机中会保留一个由WiFi连接分配的网络IP地址,它会被应用到当前Wi-Fi中,如果没有出现地址冲突,就不用担心,如果有冲突就得关闭并重启WiFi连接。方法如下:  打开手机菜单,进入“设置”栏,选择“无线和网络设置”,进入“Wi-Fi设置”项目,在新窗口中选择“关闭Wi-Fi”,在完成关闭操作后,重新进入该项目,选择“打开Wi-Fi”,即可重启Wi-Fi连接.
查看Wi-Fi高级设置:有时在问题还未解决的情况下,下面要做的就是进入安卓手机Wi-Fi的高级设置进行相关设置了。    打开手机菜单,进入“设置”窗口,选择“无线和网络”,进入“Wi-Fi设置”,然后进入“高级”选项,进入“代理服务器设置”,确认安卓设备没有使用代理服务器,如果在代理部分发现IP地址或者域名的话,将其删除,即可解决Wi-Fi连接故障
硬件替换法:先更换其他智能手机移动终端测试(Andriod系统手机为最佳),连接相同无线路由器,以确定是否能正常访问网络,该路由器是否支持上网功能;借此来判断不能上wifi的问题所在。


关闭Wi-Fi休眠策略:如果Wi-Fi经常出现问题的话,使用者应该尝试将WiFi休眠策略设置为“从不”,看看问题会不会消失。如果将该策略设置为“从不”的话,耗费的电力将会上升,但是从另外的方面来看,这也会让Wi-Fi连接更稳定。

设置静态IP地址:还有一种解决方法就是为安卓设备设置静态IP地址。这表明用户需要连接的路由器上可能存在DHCP地址分配方面的问题,或者设备获得了错误的地址。为了设置静态IP地址,需要进入静态IP地址设置栏将信息输入进去(IP地址、网关、子网掩码、DNS等项目)。     设置静态IP地址的唯一问题是它将适用于所有的Wi-Fi,因此只有在用户仅仅连接到一张Wi-Fi上的情况时,才能使用这种方法解决问题。

本文章来给各位朋友介绍两种方法快速进行小米手机的recovery模式,小米手机本身自带了一个图形界面进入recovery模式的,还有一个就是安卓手机常用的技巧了。

方法一:MIUI桌面>工具>系统更新>点菜单键,选择“重启到Recovery”,确定之后即进入Recovery。

方法二:关机状态下,按住音量增加键和关机键,等出现开机画面时松手,即可进入Recovery。

[!--infotagslink--]

相关文章

  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • nodejs文件操作模块FS(File System)常用函数简明总结

    件系统操作相关的函数挺多的。首先可以分为两大类。一类是异步+回调的。 一类是同步的。在这里只对异步的进行整理,同步的只需要在函数名称后面加上Sync即可1. 首先是一类最常规的读写函数,函数名称和形式,应该是起源于C...2014-06-07
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • Android 实现钉钉自动打卡功能

    这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15
  • Android 开发之布局细节对比:RTL模式

    下面我们来看一篇关于Android 开发之布局细节对比:RTL模式 ,希望这篇文章对各位同学会带来帮助,具体的细节如下介绍。 前言 讲真,好久没写博客了,2016都过了一半了,赶紧...2016-10-02
  • Android中使用SDcard进行文件的读取方法

    首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20
  • Android开发之PhoneGap打包及错误解决办法

    下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
  • 用Intel HAXM给Android模拟器Emulator加速

    Android 模拟器 Emulator 速度真心不给力,, 现在我们来介绍使用 Intel HAXM 技术为 Android 模拟器加速,使模拟器运行度与真机比肩。 周末试玩了一下在Eclipse中使...2016-09-20
  • Android判断当前屏幕是全屏还是非全屏

    在安卓开发时我碰到一个问题就是需要实现全屏,但又需要我们来判断出用户是使用了全屏或非全屏了,下面我分别找了两段代码,大家可参考。 先来看一个android屏幕全屏实...2016-09-20
  • Android开发中布局中的onClick简单完成多控件时的监听的利与弊

    本文章来为各位介绍一篇关于Android开发中布局中的onClick简单完成多控件时的监听的利与弊的例子,希望这个例子能够帮助到各位朋友. 首先在一个控件加上这么一句:and...2016-09-20