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卡。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
森林防火应急联动指挥系统是一个集成了北斗定位/GPS、GIS、RS遥感、无线网络通讯、4G网络等技术的现代化智能系统,旨在提高森林火灾的预防和扑救效率。该系统通过实时监控、地图服务、历史数据管理、调度语音等功能,实现了现场指挥调度、语音呼叫通讯、远程监控、现场直播、救火人员生命检测等工作的网络化、智能化、可视化。它能够在火灾发生后迅速组网,确保现场与指挥中心的通信畅通,同时,系统支持快速部署,适应各种极端环境,保障信息的实时传输和历史数据的安全存储。 系统的设计遵循先进性、实用性、标准性、开放性、安全性、可靠性和扩展性原则,确保了技术的领先地位和未来的发展空间。系统架构包括应急终端、无线专网、应用联动应用和服务组件,以及安全审计模块,以确保用户合法性和数据安全性。部署方案灵活,能够根据现场需求快速搭建应急指挥平台,支持高并发视频直播和大容量数据存储。 智能终端设备具备三防等级,能够在恶劣环境下稳定工作,支持北斗+GPS双模定位,提供精确的位置信息。设备搭载的操作系统和处理器能够处理复杂的任务,如高清视频拍摄和数据传输。此外,设备还配备了多种传感器和接口,以适应不同的使用场景。 自适应无线网络是系统的关键组成部分,它基于认知无线电技术,能够根据环境变化动态调整通讯参数,优化通讯效果。网络支持点对点和点对多点的组网模式,具有低功耗、长距离覆盖、强抗干扰能力等特点,易于部署和维护。 系统的售后服务保障包括安装实施服务、系统维护服务、系统完善服务、培训服务等,确保用户能够高效使用系统。提供7*24小时的实时故障响应,以及定期的系统优化和维护,确保系统的稳定运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值