首页 > 代码库 > android学习之文件

android学习之文件

一、输入输出流

      首先,你要明白什么是“流”。直观地讲,流就像水一样,不存在大小问题,也避免了完整性问题。非流的数据传输,比如你下载一张图片,需要整幅图片下载完之后才能使用,而流则不同,就像水,你取一杯也可以用,取一桶也可以用。所以说,流是一种数据传输的模式。
     而输入流和输出流,差别在于出和入,是相对于程序而言的。“输入流式得到数据,输出流是输出数据”,这种说法是对的。你把问题想复杂了,输入是程序得到外部数据,输出是程序向外部传输数据,二者没有必然的联系,都是流,差别是方向不同,也就是说,程序可以只有输入流而没有输出流,或者只有输出流而没有输入流。
     另外补充一下,流的好处是接收方可以提前处理,缩短等待时间,提高速度。比如你上youku看视频,并不是整个视频下载好了才播放的,而是下一点播一点。但是不是所有应用都适合,比如加密了的文件,往往需要整个加密文件接收完了才能解密。

     总结如下:

     1.流是一种数据传输模式。

     2.出与入是相对于程序。

     3.流的好处是无须全部接受完就可以处理。

 

二、android文件操作

      下面是我自己总结的文件操作的代码。

package com.lintao.file;import org.apache.http.util.EncodingUtils;import android.content.Context;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;public class FileDemo {    /**     * 读取私有文件夹下的文件,流的操作一般都会通过一个byte[]数组作为buffer来作为转存,这里     * 猜想,实时的视频播放大概就是这么做出来的,因为可以一小块一小块地读取,可以减轻内存压力,而且 不需要所有都读取完了才能播放,可以边读边播放     *      * @param context     * @param fileName     *            当fileName仅仅只是一个文件名字时,操作的是私有文件夹下的文件,但如果将路径传递过去,可以操作其它路径下的文件     * @return     * @throws IOException     */    public static String readAppFile(Context context, String fileName)            throws IOException {        if (context == null || fileName == null || fileName.equals("")) {            return null;        }                ByteArrayOutputStream stream = new ByteArrayOutputStream();        FileInputStream fileInputStream = context.openFileInput(fileName);        byte[] buffer = new byte[1024];        int len = -1;        /*         * fis.read(buffer)表示fis.read(buffer,0,buffer.length),表示从0开始读取buffer,         * 读取buffer         * .length长度至buffer,一直到读取完毕1024byte,不足1024时会读取到末尾,再将buffer写入stream         */        while ((len = fileInputStream.read(buffer)) != -1) {            //            stream.write(buffer, 0, len);        }        stream.close();        fileInputStream.close(); // 关闭输入流        // 转化成字符串,        return stream.toString();    }    /**     * 往私有文件写内容     *      * @param context     * @param fileName     *            当fileName仅仅只是一个文件名字时,操作的是私有文件夹下的文件,但如果将路径传递过去,可以操作其它路径下的文件     * @param content     *            要写的内容     * @return     * @throws IOException     */    public static void writeAppFile(Context context, String fileName,            String content) throws IOException {        if (context == null || fileName == null || fileName.equals("")) {            return;        }        FileOutputStream fileOutputStream = context.openFileOutput(fileName,                context.MODE_APPEND);        fileOutputStream.write(content.getBytes());        fileOutputStream.close(); // 关闭输出流    }    /**     * 从assets中读取文件数据,该样例是读取一个文件的字符串并进行返回, 实际使用中也可以读这个文件读取至SD卡,实现文件的复制等     *      * @param context     * @param fileName     * @throws IOException     */    public static String readFromAssets(Context context, String fileName)            throws IOException {        String res = "";        // 得到资源中的asset数据流        InputStream inputStream = context.getResources().getAssets()                .open(fileName);        int length = inputStream.available();        byte[] buffer = new byte[length];        // 先将数据流读入buffer        inputStream.read(buffer);        // 将buffer以utf-8转化成String并赋值        res = EncodingUtils.getString(buffer, "UTF-8");        return res;    }    // 读文件    public static String readSDFile(String fileName) throws IOException {        String res = "";        File file = new File(fileName);        FileInputStream fis = new FileInputStream(file);        int length = fis.available();        byte[] buffer = new byte[length];        fis.read(buffer);        res = EncodingUtils.getString(buffer, "UTF-8");        fis.close();        return res;    }    // 写文件    public static void writeSDFile(String fileName, String write_str)            throws IOException {        String res = "";        File file = new File(fileName);        FileOutputStream fos = new FileOutputStream(file);        byte[] bytes = write_str.getBytes();        fos.write(bytes);        fos.close();    }}

 

      1)测试writeAppFile和readAppFile,代码如下:

FileDemo.writeAppFile(this, "test.txt", "测试项");String test = FileDemo.readAppFile(this, "test.txt");Log.v(TAG,test);

      在应用的私有文件夹下可以看到文件已生成,

技术分享

      输出的log,技术分享

    

      2)测试public static String readFromAssets(Context context, String fileName);

      代码如下:

String readFromAssets = FileDemo.readFromAssets(this, "test.txt");Log.v(TAG, readFromAssets);

       已经将刚才生成的text.txt放至assets文件夹下,结果如下:

      技术分享

      3)测试public static void writeSDFile(String fileName, String writeContent)和public static String readSDFile(String fileName)

      代码如下:

FileDemo.writeSDFile("/sdcard/test.txt", "测试一下");String readFromSDFile = FileDemo.readSDFile("/sdcard/test.txt");Log.v(TAG, readFromSDFile);

       可以看到文件已经生成,

技术分享

     log如下,

 

技术分享

android学习之文件