实验楼java输入输出流_Android上的内部存储(文件)实现

本文档详细介绍了在Android开发中使用Java的文件I/O流进行内部存储的文件读写。内容涵盖文件权限设置,使用openFileOutput()和openFileInput()方法创建文件流,以及读写文件的实现。通过示例代码展示了如何写入和读取数据,包括使用MODE_PRIVATE、MODE_APPEND等模式。
摘要由CSDN通过智能技术生成

Android上的内部存储(文件)实现

一、实验简介

本实验就将探索如何在Android开发过程中,使用Java里常用的文件I/O体系来存储和访问文件。

本章知识点

在Android中使用文件输入输出流来写入和读取文件

文件权限的设置

二、创建项目并启动模拟器

请在Android Studio中新建一个名为FileIOPractice的项目,包名可以取为com.shiyanlou.android.fileiopractice。项目基于Android 5.1版本,在创建项目时请依靠Blank Acticity模板同时生成一个名为MainActivity的类文件(上述步骤选择默认值就可以达到目的)。

等待项目创建完成。在下一个实验步骤开始前,建议在Android Studio的AVD Manager中(在Tools->Android菜单中可以找到)创建并启动好一个Android Virtual Device(AVD)模拟器。在模拟器启动的过程中,我们继续学习这个实验的内容。

如果你不是很清楚在Android Studio中如何创建Android Project项目或者创建并运行一个AVD模拟器,请参考《Android小案例 - 常用绘图方法》这个实验中的做法。

为获得更好的模拟器显示效果,请在本实验中,将AVD的屏幕缩放比例设置为默认值或者“2dp on device = 1px on screen”。

三、文件读写简介

在Java SE的学习过程中,我们就接触到了I/O流的概念,并且使用了一些文件输入输出流的API来将数据保存到文件或者是从文件中读取数据。同样,这个手段也适用于Android系统,我们可以在应用开发过程中使用文件相关的API方法。

何谓内部存储呢?实际上就是指将程序的私有数据以文件的形式存储在Android设备的内存中。同理,如果是存放在SD卡等地方,就称之为外部存储。

我们在,你需要建立文件的输入输出流,并在流中操作数据。

首先是写文件。 为了使用内部存储向文件中写入一些数据,你可以调用openFileOutput()方法,需要的参数为文件名和写入模式。写入模式实际上就是该文件的权限归属,可以是公有的,也可以是私有的。如何具体地创建一个文件输出流呢,具体方式如下:

FileOutputStream fileOut = openFileOutput("file_name",MODE_WORLD_READABLE);

//第一个参数即文件名,第二个参数表示文件存储的模式

对于第二个参数,需要补充的是:文件存储的模式公有四种:

MODE_PRIVATE:该模式是默认的,通过该模式创建的文件是私有的,即只能被应用本身访问。注意:在该模式下写入的内容会覆盖原有的内容。

MODE_APPEND:与上个模式类似,但在写入内容时会检查待创建的文件是否存在。若文件已被创建,则往该文件中追加内容,而不是覆盖原来的内容;若文件未被创建,则创建新的文件。

MODE_WORLD_READABLE:表示当前创建的这个文件允许被其他应用读取。

MODE_WORLD_WRITEABLE:表示当前创建的这个文件允许被其他应用写入。

默认情况下,不仅是应用创建的文件,包括Shared Preferences和数据库,都是私有的。那么问题来了,如果希望其他应用既能读又能写,应该怎么办呢?参考下面这种用法:

FileOutputStream fileOut = openFileOutput("file_name",MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE);

而对于openFileOutput()方法,它返回的是一个FileOutputStream实例。换言之,你通过文件输出流对象中得到了这个实例,随后你便可以调用写相关的方法来向文件写入数据。具体的用法如下:

String str = "shiyanlou";

//待写入的数据

fOut.write(str.getBytes());

//实际上写入文件的是一个字节数组,我们用gettBytes()方法将其转换成目标格式

fOut.close();

//记得写入完毕后要用close()结束

接下来是读文件。 怎样读取我们刚刚创建的这个文件呢?你应该猜到了,是使用openFileInput()方法。该方法需要填入待读取文件的文件名,同样,它返回的是一个FileInputStream的实例。具体用法如下:

FileInputStream fileIn = openFileInput(file);

在打开输入流后,你可以调用read()方法每次从文件中读出一个字符出来,然后装入一个字符串变量中。具体做法如下:

int ch;

String temp="";

while( (ch = fin.read()) != -1){

temp = temp + Character.toString((char)ch);

//不断地追加读取的内容

}

//通过一个for循环,你最后得到的temp字符串包含了文件中的所有数据

fileIn.close();

//记得要关闭输入流

除了上面我们用到的这些方法(比如write()、read()和close()),FileOutputStream和FileInputStream类中还有很多常用的方法,我们在下面作一简要介绍。

FileOutputStream类中的其它常用方法:

write(byte[] b, int off, int len):该方法从指定的字节数组开始到该文件输出流关闭写入len字节。

getChannel():该方法返回一个只读的、与文件输出流关联的文件通道对象(FileChannel)

getFD():该方法返回与此流有关的文件描述符对象(FileDescriptor)

FileInputStream类中的其它常用方法:

read(byte[] b, int off, int len):该方法从输入流中数据读取最多len个字节到字节数组

getChannel():该方法返回一个只读的、与文件输出流关联的文件通道对象(FileChannel)

getFD():该方法返回与此流有关的文件描述符对象(FileDescriptor)

available():该方法可通过一个方法的调用者从输入流中阻止这个输入流返回可以读取(或跳过)的字节数的估计值。

四、在Android上实现文件读写

下面我们通过一个实例来学习如何将Java中常用的文件读写沿用到Android中去。

实验步骤主要有:

(若你已在第二小节完成,请跳至下一步)使用Android Studio创建应用项目FileIOPractice,包名为com.shiyanlou.android.fileiopractice,基于Android 5.1制作。同时添加MainActivity及其布局资源文件。

创建并打开AVD模拟器(镜像选择API22:Android 5.1.1)。

在res/layout/activity_main.xml资源文件放入一些文本框和按钮。

在MainActivity.java中,初始化要用到的控件,添加文件读写相关的代码。

编译并运行这个应用,等待应用安装至模拟器,在模拟器中使用该应用。

现在你可以按照上述步骤自己完成该实验。下面也给出了本实验涉及到的源代码和资源文件详情,在必要时你可以使用它们。在注释中我们也对一些模块进行了详细的讲解。

以下是MainActivity的布局文件res/layout/activity_main.xml:

xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/textview_domain"

android:text="Shiyanlou.com"

android:textSize="40dp"

android:textColor="#11AA8C"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/textView_appName"

android:text="File I/O Practice"

android:layout_below="@+id/textview_domain"

android:layout_centerHorizontal="true"

android:textColor="#000000"

android:textSize="40dp" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/editText"

android:hint="Input some text here."

android:focusable="true"

android:layout_marginTop="20dp"

android:layout_below="@+id/textView_appName"

android:layout_alignEnd="@+id/textView_appName"

android:layout_alignLeft="@+id/textView_appName"

android:layout_alignStart="@+id/textView_appName"

android:layout_alignRight="@+id/textView_appName"

android:inputType="textMultiLine"

android:minLines="5"

android:background="#DDDDDD" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/textView_data"

android:text="Text would be shown here."

android:layout_below="@+id/button_save"

android:layout_marginTop="10dp"

android:layout_centerHorizontal="true" />

android:layout_width="120dp"

android:layout_height="wrap_content"

android:id="@+id/button_save"

android:text="Save File"

android:textColor="#FFFFFF"

android:background="#11AA8C"

android:layout_alignLeft="@+id/textView_appName"

android:layout_alignStart="@+id/textView_appName"

android:layout_below="@+id/editText"

android:layout_marginTop="20dp"/>

android:layout_width="120dp"

android:layout_height="wrap_content"

android:id="@+id/button_load"

android:text="Load File"

android:textColor="#FFFFFF"

android:background="#11AA8C"

android:layout_alignTop="@+id/button_save"

android:layout_alignRight="@+id/editText"

android:layout_alignEnd="@+id/editText" />

以下是src/MainActivity.java中的源代码:

package com.shiyanlou.android.fileiopractice;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

import java.io.FileInputStream;

import java.io.FileOutputStream;

public class MainActivity extends Activity {

private Button button_save;

private Button button_load;

private TextView textView_status;

private EditText editText;

//声明各个控件

private String data;

private String file = "shiyanlou_file";

//声明用于存放数据的变量data和文件名常量file

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button_save =(Button)findViewById(R.id.button_save);

button_load =(Button)findViewById(R.id.button_load);

editText =(EditText)findViewById(R.id.editText);

textView_status =(TextView)findViewById(R.id.textView_data);

//实例化各个控件

//为按钮设置点击事件监听器

//首先是保存按钮(写操作)

button_save.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

data = editText.getText().toString();

//调用getText()方法从文本框中读取内容,使用toString()方法将其转化为String类型数据,并存放到data变量中

try {

//对于文件读写操作应使用异常处理流程

FileOutputStream fileOut = openFileOutput(file, MODE_APPEND);

// 此处用到了MODE_PRIVATE,在新版本的Android系统中,不推荐使用MODE_WORLD_READABLE等模式

// 这是因为Android中为应用间的数据交互提供了更好的支持,如Content Privoder等,你可一进步了解

fileOut.write(data.getBytes());

//用write()方法保存数据

fileOut.close();

//关闭输出流

Toast.makeText(getBaseContext(), "File saving completed.", Toast.LENGTH_SHORT).show();

//用一个Toast来告诉用户已经写入完毕了

} catch (Exception e) {

e.printStackTrace();

}

}

});

//其次是读取按钮(读操作)

button_load.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

try {

//同理,建立文件输入流

FileInputStream fileIn = openFileInput(file);

int ch;

//声明一个整型变量ch用于接收数据

String tempText = "";

//这里的tempText用于临时存放读取的数据(字符串)

while ((ch = fileIn.read()) != -1) {

//这里的-1是特定的状态码,表示文件读取结束

//在while循环中逐个读取数据,并追加到tempText中

tempText = tempText + Character.toString((char) ch);

//将ch转化为字符

}

textView_status.setText(tempText);

//读取完毕后将文字显示出来

Toast.makeText(getBaseContext(), "File reading completed.", Toast.LENGTH_SHORT).show();

//同样用一个Toast告知用户已经读取完成

} catch (Exception e) {

}

}

});

}

}

检查一下代码,编译并运行该应用。在模拟器中尝试输入一些信息,保存一下,再试着读取它们。

应用运行的效果如下:

写文件:

10

读文件:

10

若你会使用Android Device Monitor,则能够在应用的数据文件夹下看到这个文件。不会用也不用担心,我们会在后续的课程里讲解如何使用它。

10

五、实验总结

在本实验中我们学习了如何在Android中建立文件的输入输出流,并且通过对流的操作方法来读取和写入数据,最后还关闭了数据流连接。而在实际的开发过程中,我们仍然建议你根据实际的需求来选择不同的数据存储模式。

参考文档

由于众所周知的原因,为了方便浏览,我们提供的是Android API的境内镜像站。如需查阅最新文档,请访问官网。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值