上一天我们学习了通过FileOutputStream类和FileInputStream类实现文件的读写。FileOutputStream类与PrintStream类结合使用,实现写入文件的功能;FileInputStream类与StringBuilder类结合使用,实现读取文件的功能。
1 概述
今天我们继续学习文件读写,主要实现对SD卡中文件读写的实现。通过InputStreamReader类和OutputStreamWriter类实现文件的读取和写入。在写入的EditText控件中输入要写入的内容,之后点击“写入”按键,如图1所示。
图1 向SD卡中写入指定内容
然后可以在安卓系统中查看SD卡上指定文件的内容,已经变为写入的内容,如图2所示。
图2 指定文件的内容已更改
最后,点击“读出”按键,在读出的EditText控件中显示读出指定文件的内容,如图3所示。
图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()方法实现。