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如下,

 

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。