您的位置:首页 > 编程语言 > Java开发

openFileInput()和 openFileOutput()方法利用java流将数据存储到文件中

2016-01-03 16:43 621 查看
     Context 类中提供了一个 openFileOutput ()方法,可以用于将数据存储到指定的文件中。

这个方法接收两个参数,第一个参数是文件名,在文件创建的时候使用的就是这个名称,注

意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<package

name>/files/ 目 录下 的 。第 二 个 参数 是 文件 的 操作 模 式 ,主 要 有两 种 模式 可 选 ,

MODE_PRIVATE 和 MODE_APPEND。其中 MODE_PRIVATE 是默认的操作模式,表示当指

定同样文件名的时候,所写入的内容将会覆盖原文件中的内容,而 MODE_APPEND 则表示

如果该文件已存在就往文件里面追加内容,不存在就创建新文件。其实文件的操作模式本来

还有另外两种,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE,这两种模

式表示允许其他的应用程序对我们程序中的文件进行读写操作,不过由于这两种模式过于危
险,很容易引起应用的安全性漏洞,现已在 Android 4.2 版本中被废弃。

openFileOutput ()方法返回的是一个 FileOutputStream 对象,得到了这个对象之后就可以

使用 Java 流的方式将数据写入到文件中了。以下是一段简单的代码示例,展示了如何将一
段文本内容保存到文件中:

public void save() {

String data = "Data to save";

FileOutputStream out = null;

BufferedWriter writer = null;

try {

out = openFileOutput("data", Context.MODE_PRIVATE);

writer = new BufferedWriter(new OutputStreamWriter(out));

writer.write(data);

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (writer != null) {

writer.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

如果你已经比较熟悉 Java 流了,理解上面的代码一定轻而易举吧。这里通过

openFileOutput()方法能够得到一个 FileOutputStream 对象,然后再借助它构建出一个

OutputStreamWriter 对象,接着再使用 OutputStreamWriter 构建出一个 BufferedWriter 对象,
这样你就可以通过 BufferedWriter 来将文本内容写入到文件中了。

下面一个完整的简单例子能带你学习一下基础的数据存储技术

首先创建一个 FileTest 项目,并修改 activity_main.xml 中的代码,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent" >

<EditText

android:id="@+id/edit"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="Type something here"

/>

</LinearLayout>

这里只是在布局中加入了一个 EditText,用于输入文本内容。其实现在你就可以运行一

下程序了,界面上肯定会有一个文本输入框。然后在文本输入框中随意输入点什么内容,再

按下 Back 键,这时输入的内容肯定就已经丢失了,因为它只是瞬时数据,在活动被销毁后

就会被回收。而这里我们要做的,就是在数据被回收之前,将它存储到文件当中。修改

MainActivity 中的代码,如下所示:

public class MainActivity extends Activity {

private EditText edit;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

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

}

@Override

protected void onDestroy() {

super.onDestroy();

String inputText = edit.getText().toString();

save(inputText);

}

public void save(String inputText) {

FileOutputStream out = null;

BufferedWriter writer = null;

try {

out = openFileOutput("data", Context.MODE_PRIVATE);

writer = new BufferedWriter(new OutputStreamWriter(out));

writer.write(inputText);

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (writer != null) {

writer.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

可以看到,首先我们在 onCreate()方法中获取了 EditText 的实例,然后重写了 onDestroy()

方法,这样就可以保证在活动销毁之前一定会调用这个方法。在 onDestroy()方法中我们获取

了 EditText 中输入的内容,并调用 save()方法把输入的内容存储到文件中,文件命名为 data。

save()方法中的代码和之前的示例基本相同,这里就不再做解释了。现在重新运行一下程序,

并在 Editext 中输入一些内容。

然后按下 Back 键关闭程序,这时我们输入的内容就已经保存到文件中了。那么如何才

能证实数据确实已经保存成功了呢?我们可以借助 DDMS 的 File Explorer 来查看一下。切换

到 DDMS 视图 ,并 点击 File Explorer 切换 卡, 在这 里进 入到/data/data/com.example.

filepersistencetest/files/目录下,可以看到生成了一个 data文件。(图略)

从文件中读取数据

类似于将数据存储到文件中,Context 类中还提供了一个 openFileInput()方法,用于从文

件中读取数据。这个方法要比 openFileOutput()简单一些,它只接收一个参数,即要读取的文

件名,然后系统会自动到/data/data/<package name>/files/目录下去加载这个文件,并返回一个

FileInputStream 对象,得到了这个对象之后再通过 Java 流的方式就可以将数据读取出来了。

修改MainActivity中的代码,代码示例如下:

public class MainActivity extends Activity {
private EditText edit;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content);
edit = (EditText) findViewById(R.id.edit);
String inputText = load();
if (!TextUtils.isEmpty(inputText)) {
edit.setText(inputText);
edit.setSelection(inputText.length());
Toast.makeText(this, "Restoring succeeded",
Toast.LENGTH_SHORT).show();
}
}

@Override
protected void onDestroy() {
super.onDestroy();
String inputText = edit.getText().toString();
save(inputText);
}

public void save(String inputText) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

public String load() {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
}

在 onCreate()方法中调用 load()方法来读取文件中存储

的文本内容,如果读到的内容不为空,就调用 EditText 的 setText()方法将内容填充到 EditText

里,并调用 setSelection 方法将输入光标移动到文本的末尾位置以便于继续输入,然后弹出

一句还原成功的提示。

注意上述代码在对字符串进行非空判断的时候使用了 TextUtils.isEmpty()方法,这是一

个非常好用的方法,它可以一次性进行两种空值的判断。当传入的字符串等于 null或者等于

空字符串的时候,这个方法都会返回 true,从而使得我们不需要单独去判断这两种空值,再

使用逻辑运算符连接起来了。

现在重新运行一下程序,刚才保存的 Content 字符串肯定会被填充到 EditText 中,然后

编写一点其他的内容,比如在 EditText 中输入 Hello,接着按下 Back 键退出程序,再重新启

动程序,这时刚才输入的内容并不会丢失,而是还原到了 EditText中。

好的,上面的小例子就完成了,所用到的核心技术就是 Context

类中提供的 openFileInput()和 openFileOutput()方法,之后就是利用 Java 的各种流来进行读写

操作就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: