• Android文件存储


    文件存储是Android中最基本的一种数据存储方式,它不读存储的内容进行任何的格式化处理,所有数据原封不动的保存在文件之中。如果想用文件存储的方式保存一些较为复杂的数据,就需要定义一套自己的格式规范,这样方便之后将数据从文件中解析出来。

    一、将数据存储到文件中

      context类提供一个openFileOutput()方法,可以用于将数据存储到指定文件中。openFileOutput()接收两个参数,第一个指定文件名,文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<package name>/files/目录下;第二个参数指定文件的操作模式,主要有两种模式可选,MODE_PRIVATE模式为默认模式,所写的内容将覆盖原文件的内容,MODE_APPEND表示如果该文件已经存在,则向文件中追加内容,如果不存在则新建一个文件。openFileOutput()返回一个FileOutputStream

      1、Java中将流分为2种,即字节流,字符流,

        字节流的中最小的字节单位是字节,而字符流的最小单位是一个字符,Java的字符采用unicode编码,一个字符占据2个字节。

        字节流:InputStream,OutputStrem,

        字符流:Reader,Writer

        

        

        2. 如何选择IO流 

            1)确定是数据源和数据目的(输入还是输出)

                      源:输入流 InputStream Reader
                      目的:输出流 OutputStream Writer

            2)明确操作的数据对象是否是纯文本

                     是:字符流Reader,Writer
                     否:字节流InputStream,OutputStream

            3)明确具体的设备。

                     是硬盘文件:File++:

                     读取:FileInputStream,, FileReader, 

                      写入:FileOutputStream,FileWriter
                     是内存用数组

                          byte[]:ByteArrayInputStream, ByteArrayOutputStream
                          是char[]:CharArrayReader, CharArrayWriter
                     是String:StringBufferInputStream(已过时,因为其只能用于String的每个字符都是8位的字符串), StringReader, StringWriter
                     是网络用Socket流

                     是键盘:用System.in(是一个InputStream对象)读取,用System.out(是一个OutoutStream对象)打印

            3)是否需要转换流

                    是,就使用转换流,从Stream转化为Reader,Writer:InputStreamReader,OutputStreamWriter 

            4)是否需要缓冲提高效率

               是就加上Buffered:BufferedInputStream, BufferedOuputStream, BuffereaReader, BufferedWriter

     二、将数据从文件中读出来

      context提供一个openFileInput()方法读取文件的内容,只有一个形参,即要读取的文件名称。返回一个FileInputStream流,通过这个流来读取文件内容。

     三、示例代码如下

          

    public class MainActivity extends AppCompatActivity {
    EditText edit1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    edit1 = (EditText) findViewById(R.id.edit1);
    String data = load();
    if(!TextUtils.isEmpty(data)){
    edit1.setText(data);
    edit1.setSelection(data.length());
    }
    }
    @Override
    protected void onDestroy() {
    super.onDestroy();
    save(edit1.getText().toString());
    }
    public void save(String data){
    BufferedWriter writer = null;
    FileOutputStream out = null;
    try {
    out = openFileOutput("storage_test",MODE_APPEND);
    writer = new BufferedWriter(new OutputStreamWriter(out));
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    try {
    writer.write(data);
    } catch (IOException e) {
    e.printStackTrace();
    }
    if (writer!=null){
    try {
    writer.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    public String load(){
    FileInputStream in = null;
    BufferedReader reader = null;
    StringBuffer content = new StringBuffer();
    try {
    in = openFileInput("storage_test");
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    reader = new BufferedReader(new InputStreamReader(in));
    String data = "";
    try {
    while ((data = reader.readLine())!=null){
    content.append(data);
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    if(reader!=null){
    try {
    reader.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    return content.toString();
    }
    }
  • 相关阅读:
    ASP.NET : 自定义HttpModule的时候要注意的问题
    ASP.NET : Win7 及 IIS 7中对于处理程序映射
    .NET : 一定不要忘记关闭DataReader对象
    IE 8 Accelerator加速器开发介绍{转载}
    .NET : CLR Profiler的使用
    .NET : 在实现WCF的双工服务时可能遇到的问题
    Silverlight学习资源
    .NET : 如何查看值类型的大小
    .NET: 如何通过AppDomain动态加载插件程序
    Web.config中的特殊字符
  • 原文地址:https://www.cnblogs.com/llxbl/p/6221026.html
Copyright © 2020-2023  润新知