文件存储
文件存储是Android中最基本的一种数据存储方式,它不对存储内容进行任何的格式化处理,所有数据都是原封不动的保存到文件中的,因而它比较适合用于存储一些简单的文本数据或二进制文件。
数据从内存中写入硬盘时的顺序是:缓冲流->转换流->文件流,数据从硬盘中读入内存时的顺序是:文件流->转换流->缓冲流,缓冲流是字符流,文件流是字节流,所以需要转换流在中间进行转换。一般Stream为字节,Writer和Reader为字符。
存文件:利用Context类提供的openFileOutput()方法获取FileOutputSteam对象,然后借助获取到的FileOutputStream对象构建出一个OutputStreamWriter对象,再借助OutputStreamWriter对象构建出一个BufferedWriter对象,最后就可以通过BufferedWriter对象进行写操作将文本内容写入文件了。
String text = "aaaaaaaaaaa" //要存入的内容 FileOutputStream out = null; BufferedWriter writer = null; try { out = openFileOutput("textdata", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(text); }catch (IOException e){ e.printStackTrace(); }finally { try { if (writer != null){ writer.close(); } }catch (IOException e){ e.printStackTrace(); } }
- openFileOutput(String name,int mode):Context类提供的用于将数据存储到指定的文件夹中(/data/data/<packagename>/files/),返回一个FileOutputStream对象。第一个参数的要存的文件名(不包含路径),第二个参数是文件的操作模式,可以直接填0,或者具体的模式:
(1)Context.MODE_PRIVATE,默认的操作模式,当指定同一文件名时,所写的内容会覆盖原文件的内容。
(2)Context.MODE_APPEND,该模式指定的文件名已存在时,就直接往文件里面追加内容,不存在就创建新文件。
(3)Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE , 这两个模式已经不建议使用了,因为这两个模式允许其他应用程序对本程序中的文件进行读写操作,容器引起安全漏洞。
- FileOutputStream:文件流(字节输出流)
- OutputStreamWriter:转换流(字符流),是从字符流到字节流的桥梁:写入到它的字符将使用指定的字符集编码成字节。它使用的字符集可以通过名称指定,也可以明确指定,或者接受平台的默认字符集。每次对write()方法的调用都会导致对给定字符调用编码转换器。生成的字节在写入底层输出流之前先在缓冲区中累积。可以指定此缓冲区的大小,但默认情况下,它对于大多数目的都足够大。注意,传递给write()方法的字符没有缓冲。为了获得最高的效率,可以考虑将OutputStreamWriter包装在BufferedWriter中,以避免频繁的转换器调用。
- BufferedWriter:缓冲流,字符输出缓冲流,将文本写入字符输出流,缓冲字符,以便有效地写入单个字符、数组和字符串。可以指定缓冲区大小,也可以接受默认大小。提供了一个newLine()方法,它使用了由系统属性line.separator定义的平台自己的行分隔符概念。并不是所有的平台都使用换行符(‘\n‘)来结束行。因此,调用此方法终止每个输出行比直接写入换行符更可取。通常,写程序会立即将输出发送到底层字符或字节流。除非需要提示输出,否则建议将BufferedWriter包装在任何可能需要执行write()操作的Writer周围,比如FileWriters和 OutputStreamWriters。
读文件:利用Context类提供的openFileInput()方法获取FileInputSteam对象,然后借助获取到的FileInputStream对象构建出一个InputStreamReader对象,再借助InputStreamReader对象构建出一个BufferedReader对象,最后就可以通过BufferedReader对象进行读操作将读取文件内容了。
FileInputStream in = null; BufferedReader reader = null; StringBuilder content = new StringBuilder(); try { in = openFileInput("textoutput"); 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(); } } }
- openFileInput(String name):Context类提供的用于从文件中读取数据。只有一个参数就是要读取的文件名,系统会自动到/data/data/<packagename>/files/目录下读取,并返回一个FileInputStream对象。
- FileOutputStream:文件流(字节输入流)
- InputStreamReader:转换流(字符流),是从字节流到字符流的桥梁:它读取字节并使用指定的字符集将它们解码为字符。它使用的字符集可以通过名称指定,也可以明确指定,或者接受平台的默认字符集。每次调用InputStreamReader的read()方法都会导致从底层字节输入流中读取一个或多个字节。为了能够有效地将字节转换为字符,可以预先从底层流读取比满足当前读取操作所需的字节更多的字节。为了提高效率,可以考虑将InputStreamReader包装在BufferedReader中。
- BufferedReader:从字符输入流中读取文本,缓冲字符以提供对字符、数组和行的有效读取。可以指定缓冲区大小,也可以使用默认大小。默认值对于大多数目的来说都足够大了。通常,读取器发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。因此,建议在任何读取()操作开销较大的阅读器(如文件阅读器和inputstreamreader)周围包装一个BufferedReader。