最近在学习安卓相关的编程,对于一门新技术的学习,我想应该跟其他语言一样吧,如C++和C#,也是文件,网络,多线程以及数据库之类的学习了。所以决定先从文件下手,现在将文件的一点学习列在下面:

1.Java中文件的操作

Java中文件的操作分为两种类型:字节型(Stream)和字符型(Reader),但是字符型在处理非文本类型的数据时会有问题。

好了上一段代码:

/**
* 文件的复制
* @param srcPath 源文件路径
* @param destPath 目标文件路径
* @throws Exception 抛出的异常
*/
public static void copy(String srcPath, String destPath) throws Exception{
File src = new File(srcPath);
File dest = new File(destPath); InputStream input = new BufferedInputStream(new FileInputStream(src));
OutputStream output = new BufferedOutputStream(new FileOutputStream(dest)); int len = 0;
byte[] buffer = new byte[1024];
while(-1 != (len = input.read(buffer))){
output.write(buffer,0,len);
} output.close();
input.close();
}

这段代码的主要功能是复制源文件到目标文件,需要特别注意的是,目标文件必须指定文件名,如果是路径的话,会出错。

File src = new File(srcPath);
File dest = new File(destPath);

这两句话的意思是与文件建立联系,以便让后面的流进行操作,当然也可以直接在流中指定文件的路径。

InputStream input = new BufferedInputStream(new FileInputStream(src));

这边就是声明输出流了,因为是将外部文件导入到程序中,所以需要使用FileInputStream,这也可以理解。那么BufferedInputStream是有什么作用呢?使用BufferedInputStream对FileInputStream进行装饰,使普通的文件输入流具备了内存缓存的功能,通过内存缓冲减少磁盘IO次数,看到别人博客上的一句话,说的清晰明了就拿过来用了。对于BufferedOutputStream,其作用是类似的。
另外,在input.read()处理到文件末尾的时候就会返回-1,以此来判断文件是否读取结束。对于output.close()内部会调用flush方法将缓存的数据写进文件,最后记得关闭流。

在这里关于异常的是直接抛出的,因为这个方法是逻辑层,所以异常处理交给业务层。

2.Android文件的操作

public class FileService {
private FileService() { } public static void write(String fileName, String content) throws Exception {
File file = new File(fileName);// 建立连接
OutputStream output = new BufferedOutputStream(new FileOutputStream(
file));
output.write(content.getBytes());
output.close();
}
}

既然在Java中可以使用该代码,那么在android中应这段代码就应该是可用的。但是在执行的时候发生了错误:

打开文件错误:只读文件系统 open failed:EROFS(read only file system)

这是什么原因呢?后来在stack overflow上找到了下面一段话:

You will not have access to the file-system root, which is what you're attempting to access. For your purposes, you can write to internal files new File("test.png"), which places the file in the application-internal storage -- better yet, access it explicitly using getFilesDir().

大致意思是,app没有系统root目录的权限,也就是说,我直接创建file的时候,是在系统的根目录上创建的,然而所写的App没有相关的权限。但是可以写在手机的内部存储器上,通过getFilesDir()来获取内部的目录。更新代码如下:

package org.tonny.util;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.OutputStream; import android.content.Context; public final class FileService {
private Context context; public FileService(Context context) {
this.context = context;
} public void write(String fileName, String content) throws Exception {
File file = new File(context.getFilesDir() + File.separator + fileName);// 建立连接
OutputStream output = new BufferedOutputStream(new FileOutputStream(
file));
output.write(content.getBytes());
output.close();
}
}

这样修改之后,果然可以创建文件了。那么android是否提供了另外的方法来进行相关的操作了,经过一番查阅,发现还是有的,代码如下:

package org.tonny.util;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.OutputStream; import android.content.Context; public final class FileService {
private Context context; public FileService(Context context) {
this.context = context;
} public void write(String fileName, String content) throws Exception {
File file = new File(context.getFilesDir() + File.separator + fileName);// 建立连接
OutputStream output = new BufferedOutputStream(new FileOutputStream(
file));
output.write(content.getBytes());
output.flush();
output.close();
} public void writeFile(String fileName, String content) throws Exception{
OutputStream output = new BufferedOutputStream(context.openFileOutput(fileName, Context.MODE_PRIVATE));
output.write(content.getBytes());
output.flush();
output.close();
} }

同样是可以在app相应的目录下创建文件。

那么可以在文件的内部存储器存放文件,如何在SD卡上存放文件呢,网上的例子还是比较多的,代码如下:

public void writeSDFile(String fileName, String content) throws Exception {
boolean sdCardExist = Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED);
if (!sdCardExist) {
// SD卡不存在,则退出
return;
}
File file = new File(Environment.getExternalStorageDirectory()
.getPath() + File.separator + fileName);
OutputStream output = new BufferedOutputStream(new FileOutputStream(
file));
output.write(content.getBytes());
output.flush();
output.close();
}

这里需要先判断一下SD卡是否存在,存在才能进一步操作,同时需要在清单文件中配置

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

代码是写好了,简单的重构一下:

package org.tonny.util;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream; import android.content.Context;
import android.os.Environment; public final class FileService {
private Context context; public FileService(Context context) {
this.context = context;
} public void write(String fileName, String content) throws Exception {
File file = new File(context.getFilesDir() + File.separator + fileName);// 建立连接
oper(file, content);
} public void writeFile(String fileName, String content) throws Exception {
OutputStream output = new BufferedOutputStream(context.openFileOutput(
fileName, Context.MODE_PRIVATE));
output.write(content.getBytes());
output.flush();
output.close();
} public void writeSDFile(String fileName, String content) throws Exception {
boolean sdCardExist = Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED);
if (!sdCardExist) {
// SD卡不存在,则退出
return;
}
File file = new File(Environment.getExternalStorageDirectory()
.getPath() + File.separator + fileName);
oper(file, content);
} /**
* 文件写操作
*
* @param file
* @param content
* @throws Exception
*/
private void oper(File file, String content) throws Exception {
OutputStream output = new BufferedOutputStream(new FileOutputStream(
file));
output.write(content.getBytes());
output.flush();
output.close();
}
}

由于学习还在一个较浅的层面,所以就写了这几个简单的例子。还有很多内容有待丰富,如文件的属性获取,复制以及读取等操作都没有写。另外没有从整体上介绍Android IO操作类的结构,所以文章还是有些混乱的。哎,第一次写,时间花了不少,休息啦。

Android学习一:文件操作的更多相关文章

  1. Android数据存储-文件操作

    一.预备知识 1.Android中的MVC设计模式 MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器.一个逻辑模型可以对于多种视图模型,比如一批统计 ...

  2. Android的file文件操作详解

    Android的file文件操作详解 android的文件操作要有权限: 判断SD卡是否插入 Environment.getExternalStorageState().equals( android ...

  3. HTML5学习之文件操作(九)

    之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很进行跨平台的处理,另外就是让我们的web应用依赖了第三方的插件,而不是很独立 ...

  4. python学习笔记:文件操作和集合(转)

    转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...

  5. android中的文件操作详解以及内部存储和外部存储(转载)

    原文链接:http://m.blog.csdn.net/article/details?id=17725989 摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安 ...

  6. 【转】 android中的文件操作详解以及内部存储和外部存储

    摘要 其实安卓文件的操作和Java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者 ...

  7. python学习总结---文件操作

    # 文件操作 ### 目录管理(os) - 示例 ```python # 执行系统命令 # 清屏 # os.system('cls') # 调出计算器 # os.system('calc') # 查看 ...

  8. erlang学习笔记(文件操作)

    参考这里和这里了解到的文件操作的模块有很多:kernel下有:file,stdlib下有:filelib,filename,file_sorter.(具体查看官方文档)

  9. Smart210学习记录-------文件操作

    一.linux文件操作(只能在linux系统上用) 创建:int creat(const char* filename, mode_t mode) filename 表示要创建的文件名,mode表示对 ...

  10. NodeJS学习之文件操作

    NodeJS -- 文件操作 Buffer(数据块) JS语言自身只有字符串数据类型,没有二进制数据类型,因此NodeJS提供了一个与String对等的全局构造函数Buffer来提供对二进制数据的操作 ...

随机推荐

  1. php总结 --- 4. 对象

    一. 恩聪 设计模式 因为php本身的问题,所以他能做的模式有限,就在这边列出了

  2. [Selenium] 拖拽一个 Component 到 Workspace

    先使Component可见,获取Component位置信息,获取Workspace位置信息,点击Component并拖拽到Workspace,最后释放.(调试时dragAndDropOffset()方 ...

  3. Error: listen EADDRINUSE

    有可能是已经作用了18001端口 netstat -antp|grep 18001 kill 然后重启程序. events.js:72 throw er; // Unhandled 'error' e ...

  4. JavaScipt的秘密花园

    对象使用和属性 JavaScript 中所有变量都可以当作对象使用,除了两个例外 null 和undefined. false.toString(); // 'false'[1, 2, 3].toSt ...

  5. maven入门探讨

    java项目最恶心的一点莫过于需要使用大量的jar.每次引用jar的时候都要自己手动去各地寻找,然后导入到项目的指定文件夹当中最后还要添加Path.这无疑是一项工作量巨大的工作,同时如果控制不当就会提 ...

  6. uva 1658(最小费用最大流)

    题意:一个带权有向图,求起点到终点的两条路径权值之和最小,且两条路径没有公共点(除起点,终点): 分析:拆点法,将u拆成u和u',u-u'容量为1,费用为0,这样就能保证每个点只用一次,起点s-s'容 ...

  7. ASP.NET MVC ActionResult的其它返回值

    一.ascx页面 场景:要返回代码片断,比如Ajax返回一个子页 我们先新建一个Action public ActionResult Ascx() { return PartialView(); } ...

  8. adobe cc 2015安装步骤

  9. 配置rc.local开机自启动文件的疑问

    有时我们自己在/etc/rc.d/rc.local里面增加的随机器启动的脚本和指令总是不能自动加载和启动,,机器启动后手动执行脚本又能成功,经常被搞得晕头转向的.最近我经过1天的辛苦测试和查找资料,终 ...

  10. UNION并集运算

    在集合论中,两个集合(集合A和集合B)的并集是一个包含集合A和B中所有元素的集合.换句话说,如果一个元素属于任何一个输入集合,那么它也属于结果集.如图所示.