基于Java语言的安卓编程之二十三文件读写(下)

时间:2021-08-25 00:47:50

上一天我们学习了通过FileOutputStream类和FileInputStream类实现文件的读写。FileOutputStream类与PrintStream类结合使用,实现写入文件的功能;FileInputStream类与StringBuilder类结合使用,实现读取文件的功能。

1 概述

今天我们继续学习文件读写,主要实现对SD卡中文件读写的实现。通过InputStreamReader类和OutputStreamWriter类实现文件的读取和写入。在写入的EditText控件中输入要写入的内容,之后点击“写入”按键,如图1所示。

基于Java语言的安卓编程之二十三文件读写(下)

图1 向SD卡中写入指定内容

然后可以在安卓系统中查看SD卡上指定文件的内容,已经变为写入的内容,如图2所示。

基于Java语言的安卓编程之二十三文件读写(下)

图2 指定文件的内容已更改

最后,点击“读出”按键,在读出的EditText控件中显示读出指定文件的内容,如图3所示。

基于Java语言的安卓编程之二十三文件读写(下)

图3 从SD卡的指定文件中读取

在“基于Java语言的安卓编程学习之文件读写(上)”的代码基础上进行修改。主要更改write()方法和read()方法,即读取数据和写入数据的方法。

2 文件写入

通过OutputStreamWriter类实现文件的写入。需要使用FileOutputStream类来定义OutputStreamWriter类。在“基于Java语言的安卓编程学习之文件读写(上)”中提到,可以使用openFileOutput()方法获取FileOutputStream类。本文将介绍另外一种获取FileOutputStream类的方法,即通过该类的构造函数来创建类的对象。

2.1 创建FileOutputStream类的对象

该类的构造函数有多种格式,其中一种格式为

publicFileOutputStream(File file)

                 throws FileNotFoundException

该函数的参数为File类的对象,并且抛出异常。因此,使用该构造函数需要使用异常处理,即try-catch语句。并且,在调用构造函数之前,需要定义File类的对象。

在write()方法中,首先写入try-catch语句,语句的格式与“基于Java语言的安卓编程学习之文件读写(上)”中介绍的代码相同。在try执行块中,首先定义File类的对象,如下所示:

    1   File targetFile = new File(FILE_NAME);

    2   targetFile.createNewFile();

在第1行中,通过new关键字定义了File类的对象targetFile,其中FILE_NAME为指定文件的路径,其定义为

private StringFILE_NAME ="/storage/sd_external/text.txt";

第2行中,通过targetFile调用File类的方法createNewFile()来创建新空文件。

接下来通过FileOutputStream类的构造函数来创建该类的对象。

FileOutputStream fOut =newFileOutputStream(targetFile);

其中,targetFile是之前创建的File类的对象。

2.2 创建OutputStreamWriter类的对象

OutputStreamWriter类的全称是java.io.OutputStreamWriter,该类派生自java.io.Writer。该类可以将字符串流转换为比特流,即如果要写入流的数据是字符串,可以通过该类将其转换为字节,并写入到流中。OutputStreamWriter类的构造函数有多个格式,其中一个格式为

publicOutputStreamWriter(OutputStream out)

使用该格式创建OutputStreamWriter类的对象。

    OutputStreamWriter myOutWriter =

                               new OutputStreamWriter(fOut);

其中,fOut是之前创建的FileOutputStream类的对象。

2.3 写入数据

可以通过OutputStreamWriter类的write()方法实现数据的写入。

myOutWriter.write(content);

其中,myOutWriter是之前创建的OutputStreamWriter类的对象,content是write()方法格式为String的参数,表示要写入到文件中的数据。

2.4 关闭Writer及stream

OutputStreamWriter以及FileOutputStream在使用完之后,需要调用类的close()方法进行关闭。

    myOutWriter.close();

fOut.close();

其中,myOutWriter是OutputStreamWriter类的对象,fOut是FileOutputStream类的对象。

3 文件读取

通过InputStreamReader类实现文件的读取。需要使用FileInputStream类来定义InputStreamReader类。

3.1 创建InputStreamReader类的对象

通过InputStreamReader类的构造函数来创建该类的对象。该类的构造函数格式为

publicFileInputStream(File file)

                throws FileNotFoundException

因此,在read()方法中,有如下代码

    1   FileInputStream fis = new FileInputStream(FILE_NAME);

    2   InputStreamReaderreader =new InputStreamReader(fis);

其中,第1行通过FileInputStream类的构造函数定义了该类的对象;第2行通过InputStreamReader类的构造函数定义了该类的对象。

3.2 读取文件

通过BufferedReader类读取指定文件。BufferedReader类将Reader与bufferer关联起来,即从Reader中读取数据保存在buffer中。该类的构造函数格式为

publicBufferedReader(Reader in)

可以通过InputStreamReader类的对象实现BufferedReader类。在read()方法中有如下代码:

BufferedReader br = newBufferedReader(reader);

其中,reader是之前创建的InputStreamReader类的对象,br即为BufferedReader类的对象。

定义了BufferedReader类的对象之后,通过该对象调用BufferedReader类的readLine()方法从文件中读取一整行的内容,该方法的返回值即为读取到的内容。

1   StringBuilderstrBuilder =newStringBuilder("");

2   Stringline = null;

3   while((line=br.readLine()) !=null )

4   {

5      strBuilder.append(line);

6   }

第1行定义了StringBuilder类的对象strBuilder,用来保存从文件中读取到的数据;第2行中定义了String类的对象line,用来保存文件中一整行的数据;第3-6行使用while语句对指定的文件进行按行读取,读到的每一行的内容都保存在strBuilder中,直到文件中所有的数据都被读出。

3.3 返回数据

read()方法的返回值即为从指定文件中读取到的数据。因为read()方法返回值的类型是String,因此,需要将StringBuilder类型转换为String类型。

1   br.close();

2   return strBuilder.toString();

其中,第1行中的br是之前定义的BufferedReader类的对象,在使用完该对象后,调用close()方法关闭;第2行中的strBuilder是之前定义的StringBuilder类的对象,通过该对象调用toString()方法,将从文件中读取到的数据转换为String类型,并且作为方法的返回值。

4 小结

今天我们学习了使用OutputStreamWriter类和InputStreamReader类实现文件读写的方法。在对文件进行写操作时,可以通过OutputStreamWriter类的write()方法实现;在对文件进行读操作时,可以通过InputStreamReader类来创建BufferedReader类的对象,通过BufferedReader类的对象调用readLine()方法实现。