首页 > 代码库 > 第五章 以数据为中心—数据存取(1)

第五章 以数据为中心—数据存取(1)

第五章以数据为中心—数据存取

典型的桌面操作系统提供一种公共文件系统——任何应用软件可以使用它来存储和读取文件,该文件也可以被其它的应用软件所读取(会有一些权限控制设定)。而Android 采用了一种不同的系统。在Android 中,所有的应用软件数据(包括文件)为该应用软件所私有。然而,Android 同样也提供了一种标准方式供应用软件将私有数据开放给其它应用软件。这一章将描述一个应用软件存储和获取数据、开放数据给其他应用软件、从其他应用软件请求数据并且开放它们的多种方式。

可供选择的存储方式有:文件存储、SQLite 数据库方式、SharedPreferences、content provider(内容提供器)。我们将在本章详细的进行介绍。

5.1 文件操作

5.1.1 读写一般的文本文件

先来看下Java语言对于文件或文件夹操作的常用API:

String path = File.getPath();//相对路径 

String path = File.getAbsoultePath();//绝对路径

String parentPath = File.getParent();//获得文件或文件夹的父目录

String Name = File.getName();

File.mkDir();//建立文件夹 

File.createNewFile();//建立文件 

File.isDirectory();//判断是文件或文件夹

File[] files = File.listFiles();//列出文件夹下的所有文件和文件夹名

File.renameTo(dest);//修改文件夹和文件名

File.delete();//删除文件夹或文件

 

在Android中,也常常会对SD卡下的文件进行操作:

Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

// 判断SD卡是否插入

File skRoot = Environment.getExternalStorageDirectory(); //获得sd卡根目录

File fileRoot = Context.getFilesDir()+"//"; //获得私有根目录

 

和传统的Java 中实现I/O 的程序类似,在Android中,其提供了openFileInput 和openFileOuput方法读取设备上的文件。

下面看个例子代码,具体如下所示:

String FILE_NAME = "tempfile.tmp";//确定要操作文件的文件名

FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);//初始化

FileInputStream fis = openFileInput(FILE_NAME);//创建写入流

 

经验分享:

默认情况下,使用openFileOutput()方法创建的文件只能被其调用的应用使用,其它应用无法读取这个文件,如果需要在不同的应用中共享数据,可以使用Content Provider 实现,关于Content Provider 我们将在稍后的内容中介绍。

Android的文件操作要有权限:

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

 

在Android开发中,资源文件一般放在哪里?

如果你的应用需要一些额外的资源文件,例如,一些用来测试你写的音乐播放器是否可以正常工作的MP3 文件,可以将这些文件放在应用程序的/res/raw/下,如mydatafile.mp3。那么就可以在你的应用中使用getResources 获取资源后,以openRawResource方法(不带后缀的资源文件名)打开这个文件,实现代码如下所示:

Resources myResources = getResources();

InputStream myFile = myResources.openRawResource(R.raw.myfilename);

 

--------------------------------------------
程序员赚钱不易 一定要学会理财
平安陆金所 隶属于平安集团的p2p平台
年投资回报率7%-9% 是替代银行理财的首选
个人经验 推荐投资安鑫或者有担保的彩虹项目
不要投资安e 那个几乎无法转让 想提前提现非常困难
网站链接 http://affiliate.lufax.com/action/36XBU
首次投资1000元即可额外赚几百元 不赚白不赚
--------------------------------------------

下面我们来看下个例子,读取目录/res/raw/下的资源文件test.txt。

// import略

public class ReadTextTest extends Activity { 

 

    public static final int REFRESH = 0x000001; 

    private TextView text = null; 

 

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        text = new TextView(this); 

        text.setBackgroundColor(0xff000000);

        text.setTextColor(0xffffffff);

        text.setGravity(Gravity.CENTER);

        InputStreamReader inputStreamReader = null; 

        InputStream inputStream = getResources().openRawResource(R.raw.test); 

        try { 

            inputStreamReader = new InputStreamReader(inputStream, "utf-8"); 

        } catch (UnsupportedEncodingException e1) { 

            e1.printStackTrace(); 

        } 

        BufferedReader reader = new BufferedReader(inputStreamReader); 

        StringBuffer sb = new StringBuffer(""); 

        String line; 

        try { 

            while ((line = reader.readLine()) != null) { 

                sb.append(line); 

                sb.append("\n"); 

            } 

        } catch (IOException e) { 

            e.printStackTrace(); 

        } 

        text.setText(sb.toString());

        setContentView(text); 

    }   

}

 

在/res/raw/目录下新建test.txt文件,加入“测试读取txt文件”文字,保存为UTF-8的格式。

图 5-1为程序运行的结果:

技术分享

图 5-1 读取txt文档的结果

第五章 以数据为中心—数据存取(1)