数据存储之(四):文件存储

来源:互联网 发布:中国网络被黑客攻击 编辑:程序博客网 时间:2024/05/01 20:58
Android使用的是基于Linux的文件系统,程序开发人员可以建立和访问程序自身的私有文件,也可以访问保存在资源目录中的原始文件和XML文件,还可以在SD卡等外部存储设备中保存文件

二.外部存储-SD卡

5)获取SD卡的内存大小

       剩余空间大小.主要依靠StatFs类。

主要参考:Android获取外部和内部存储空间总大小和可用大小

Android.os下的StatFs类主要用来获取文件系统的状态,能够获取sd卡的大小和剩余空间,获取系统内部空间也就是/system的大小和剩余空间等等。

有时我们去浏览sd卡的时候,发现并没有文件夹存在,是因为我们少加了一句权限。

<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>


2.如果不可用,则说明设备中的SD卡已经被移除,在Android模拟器则表明SD卡映像没有被正确加载

3.如果可用,则直接通过使用标准的Java.io.File类进行访问

1.向文件中读入内容:

try{                                                          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(string.getBytes());                                      raf.close();                                      Toast.makeText(MainActivity.this, "success", Toast.LENGTH_LONG).show();                                }                                    }              catch(Exception e){                      Toast.makeText(MainActivity.this, "ddd", Toast.LENGTH_LONG).show();              }  

2.从文件中读取内容

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));                                   sb = new StringBuilder("");                                  String line = null;                                  while((line = br.readLine()) != null)                                  {                                          sb.append(line);                                  }                                  Toast.makeText(MainActivity.this, sb.toString(), Toast.LENGTH_LONG).show();                                  return sb.toString();                          }                                              }catch(Exception e){                                    }            return sb.toString();  

3.SD卡文件浏览器

File currentParent;      // 记录当前路径下的所有文件的文件数组      File[] currentFiles;        private ListView listView ;      private TextView textView ;      @Override      public void onCreate(Bundle savedInstanceState)      {              super.onCreate(savedInstanceState);              setContentView(R.layout.activity_main);              //获取列出全部文件的ListView              listView = (ListView) findViewById(R.id.list);              textView = (TextView) findViewById(R.id.path);              //获取系统的SD卡的目录              File root = new File("/mnt/sdcard/");              //如果 SD卡存在              if (root.exists())              {                      currentParent = root;                      currentFiles = root.listFiles();                      //使用当前目录下的全部文件、文件夹来填充ListView                      inflateListView(currentFiles);              }              // 为ListView的列表项的单击事件绑定监听器              listView.setOnItemClickListener(new OnItemClickListener()              {                      @Override                      public void onItemClick(AdapterView<?> parent, View view,                              int position, long id)                      {                              // 用户单击了文件,直接返回,不做任何处理                              if (currentFiles[position].isFile())                                      return;                              // 获取用户点击的文件夹下的所有文件                              File[] tmp = currentFiles[position].listFiles();                              if (tmp == null || tmp.length == 0)                              {                                      Toast.makeText(MainActivity.this, "当前路径不可访问或该路径下没有文件",                                              20000).show();                              }                              else                              {                                      //获取用户单击的列表项对应的文件夹,设为当前的父文件夹                                      currentParent = currentFiles[position];                                      //保存当前的父文件夹内的全部文件和文件夹                                      currentFiles = tmp;                                      // 再次更新ListView                                      inflateListView(currentFiles);                              }                      }              });              // 获取上一级目录的按钮              Button parent = (Button) findViewById(R.id.parent);              parent.setOnClickListener(new OnClickListener()              {                      @Override                      public void onClick(View source)                      {                              try                              {                                      if (!currentParent.getCanonicalPath().equals("/mnt/sdcard"))                                      {                                              // 获取上一级目录                                              currentParent = currentParent.getParentFile();                                              // 列出当前目录下所有文件                                              currentFiles = currentParent.listFiles();                                              // 再次更新ListView                                              inflateListView(currentFiles);                                      }                              }                              catch (IOException e)                              {                                      e.printStackTrace();                              }                      }              });      }        private void inflateListView(File[] files)      {              // 创建一个List集合,List集合的元素是Map              List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();              for (int i = 0; i < files.length; i++)              {                      Map<String, Object> listItem = new HashMap<String, Object>();                      //如果当前File是文件夹,使用folder图标;否则使用file图标                      if (files[i].isDirectory())                      {                              listItem.put("icon", R.drawable.ic_launcher);                      }                      else                      {                              listItem.put("icon", R.drawable.ic_launcher);                      }                      listItem.put("fileName", files[i].getName());                      //添加List项                      listItems.add(listItem);              }              // 创建一个SimpleAdapter              SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,                      R.layout.line, new String[] { "icon", "fileName" }, new int[] {                              R.id.icon, R.id.file_name });              // 为ListView设置Adapter              listView.setAdapter(simpleAdapter);              try              {                      textView.setText("当前路径为:" + currentParent.getCanonicalPath());              }              catch (IOException e)              {                      e.printStackTrace();              }      }  }