当前位置: 代码迷 >> Android >> 5,Android文件IO详解
  详细解决方案

5,Android文件IO详解

热度:51   发布时间:2016-05-01 18:57:04.0
五,Android文件IO详解

?首先让我们回顾一下

JavaIO。看图:



?

看到这么多流,是不是头都大了,当年我学这块的时候,心想什么玩意,这流那流的。什么时候该用什么流?输入流和输出流经常弄混,不知道什么时候该用输出?什么时候该用输入?接下来看图?:

上面这张图说明了最基本的输入,输出。当然我们的数据源方向不一定只有文件,或许是内存或者网络。接下来说一下什么是字节流,字符流。



?

?

?

?

?

?

说白了节点流就是连接程序与数据源的一个管子,单纯的用来传送数据,并不对数据进行额外处理。而处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据的读写,如BufferedReader,。说白了处理流就是在管子外面又套了一层,对水进行了过滤或者消毒。对数据进行了额外的处理,增强了额外的传输功能。处理流的构造方法总是要带一个其他的流对象做参数。

常用的节点流

? InputStream OutputStream Reader Writer

? FileInputStream FileOutputStrean FileReader FileWriter 文件进行处理的节点流

? ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)

字符串 StringReader StringWriter 对字符串进行处理的节点流

? PipedInputStream PipedOutputStream PipedReader PipedWriter 对管道进行处理的节点流

常用处理流(关闭处理流使用关闭里面的节点流)

? InputStream OutputStream Reader Writer

缓冲流 BufferedImputStrean BufferedOutputStream BufferedReader BufferedWriter ----需要父类作为参数构造,增加缓冲功能,避免频繁读写硬盘,可以初始化缓冲数据的大小,由于带了缓冲功能,所以就写数据的时候需要使用flush方法

转换流 InputStreamReader OutputStreamWriter- inputStreamOutputStream作为参数,实现从字节流到字符流的转换

数据流 DataInputStream DataOutputStream -提供将基础数据类型写入到文件中,或者读取出来,为什么要有这个流呢?看这样的分析,如果没有这种流的话,有一个long,本身只占8个字节,如果我要写入到文件,需要转成字符串,然后在转成字符数组,那空间会占用很多,但是有了这种流之后就很方便了,直接将这8个字节写到文件就完了。。是不是既节约了内存空间有让程序写起来更加方便简单了呐。写倒是很简单,但是读取的时候就注意了,根据读取的数据类型,指针会往下移,所以你写的顺序必须要和读的顺序一致才能完成你正确的需求。

Android中的IO其实就是javaIO,只不过在处理细节上增加了几个好用的方法。下面看例子:

?



?


?

?

主要代码:

?

?

@Override	public void onClick(View v) {    	String name=mUserName.getText().toString();    	String age=mAge.getText().toString();    	String userInfo="用户名:"+name+";年龄:"+age+";性别:"+sexText+"\r\n";    	int id=v.getId();    	if(id==R.id.write_button){    		try {    			//1,此方法需要将字符串转换为字节写入文件    			//MODE_APPEND:追加模式|MODE_WORLD_READABLE:全局可读|MODE_WORLD_WRITEABLE:全局可写				//FileOutputStream fos=this.openFileOutput("androidtoast.txt", MODE_APPEND|MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);			    //fos.write(userInfo.getBytes());   			    //fos.close();    			    			//2,以字符的形式直接写入文件    			//得到Data目录      注:能操作文件夹只有两个地方:1.sdcard 2./data/data/<package_name>/				//File dir = Environment.getDataDirectory();//得到data目录				//File newFile=new File(dir,"/data/com.iteye.androidtoast/androidtoast.txt");				//FileWriter fw=new FileWriter(newFile,true);				//fw.write(userInfo);//直接将字符写入文件				//fw.close();				    			//3,以缓冲流的方式写入文件,这种方式能显著减少IO的次数,在操作大文本的时经常用    			File dir = Environment.getDataDirectory();//得到data目录				File newFile=new File(dir,"/data/com.iteye.androidtoast/androidtoast.txt");				FileWriter fw=new FileWriter(newFile,true);//以追加的模式将字符写入				BufferedWriter bw=new BufferedWriter(fw);//又包裹一层缓冲流 增强IO功能				bw.write(userInfo);				bw.flush();//将内容一次性写入文件				bw.close();				Toast.makeText(this, "成功写入", 1).show();			} catch (FileNotFoundException e) {				e.printStackTrace();				Toast.makeText(this, "文件没有找到", 1).show();			}catch (IOException e) {				e.printStackTrace();			}			    	}else if(id==R.id.read_button){    		String content="";//读取到的内容    		String temp = "";//存放内容    		File dir = Environment.getDataDirectory();//得到data目录			File newFile=new File(dir,"/data/com.iteye.androidtoast/androidtoast.txt");			try {				FileReader fr=new FileReader(newFile);				BufferedReader br=new BufferedReader(fr);				//一行一行读取 。在电子书程序上经常会用到。				while((content=br.readLine())!=null){					temp+=content+"\r\n";				}				mContent.setText(temp);				br.close();			} catch (FileNotFoundException e) {					e.printStackTrace();				Toast.makeText(this, "文件没有找到", 1).show();			} catch (IOException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}    	}	}

?

Android提供了几个操作文件输入输出的方法,这些方法封装了一些功能。如路径的构建,是否采用追加模式等等。

Context. openFileOutput("androidtoast.txt", MODE_APPEND|MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);

这个方法封装了输出流的创建,并提供了几种操作模式。首先通过这个方法打开输出流,系统会在

/data/data/<package-name>下创建一个files文件夹。你所写入的数据存放在此。如果你的程序想支持外部程序也能对你的文件进行读写,需要加入|MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE这两个操作模式。全局可读可写。注意:如果你的程序需要支持外部程序的读写,那么就只能用这种流操作方法。其他的流操作方法是不支持全局读写。

?

SD卡得读写,我示例中没写。下面说一下,首先需要得到SD当前状态 然后判断是否挂载

?

//得到外存设备的状态

String state = Environment.getExternalStorageState();

//状态为已挂载

if(state.equals(Environment.MEDIA_MOUNTED)){

//得到sd卡的目录

File dir = Environment.getExternalStorageDirectory();

File newFile = new File(dir,"androidtoast.txt");

FileOutputStream fos = new FileOutputStream(newFile,true);

fos.write(cont.getBytes());

fos.close();

}

注意 需要加入两个权限

<!-- 挂载/卸载sd卡权限 -->

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

<!-- 写入外设的权限 -->

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

?

1 楼 tan4836128 2011-09-21  
程序那“大桶”居然长得像垃圾桶,:(
2 楼 liubang201010 2011-09-22  
比较详细了,眼下正是Android的天下,我专门买了本Android书,可以随时看.获益颇多.

<<Android应用开发揭秘>>,我相信通过这本书,如果您坚持看完跟动手敲完所有的代码,你就可以做一个产品出来了,你肯定是Android人才了,加油 Android的兄弟们.

这里有关于Android的书:http://www.goodu.info/gc/node/114
3 楼 lingfa0511 2011-09-23  
楼主分析的相当详细了,谢谢分享!
请问楼主上面的图形是用什么工具画的呀?
4 楼 tan4836128 2011-09-29  
字符串 StringReader StringWriter 对字符串进行处理的节点流

如果这两个类是节点流,那么在Writer和Reader的结构图中为什么是蓝色的处理流呢?
5 楼 ominc 2012-03-26  
图很亮哦,谢谢主了
6 楼 keeponmoving 2012-03-31  
lz分析的不错,收藏着学习下。
  相关解决方案