android应用私有存储文件的写入与读取-openFileInput 和 openFileOutput

   在介绍如何在Android平台下进行文件的读取之前,有必要了解Android平台下的数据存储规则。在其他的操作系统如Windows 平台下,应用程序可以自由地或者在特定的访问权限基础上访问或修改其他应用程序名下的文件等资源,而在Android平台下,一个应用程序中所有的数据都是私有的。

   当应用程序被安装到系统中后,其所在的包会有一个文件夹用于存放自己的数据,只有这个应用程序才有对这个文件夹的写入权限,这个私有的文件夹位于Android系统的/data/data/<应用程序包名>目录下,其他的应用程序都无法再这个文件夹中写入数据。除了存放私有的数据文件夹外,应用程序也具有SD卡的写入权限。

   使用文件I/O 方法可以直接往手机中存储数据,默认情况下这些文件不可以被其他的应用程序访问。Android平台支持 java平台下的 文件I/O操作, 主要使用FileInputStream 和 FileOutputStream 这两个类来实现文件的存储与读取。获取这两个类对象的方式有两种。
  一:第一种方式就是像Java平台下的实现方式一样通过构造器直接创建,如果需要向打开的文件末尾写入数据,可以通过使用构造器FileOutputStream(File file, boolean append)将 append设置为true来实现。不过需要注意的是采用这种方式获得FileOutputStream 对象时如果文件不存在或不可写入时,会抛出 FileNotFoundException 异常。

  二:第二种获取 FileInputStream 和 FileOutputStream 对象的方式是调用 Context.openFileInput 和 Context.openFileOutput两个方法来创建。除了这两个方法外,Context对象还提供了其他几个用于对文件操作的方法,如下所示


Context对象中文操作的API及说明

方法名 
说明
openFileInput(String filename) 
打开应用程序私有目录下的的指定私有文件以读入数据,返回一个FileInputStream 对象
openFileOutput

打开应用程序私有目录下的的指定私有文件以写入数据,返回一个FileOutputStream 对象,

如果文件不存在就创建这个文件。

fileList() 
搜索应用程序私有文件夹下的私有文件,返回所有文件名的String数组
deleteFile(String fileName) 删除指定文件名的文件,成功返回true,失败返回false


在使用openFileOutput方法打开文件以写入数据时,需要指定打开模式。默认为零,即MODE_PRIVATE。不同的模式对应的的含义如下:

openFileOutput方法打开文件时的模式

常量  
含义
MODE_PRIVATE 
默认模式,文件只可以被调用该方法的应用程序访问
MODE_APPEND  
如果文件已存在就向该文件的末尾继续写入数据,而不是覆盖原来的数据。
MODE_WORLD_READABLE 
赋予所有的应用程序对该文件读的权限。
MODE_WORLD_WRITEABLE  
赋予所有的应用程序对该文件写的权限。


   下面通过一个小例子来说明Android平台下的文件I/O 操作方式,主要功能是在应用程序私有的数据文件夹下创建一个文件并读取其中的数据显示到屏幕的 TextView中,这个例子也比较简单只有一个类。
先看一下运行后的效果吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package jcodecraeer.com;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.http.util.EncodingUtils;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TextView;
public class Activity01 extends Activity{
     //常量,为编码格式
     public static final String ENCODING = "UTF-8" ;
     //定义文件的名称
     String fileName = "test.txt" ;
     //写入和读出的数据信息
     String message = "欢迎大家来www.jcodecraeer.com" ;
     TextView textView;
      @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.main);
         writeFileData(fileName, message);
         String result = readFileData(fileName);
         textView = (TextView)findViewById(R.id.tv);
         textView.setTextColor(Color.GREEN);
         textView.setTextSize(20.0f);
         textView.setText(result);
                           
     }
      //向指定的文件中写入指定的数据
      public void writeFileData(String filename, String message){
          try {
             FileOutputStream fout = openFileOutput(filename, MODE_PRIVATE); //获得FileOutputStream
             //将要写入的字符串转换为byte数组
             byte[]  bytes = message.getBytes();
             fout.write(bytes); //将byte数组写入文件
             fout.close(); //关闭文件输出流
         } catch (Exception e) {
             e.printStackTrace();
         }
      }
                        
      //打开指定文件,读取其数据,返回字符串对象
      public String readFileData(String fileName){
          String result= "" ;
          try {
             FileInputStream fin = openFileInput(fileName);
             //获取文件长度
             int lenght = fin.available();
             byte[] buffer = new byte[lenght];
             fin.read(buffer);
             //将byte数组转换成指定格式的字符串
             result = EncodingUtils.getString(buffer, ENCODING);
         } catch (Exception e) {
             e.printStackTrace();
         }
         return result;
      }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据来源:中经数据库 主要指标110多个(全部都是纯粹的 市辖区 指标),大致是: GDP GDP增速 第一产业增加值占GDP比重 第二产业增加值占GDP比重 第三产业增加值占GDP比重 人均GDP 社会消费品零售总额 固定资产投资(不含农户) 新设外商投资企业数_外商直接投资 实际利用外资金额(美元) 一般公共预算收入 一般公共预算支出 一般公共预算支出_教育 一般公共预算支出_科学技术 金融机构人民币各项存款余额_个人储蓄存款 金融机构人民币各项存款余额 金融机构人民币各项贷款余额 规模以上工业企业单位数 规模以上工业企业单位数_内资企业 规模以上工业企业单位数_港澳台商投资企业 规模以上工业企业单位数_外商投资企业 规模以上工业总产值 规模以上工业总产值_内资企业 规模以上工业总产值_港澳台商投资企业 规模以上工业总产值_外商投资企业 规模以上工业企业流动资产合计 规模以上工业企业固定资产合计 规模以上工业企业利润总额 规模以上工业企业应交增值税 规模以上工业企业主营业务税金及附加 户籍人口数 年均户籍人口数 户籍人口自然增长率 第一产业就业人员占全部城镇单位就业人员比重 第二产业就业人员占全部城镇单位就业人员比重 第三产业就业人员占全部城镇单位就业人员比重 城镇非私营单位就业人员数 城镇非私营单位就业人员数_第一产业 城镇非私营单位就业人员数_第二产业 城镇非私营单位就业人员数_第三产业 城镇非私营单位就业人员数_农、林、牧、渔业 城镇非私营单位就业人员数_采矿业 城镇非私营单位就业人员数_制造业 城镇非私营单位就业人员数_电力、热力、燃气及水生产和供应业 城镇非私营单位就业人员数_建筑业 城镇非私营单位就业人员数_批发和零售业 城镇非私营单位就业人员数_交通运输、仓储和邮政业 城镇非私营单位就业人员数_住宿和餐饮业 城镇非私营单位就业人员数_信息传输、软件和信息技术服务业 城镇非私营单位就业人员数_金融业 城镇非私营单位就业人员数_房地产业 城镇非私营单位就业人员数_租赁和商务服务业 城镇非私营单位就业人员数_科学研究和技术服务业 城镇非私营单位就业人员数_水利、环境和公共设施管理业 城镇非私营单位就业人员数_居民服务、修理和其他服务业 城镇非私营单位就业人员数_教育 城镇非私营单位就业人员数_卫生和社会工作 城镇非私营单位就业人员数_文化、体育和娱乐业 城镇非私营单位就业人员数_公共管理、社会保障和社会组织 城镇非私营单位在岗职工平均人数 城镇就业人员数_私营企业和个体 城镇非私营单位在岗职工工资总额 城镇非私营单位在岗职工平均工资 城镇登记失业人员数 建成区面积 建设用地面积 建设用地面积_居住用地 液化石油气供气总量 液化石油气供气总量_居民家庭 人工煤气、天然气供气总量 人工煤气、天然气供气总量_居民家庭 液化石油气用气人口 人工煤气、天然气用气人口 城市公共汽电车运营车辆数 城市出租汽车运营车辆数 城市公共汽电车客运总量 道路面积 排水管道长度 建成区绿化覆盖面积 建成区绿化覆盖率 绿地面积 公园绿地面积 维护建设资金支出 土地面积 生活用水供水量 供水总量 全社会用电量 城乡居民生活用电量 工业生产用电量 房地产开发投资 房地产开发投资_住宅 限额以上批发和零售业法人单位数 限额以上批发和零售业商品销售总额 普通中学学校数 中等职业教育学校数 普通小学学校数 普通高等学校专任教师数 普通中学专任教师数 中等职业教育专任教师数 普通小学专任教师数 普通高等学校在校生数 普通中学在校生数 中等职业教育在校生数 普通小学在校生数 电视节目综合人口覆盖率 公共图书馆总藏量_图书 医疗卫生机构数_医院和卫生院 卫生人员数_执业(助理)医师 医疗卫生机构床位数_医院和卫生院 城镇职工基本养老保险参保人数 职工基本医疗保险参保人数 失业保险参保人数
Android Studio中存储文件有多种方式,包括内部存储、外部存储、SQLite数据库等。下面是一些常用的方法: 1. 内部存储 使用内部存储可以将文件保存在应用程序私有目录中,其他应用程序无法访问该目录。以下是一些示例代码: - 写入文件: ```java String filename = "myfile"; String fileContents = "Hello world!"; try (FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE)) { fos.write(fileContents.getBytes()); } catch (IOException e) { e.printStackTrace(); } ``` - 读取文件: ```java String filename = "myfile"; try (FileInputStream fis = openFileInput(filename)) { InputStreamReader inputStreamReader = new InputStreamReader(fis); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line).append('\n'); } String fileContents = stringBuilder.toString(); } catch (IOException e) { e.printStackTrace(); } ``` 2. 外部存储 使用外部存储可以将文件保存在SD卡中,其他应用程序也可以访问该目录。以下是一些示例代码: - 检查是否有权限: ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); } ``` - 写入文件: ```java File file = new File(Environment.getExternalStorageDirectory(), "myfile"); String fileContents = "Hello world!"; try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(fileContents.getBytes()); } catch (IOException e) { e.printStackTrace(); } ``` - 读取文件: ```java File file = new File(Environment.getExternalStorageDirectory(), "myfile"); try (FileInputStream fis = new FileInputStream(file)) { InputStreamReader inputStreamReader = new InputStreamReader(fis); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line).append('\n'); } String fileContents = stringBuilder.toString(); } catch (IOException e) { e.printStackTrace(); } ``` 3. SQLite数据库 SQLite是一种轻量级的关系型数据库,常用于存储结构化的数据。以下是一些示例代码: - 创建数据库: ```java public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "mydatabase.db"; private static final int DATABASE_VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS mytable (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS mytable"); onCreate(db); } } ``` - 插入数据: ```java MyDatabaseHelper dbHelper = new MyDatabaseHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "John"); values.put("age", 25); db.insert("mytable", null, values); db.close(); ``` - 查询数据: ```java MyDatabaseHelper dbHelper = new MyDatabaseHelper(this); SQLiteDatabase db = dbHelper.getReadableDatabase(); String[] projection = {"_id", "name", "age"}; Cursor cursor = db.query("mytable", projection, null, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); } cursor.close(); db.close(); ``` 希望这些示例代码能够帮助你在Android Studio中存储文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值