针对 Android 基础教程中的数据存储之文件存储一章,我会给出完整的攻略,以及至少两条示例说明。
一、数据存储之文件存储
Android 系统提供了多种数据存储技术,其中文件存储技术是比较常用的一种。文件存储主要用于存储一些非结构化的数据,如图片、音频和视频等。文件存储可以分为内部存储和外部存储两种,其中内部存储又分为应用程序私有存储和应用程序公有存储两种形式。
本文将以应用程序私有存储的方式,实现文件的读取和写入。
1.文件存储方法
应用程序私有存储主要通过上下文对象Context
提供的openFileInput()
和openFileOutput()
方法实现,其中openFileInput()
用于读取存储在Android文件系统中的文件,而openFileOutput()
方法用于创建写入的文件,并且可以选择是否追加内容。
2.读取文件
刚才提到了openFileInput()
方法可以用来读取已经存储的文件,下面给出具体的代码示例:
public String read() {
FileInputStream in;
BufferedReader reader;
StringBuilder content = new StringBuilder();
try {
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line;
// 使用reader对象逐行读取文件内容
while ((line = reader.readLine()) != null) {
content.append(line);
}
reader.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return content.toString();
}
上述代码中,首先通过openFileInput()
方法获取FileInputStream
对象,然后再通过BufferedReader
逐行读取文件内容,读取完毕后,关闭文件输入流和BufferedReader
对象,并将读取的数据以字符串的形式返回给调用者。
需要注意的是,openFileInput()
返回的是字节流的形式,因此需要通过InputStreamReader
将其转化为字符流,并且由于BufferedReader
可以逐行读取内容,因此它也要参与到字符流转化中。
3.写入文件
应用程序私有存储还允许将文件写入到Android文件系统之中,下面给出具体的代码示例:
public void save(String inputText) {
FileOutputStream out;
BufferedWriter writer;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
// 将传入的字符串写入到文件中
writer.write(inputText);
writer.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
上述代码中,首先通过openFileOutput()
方法创建一个FileOutputStream
对象,然后通过BufferedWriter
将要写入的内容逐行添加到这个FileOutputStream
中。最后关闭文件输出流和BufferedWriter
,完成写入操作。
和读取文件的过程类似,写入文件的过程也需要先将字节流转化为字符流,因此在创建BufferedWriter
对象时,也要使用OutputStreamWriter
将字节流转化为字符流。
二、示例说明
下面给出一个使用应用程序私有存储进行文件读写的简单示例:
首先创建一个按钮,使用该按钮执行写入操作:
<Button
android:id="@+id/save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save to File" />
在对应的 Activity 中,添加如下代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText edit;
private Button btnSave, btnLoad;
private FileService service;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = findViewById(R.id.edit);
btnSave = findViewById(R.id.save);
btnLoad = findViewById(R.id.load);
btnSave.setOnClickListener(this);
btnLoad.setOnClickListener(this);
service = new FileService(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.save:
final String inputText = edit.getText().toString();
service.save(inputText);
break;
case R.id.load:
String data = service.read();
if (!TextUtils.isEmpty(data)) {
edit.setText(data);
// 将光标移到末尾
edit.setSelection(data.length());
}
break;
default:
break;
}
}
}
在上述代码中,我们创建了一个FileService
类,用于封装对文件的读写操作。当用户按下“Save to File”按钮时,我们获取输入框中的内容,并调用FileService
类的save()
方法将该内容写入到文件中。当用户按下“Load from File”按钮时,则调用FileService
类的read()
方法从文件中读取保存的内容并显示到输入框中。
另外一个示例是实现将图片写入到文件系统中:
private void saveImageToExternalStorage(Bitmap finalBitmap, String dirName, String fileName) {
String root = Environment.getExternalStorageDirectory().toString();
//创建目录
File dir = new File(root + "/" + dirName);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, fileName);
if (file.exists()) {
file.delete();
}
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
上述代码中,我们使用了Environment.getExternalStorageDirectory()
获取了外部存储的文件根目录。然后通过创建File
对象的形式,创建要存储的路径和文件,并将这个File
对象传给FileOutputStream
。最后,通过Bitmap
的压缩功能将图片压缩为PNG格式并写入到外部存储中。
以上是 Android 基础教程数据存储之文件存储的完整攻略和两个示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android基础教程数据存储之文件存储 - Python技术站