zoukankan      html  css  js  c++  java
  • File存储

    File存储

    openFileOutput和openFileInput

    Context提供了如下两个方法来打开本应用程序的数据文件夹里的文件IO流。

    • FileInputStream openFileInput(String name):打开应用程序的数据文件夹下的name文件对应输入流。
    • FileOutputStream openFileOutput(String name, int mode):打开应用程序的数据文件夹下的name文件对应输出流。

    上面两个方法分别用于打开文件输入流、输出流,其中第二个方法的第二个参数指定打开文件的模式,该模式支持如下值。

    • MODE_PRIVATE:该文件只能被当前程序读写。
    • MODE_APPEND:以追加方式打开该文件,应用程序可以向该文件中追加内容。
    • MODE_WORLD_READABLE:该文件的内容可以被其他程序读取。
    • MODE_WORLD_WRITEABLE:该文件的内容可由其他程序读、写。

    除此之外,Context还提供了如下两个方法来访问应用程序的数据文件夹。

    • getDir(String name, int mode):在应用程序的数据文件夹下获取或创建name对应的子目录。
    • File getFilesDir():获取该应用程序的数据文件夹的绝对路径。
    • String[] fileList():返回该应用程序的数据文件夹下的全部文件。
    • deleteFile(String):删除该应用程序的数据文件夹下的指定文件。

    下面的程序简单示范了如何读取应用程序数据文件夹内的文件。该程序的界面布局同样很简单,只包含两个文本框和两个按钮;其中第一组文本框和按钮用于处理写入,文本框用于接收用户输入,当用户按下“写入”按钮时,程序将会把数据写入文件;第二组文本框和按钮用于处理读取,当用户按下“读取”按钮时,该文本框显式文件中的数据。程序代码如下。

    public class MainActivity extends Activity {
    
        final String FILE_NAME = "zong.bin";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 获取两个按钮
            Button read = (Button) findViewById(R.id.read);
            Button write = (Button) findViewById(R.id.write);
            // 获取两个文本框
            final EditText edit1 = (EditText) findViewById(R.id.edit1);
            final EditText edit2 = (EditText) findViewById(R.id.edit2);
            // 为write按钮绑定事件监听器
            write.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 将edit1中的内容写入文件中
                    write(edit1.getText().toString());
                    edit1.setText("");
                }
            });
            read.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 读取指定文件中的内容并显示出来
                    edit2.setText(read());
                }
            });
        }
    
        private String read() {
            try {
                // 打开文件输入流
                FileInputStream fis = openFileInput(FILE_NAME);
                byte[] buff = new byte[1024];
                int hasRead = 0;
                StringBuilder sb = new StringBuilder("");
                while ((hasRead = fis.read(buff)) > 0) {
                    sb.append(new String(buff, 0, hasRead));
                }
                return sb.toString();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        private void write(String s) {
            try {
                // 以追加模式打开文件输出流
                FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);
                // 将FileOutputStream包装成PrintStream
                PrintStream ps = new PrintStream(fos);
                // 输出文件内容
                ps.println(s);
                ps.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    
    }

    示例代码下载
    应用程序的数据文件默认保存在/data/data//files目录下。

    读写SD卡上的文件

    当程序通过Context的openFileInput或openFileOutput来打开文件输入流、输出流时,程序所打开的都是应用程序的数据文件夹里的文件,这样所存储的文件大小可能比较有限——毕竟手机内置的存储空间是有限的。

    为了更好地存、取应用程序的大文件数据,应用程序需要读、写SD卡上的文件。SD卡大大扩充手机的存储能力。

    读、写SD上的文件请按如下步骤进行。

    1. 调用Environment的getExternalStorageState()方法判断手机上是否插入了SD卡,并且应用程序具有读写SD卡的权限。例如使用如下代码:

      // 如果手机已插入SD卡,且应用程序具有读写SD卡的能力,下面语句返回true
      Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

    2. 调用Environment的getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录。

    3. 使用FileInputStream、FileOutputStream、FileReader或FileWriter读、写SD卡里的文件。

    应用程序读、写SD卡的文件有如下两个注意点:
    + 手机上应该已插入SD卡。对于模拟器来说,可通过mksdcard命令来创建虚拟存储卡。
    + 为了读、写SD卡上的数据,必须在应用程序的清单文件(AndroidManifest.xml)中添加读写SD卡的权限。例如如下配置:

    <!-- 在SD卡中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">
    <!-- 向SD卡写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">

    下面的程序示范了如何读、写SD卡上的文件,该程序的主界面与上一个程序的界面完全相同。支持该程序数据读、写是基于SD卡的。该程序代码如下。

    public class MainActivity extends Activity {
    
        final String FILE_NAME = "/zong.bin";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 获取两个按钮
            Button read = (Button) findViewById(R.id.read);
            Button write = (Button) findViewById(R.id.write);
            // 获取两个文本框
            final EditText edit1 = (EditText) findViewById(R.id.edit1);
            final EditText edit2 = (EditText) findViewById(R.id.edit2);
            // 为write按钮绑定事件监听器
            write.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 将edit1中的内容写入文件中
                    write(edit1.getText().toString());
                    edit1.setText("");
                }
            });
            read.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 读取指定文件中的内容并显示出来
                    edit2.setText(read());
                }
            });
        }
    
        private String read() {
            try {
                // 如果手机插入了SD卡,而且应用程序具有访问SD的权限
                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                    // 获取SD卡对应的存储目录
                    File sdCardDir = Environment.getExternalStorageDirectory();
                    // 获取指定文件对应的输入流
                    FileInputStream fis = new FileInputStream(sdCardDir.getCanonicalPath() + FILE_NAME);
                    // 将指定输入流包装成BufferedReader
                    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                    StringBuilder sb = new StringBuilder("");
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        sb.append(line);
                    }
                    return sb.toString();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        private void write(String s) {
            try {
                // 如果手机插入了SD卡,而且应用程序具有访问SD的权限
                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                    // 获取SD卡的目录
                    File sdCardDir = Environment.getExternalStorageDirectory();
                    File targetFile = new File(sdCardDir.getCanonicalPath() + FILE_NAME);
                    // 以指定文件创建RandomAccessFile对象
                    RandomAccessFile raf = new RandomAccessFile(targetFile, "rw");
                    // 将文件记录指针移动到最后
                    raf.seek(targetFile.length());
                    // 输出文件内容
                    raf.write(s.getBytes());
                    raf.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }

    示例代码下载
    如果开发者不想使用Environment.getExternalStorageDirectory()这么复杂的语句来获取SD卡的路径,完全可以使用/mnt/sdcard/路径下代表SD卡的路径,然后程序通过判断/mnt/sdcard路径是否存在就可知道手机是否已插入了SD卡。

    如果觉得本文对您有帮助,请“打赏”,谢谢。
    您的鼓励,我的动力。
    微信 支付宝
  • 相关阅读:
    rotatelogs分割apache日志文件
    Linux怎么设置PostgreSQL远程访问
    【转】Shell编程
    【转】lnmp_auto:自动化安装lnmp环境脚本
    postgres配置主从流复制
    PHP中的魔术方法总结
    postgresql 忘记 postgres 密码
    linux下解压命令大全
    Java NIO Selector
    Channel (Java NIO)
  • 原文地址:https://www.cnblogs.com/zongzhankui/p/5875322.html
Copyright © 2011-2022 走看看