Android学习笔记十七.Android数据存储与IO.File存储常用API

Android通过一套完整的I/O流体系,包括FileInputStream、FileOutputStream等,通过这些I/O流来访问手机存储上的文件。

一、API

1.File

(1)功能:该类提供一些有限的功能-获取或设置文件的权限、文件类型、最后依次修改时间等,通常它所代表的文件名(包含路径)将被转换为UTF-8字节序列被使用。

(2)继承关系

java.lang.Object

? java.io.File

(3)构造方法


 File(File dir, String name):构造一个新文件对象,且文件对象包含指定的路径和文件名

File(String path):构造一个新文件对象,且文件对象包含指定的路径

File(String dirPath, String name):构造一个新文件对象,且文件对象使用指定的目录路径和文件名

File(URI uri):构造一个新文件对象,且文件对象使用指定的URI路径

(4)常用方法

boolean
createNewFile():根据存储在文件对象中的路径信息,在此路径下新建一个空的新文件

boolean
delete():删除该文件

String
getAbsolutePath():返回该文件的绝对路径,且为字符串形式

String
getCanonicalPath():返回表示与此抽象路径名相同的文件或目录的规范路径名字符串

String
getPath():返回相对路径名,且为字符串形式

long
lastModified() :返回该文件被最后修改的时间,这里需要注意的是返回的是从1970.1.1.00.00  到当前的毫秒量

File[]
listFiles() :返回该文件所在目录的所有文件到一个File数组

String
toString() :返回一些关于该文件简洁可读的相关信息

URI
toURI() :返回该文件的统一资源标志符

setXXX..:设置文件对象对应文件的属性

2.FileInputStream

(1)功能:一个输入流,用于从文件读出字节数据。该输入流不是缓冲空间,大部分方法调用需要用BufferedInputStream类来包装该流。我们还可以通过
FileRead类向文件写入字符数据。

   File file = ...
   InputStream in = null;
   try {
     in = new BufferedInputStream(new FileInputStream(file));
     ...
    finally {
     if (in != null) {
       in.close();
     }
   }
 }

(2)继承关系

java.lang.Object

? java.io.InputStream

? java.io.FileInputStream

(3)构造方法

FileInputStream(File file)

Constructs a new FileInputStream that reads from file.


FileInputStream(FileDescriptor fd)

Constructs a new FileInputStream that
reads from fd.


FileInputStream(String path)

Equivalent to new
FileInputStream(new File(path))
.

(4)常用方法

Public int available() :返回文件还有多少可读或跳过的数据字节数

Public void close() :关闭输入流

Public int read() :从输入流中读取出一个字节数据,并将其转换为整型数据(0-255)返回

Public int read(byte[] buffer, int byteOffset,
int byteCount) :从输入流读取byteCount个字节数据到buffer数组中,从byteOffset位置开始存储。

Public long skip(long byteCount) :Skips
at most byteCount bytes in this stream.

Protected void finalize() :确定该输入流所有资源释放被是否并准备被垃圾回收器回收

3.FileOutputStream

(1)功能:文件输出流,用于写入字节数据到文件中。如果该输出流存在,则替换或者追加文件中的内容;如果文件输出流不存在,则创建一个新文件。注意:该输出流不是缓冲空间,大部分方法调用需要用BufferedOutputStream类来包装该流。我们还可以通过 FileWriter类向文件写入字符数据。

  File file = ...
   OutputStream out = null;
   try {
     out = new BufferedOutputStream(new FileOutputStream(file));
     ...
    finally {
     if (out != null) {
       out.close();
     }
   }
 }

(2)继承关系

java.lang.Object

? java.io.OutputStream

? java.io.FileOutputStream

(3)构造方法


FileOutputStream(File file) :构造一个 FileOutputStream 实例,用于写字节数据到File对象对应的文件

FileOutputStream(File file,
boolean append)

FileOutputStream(FileDescriptor fd):构造一个
FileOutputStream 实例,用于写字节数据到文件描述符对应的文件

FileOutputStream(String path)

FileOutputStream(String path,
boolean append)

(4)常用方法

void
close() :关闭输出流

void
write(byte[] buffer, int byteOffset, int byteCount) :从数组的Offset位置开始写Count个字节到该输出流

void
write(int oneByte) :写一个字节到该输出流

4.Context

(1)Context提供了两个方法来打开本应用程序的数据文件夹的文件I/O流(输入流、输出流)

FileInputStream openFileInput(String):打开应用程序的数据文件夹下的name文件对应输入流;

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

其中,第二个参数值如下:

MODE_PRIVATE:该文件只能被当前程序读写;

MODE_APPEND:以追加方式打开文件,应用程序可以想该文件中追加内容;

MODE_WORLD_READABLE:该文件的内容可以被其他程序读取;

MODE_WORLD_WRITEABLE:该文件的内容可被其他程序读、写

(2)Context提供几种方法用于访问应用程序的数据文件夹

getDir(String name,int mdoe):在应用程序的数据文件夹下获取或创建name对应的子目录

File getFilesDir():获取该应用程序的数据文件夹的绝对路径

String[] fileList():返回该应用程序的数据文件夹下的全部文件

deleteFile(String):删除该应用程序的数据文件夹下的指定文件

二、实例分析

1.实现:读写应用程序数据文件夹内的文件

2.文件读取开发思路

(1)从输入流读取数据:a.打开一个文件输入流;b.创建一个数组缓冲空间;c.从输入流循环读取buffer.length个字节数据到缓冲空间并最后存放到StringBuilder中。

FileInputStream fis=openFileInput("test.txt");

byte[] buff=new byte[1024];

int hasRead=0;

StringBuilder sb=new StringBuilder("");

while( (hasRead=fis.read(buff)) >0 )    //将文件数据读到buff数组中并返回字节数,等价于
read(buffer, 0, buffer.length)

{

sb.append(new String(buff,0,hasRead));//从buff缓冲中读取从0位置开始hasRead个字节数的内容存放到StringBuilder对象中

}

fis.close();

return sb.toString(); //返回读取到的数据

(2)写数据到文件输出流:a.以追加模式打开一个文件输出流;b.将输出流打包成PrintStream;c.向PrintStream追加写入传入的数据

FileOutputStream fos=openFileOutput(FILE_NAME,MODE_APPEND);

PrintStream ps=new PrintStream(fos);

ps.append(content);

ps.close();

3.源码:

package com.example.android_sdcard_0;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class FileTest extends Activity {
 final String FILE_NAME="test.txt";
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 //0.获取界面组件
  Button write=(Button)findViewById(R.id.writeBtn);
  Button read=(Button)findViewById(R.id.readBtn);
  final EditText edit1=(EditText)findViewById(R.id.edit1);
  final EditText edit2=(EditText)findViewById(R.id.edit2);
 //1.为按钮设置监听器并实现相应功能(写、读)
  write.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
    write(edit2.getText().toString());	//获取文本编辑框中的数据并写入到文件中
    edit2.setText(""); //清空文本编辑框
   }
  });

  read.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
    edit1.setText(read()); //读取指定文件中的内容并显示出来
   }
  });
 }
 //2.实现read()方法:从指定文件中读取数据
 private String read(){

  try {
   FileInputStream fis=openFileInput(FILE_NAME);//a.打开文件输入流
   byte[] buff=new byte[1024];	 //b.开辟一段缓冲空间
   int hasRead=0;	 //c.读取位置标志位
   StringBuilder sb=new StringBuilder("");	 //d.实例化一个StringBuilder对象
   while( (hasRead=fis.read(buff)) >0 )	 //将文件数据读到buff数组中并返回字节数,等价于 read(buffer, 0, buffer.length).
   {
    sb.append(new String(buff,0,hasRead));	//从buff缓冲中读取从0位置开始hasRead个字节数的内容存放到StringBuilder对象中
   }
   fis.close();
   return sb.toString();	 //返回读取到的数据

  }
  catch (Exception e) {
   e.printStackTrace();
  }
  return null;
 }
 //3.将文本编辑框中的数据追加写入到指定文件中
 private void write(String content) {
  try {
   FileOutputStream fos=openFileOutput(FILE_NAME,MODE_APPEND);	//以追加模式打开指定文件(输出流)
   PrintStream ps=new PrintStream(fos);	 //将FileOutputStream包装成PrintStream
   ps.append(content);	//将传递进来的数据参数写入指定文件中
   ps.close();	 //关闭文件
  }
  catch (FileNotFoundException e) {
   e.printStackTrace();
  }
 }
}

效果演示:/data/data/<包名>/files/test.txt

参考:http://wear.techbrood.com/reference/java/io/FileInputStream.html

时间: 2024-11-03 16:43:19

Android学习笔记十七.Android数据存储与IO.File存储常用API的相关文章

Android学习笔记一 Android的构成

一个Android程序是由多个Activity松散构成通过Intnet对象相互调用每个Activity相对独立. R文件:自动生成,存储着程序集所包含的资源文件. src:包含程序中所有的Activity类文件. 新添加的Activity必须在AndroidManifest.xml中进行注册. values:该文件夹下的元素会在R文件中生成资源ID. Android学习笔记一 Android的构成

Android学习笔记_78_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

Android学习笔记_79_ Android 使用 搜索框

1.在资源文件夹下创建xml文件夹,并创建一个searchable.xml: <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/sms_search" android:hint="@st

Android学习笔记—第八章 数据存储

第八章 数据存储 数据存储方式 Internal Storage 内部存储 External Storage 外部存储 SQLite DataBase 数据库存储 Http 网络存储 Shared Prefrences 参数共享 存储位置:data/data/包名/shared_prefs/MainAcitivy.xml 格式:xml 保存数据: //获取Shared Prefrences类型对象 SharedPrefrences sp = getSharedPrefrences("xxx&qu

Android 学习笔记 2 Android开发环境的安装(Eclipse Bundle)

搭建eclipse开发环境,一般要经过 安装JDK.安装Eclipse.下载Android SDK.在Eclipse中安装ADT.在Eclipse中配置Android SDK.通过SDK Manager对Android SDK进行管理等几个比较麻烦的步骤. 后来Google推出了 adt-bundle 将ATD.SDK整合到Eclipse中,这样对于新手来说就免去了很多步骤,入门更容易了. 在此推荐一个网站 http://tools.android-studio.org/ 可以免去搬梯子去And

(android学习笔记)Android View

Android View类: 1.所有的Android组件均是View的子类. 2.所有的组件均可以进行两种配置,一是通过方法进行配置.二是通过XML进行配置. TextView类: 1.对于文本组件而言主要的目的是静态的显示一些文字,类似于标签的功能. 2.其是android.widget.TextView类,是android.view.View类的直接子类. 3.插入超链接的方法: 1)在XML文件中的TextView组件配置中写:android:autoLink="all" 会自

android学习笔记(9)android程序调试学习

相应若水老师的第十四课 一,Log日志输出 Log.v(tag,message);        //verbose模式,打印最具体的日志 Log.d(tag,message);        //debug级别的日志 Log.i(tag,message);        //info级别的日志 Log.w(tag,message);        //warn级别的日志 Log.e(tag,message);        //error级别的日志 tag用来标记log消息的源头用常量来表示.

android学习笔记(7)android程序调试学习

对应若水老师的第十四课 一,Log日志输出 Log.v(tag,message);        //verbose模式,打印最详细的日志 Log.d(tag,message);        //debug级别的日志 Log.i(tag,message);        //info级别的日志 Log.w(tag,message);        //warn级别的日志 Log.e(tag,message);        //error级别的日志 tag用来标记log消息的源头用常量来表示.