`
androidtoast
  • 浏览: 210387 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
38befa0e-3f74-3314-92d9-475c7fc3c19b
Android学习——入门...
浏览量:124522
社区版块
存档分类
最新评论

五,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" />

 

  • 大小: 234.5 KB
  • 大小: 181.7 KB
  • 大小: 98 KB
  • 大小: 136 KB
  • 大小: 118.6 KB
  • 大小: 93.2 KB
  • 大小: 86.1 KB
  • 大小: 90.5 KB
  • 大小: 51.2 KB
  • 大小: 63.1 KB
12
0
分享到:
评论
7 楼 ihopethatwell 2012-09-04  
楼主,我如果把这个文件放在 jnires目录下,如何往/data/package/ ...目录下复制?
6 楼 keeponmoving 2012-03-31  
lz分析的不错,收藏着学习下。
5 楼 ominc 2012-03-26  
图很亮哦,谢谢主了
4 楼 tan4836128 2011-09-29  
字符串 StringReader StringWriter 对字符串进行处理的节点流

如果这两个类是节点流,那么在Writer和Reader的结构图中为什么是蓝色的处理流呢?
3 楼 lingfa0511 2011-09-23  
楼主分析的相当详细了,谢谢分享!
请问楼主上面的图形是用什么工具画的呀?
2 楼 liubang201010 2011-09-22  
比较详细了,眼下正是Android的天下,我专门买了本Android书,可以随时看.获益颇多.

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

这里有关于Android的书:http://www.goodu.info/gc/node/114
1 楼 tan4836128 2011-09-21  
程序那“大桶”居然长得像垃圾桶,:(

相关推荐

    五,Android文件IO详解.doc

    五,Android文件IO详解

    Android 文件操作详解及简单实例

    Android 文件操作详解 Android 的文件操作说白了就是Java的文件操作的处理。所以如果对Java的io文件操作比较熟悉的话,android的文件操作就是小菜一碟了。好了,话不多说,开始今天的正题吧。 先从一个小项目入门吧 ...

    Android开发应用实战详解源代码

    4.10 用.iava.io.file实现文件搜索 4.11 置换imagebutton按钮 4.12 实现autocompletetextview输入提示 4.13 实现analogclock时钟 4.14 时间选择 4.15 progressbar和handler进度条 4.16 动态排版处理 4.17 ...

    实例详解Android文件存储数据方式

    下面通过本文给大家介绍Android文件存储数据方式。 1.文件存储数据使用了Java中的IO操作来进行文件的保存和读取,只不过Android在Context类中封装好了输入流和输出流的获取方法。 创建的存储文件保存在/data/data/...

    Android实现上传文件到服务器实例详解

    一、Android端实现文件上传 1)、新建一个Android项目命名为androidUpload,目录结构如下: 2)、新建FormFile类,用来封装文件信息 package com.ljq.utils; import java.io.File; import java.io.FileInputStream...

    Android典型技术模块开发详解

    2.2 HelloAndroid详解 2.2.1 程序结构 2.2.2 代码分析 2.3 权限permission 2.4 LogCat日志调试 2.5 示例练习 2.5.1 登录界面 2.5.2 事件处理 2.6 本章小结 第二篇 Android开发关键组件 第3章 Activity(活动) 3.1 ...

    Android读取properties配置文件的实例详解

    Android读取properties配置文件的实例详解 因为一些配置信息,多处用到的。且以后可能变更的,我想写个.prorperties配置文件给管理起来。 我把配置文件放在了assets文件夹下 appConfig.properties: serverUrl=...

    Android编程之文件的读写实例详解

    Android的文件读写与JavaSE的文件读写相同,都是使用IO流。而且Android使用的正是JavaSE的IO流,下面我们通过一个练习来学习Android的文件读写。 1.创建一个Android工程 Project name:File  BuildTarget:Android...

    Android Studio 生成自定义jar包的步骤详解

    1、新建一个项目,项目名随意,eg:MakeJarApplication,在项目中新建一个module类型为android-library ,命名为testLibrary。如图: 项目结构图 2、让app依赖这个库,在app下的build.gradle文件中添加compile ...

    android studio 打包自动生成版本号与日期,apk输入路径详解

    build.gradle 文件添加内容如下。gradle是【com.android.tools.build:gradle:3.0.0 以下版本】 android{ defaultConfig {...} 自动追加版本号和版本名称 android.applicationVariants.all { variant-&gt;variant....

    详解AndroidStudio3.0开发调试安卓NDK的C++代码

    本文介绍了AndroidStudio3.0开发调试安卓NDK的C++代码,分享给大家,具有如下: ...首先看gradle文件,android节点下添加: externalNativeBuild { cmake { path CMakeLists.txt } } defaultConfig节点下添加:

    Android权限操作之uses-permission详解

    本文实例讲述了Android权限操作之uses-permission。...Android的权限在AndroidManifest.xml文件里配置。AndroidManifest文件中有四个标签与permission有关,它们分别是 、 &lt;permission&gt; 、&lt;permission&gt;

    详解Android图表 MPAndroidChart折线图

    1.介绍 MPAndroidChart GitHub地址  MPAndroidChart的强大之处就不在多说了,目前最新的版本是3.0.1,在新版本中很多... maven { url https://jitpack.io } } } 在app根目录的buil.gradle文件中加入依赖 dependenc

    android读写中文如何避免乱码详解

    android读取文件中文出现乱码的原因无非就是,读取文件的字符格式与写如文件的格式不一致。因此,避免中文乱码,要在写入文件的时候按照一定的格式写入,读取的时候按照一定的格式读取。这样对应就不会出现乱码。...

    AndroidStudio 如何使用aar详解

    将代码打包成aar文件,可以在一定程度上加快 AndroidStudio 的速度。 尤其是将 Module 打包成 aar 文件,提升的效果很显著。 二. 如何得到aar 1. Module的aar文件 将一个AndroidStudio项目中的 Module 打包成 aar ...

    Android关于FTP文件上传和下载功能详解

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 此篇博客为整理文章,供大家学习。 1.首先下载commons-net jar包,可以百度下载。 FTP的文件上传和下载的工具类: package ...

    Android pdf viewer在android studio应用问题说明详解

    android 显示网络pdf,基本原理:先将pdf文件通过DownloadManager下载到手机sdk某个文件夹中,然后通过android-pdf-viewer插件进行显示。 android-pdf-viewer插件可以直接到github上下载,地址:https://

    详解Android Studio实现用户登陆界面demo(xml实现)

    使用Android Studio 编写的第一个demo,使用布局文件—xml实现用户登录界面 注:所建工程均为Android 6.0 所以只要是Android 6.0(包括6.0)以上的真机,模拟机都可以使用 Step1:Android Studio 开发环境的搭建: 1...

Global site tag (gtag.js) - Google Analytics