android File 读取存储 saveTo sdcard

来源:互联网 发布:cacti 监控windows 编辑:程序博客网 时间:2024/05/15 02:58
package cn.itcast.service;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import android.content.Context;
import android.os.Environment;

public class FileService {
    private Context context;

    public FileService(Context context) {
        this.context = context;
    }

    // <!-- 在SDCard中创建与删除文件权限 -->
    // <uses-permission
    // android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    // <!-- 往SDCard写入数据权限 -->
    // <uses-permission
    // android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    public void saveToSDCard(String filename, String content) throws Exception {
        //File file=new File("/mnt/sdcard",filename); 但是不建议这么写 因为可能因为版本的不同而变化;
        File file = new File(Environment.getExternalStorageDirectory(),
                filename);
        FileOutputStream outStream = new FileOutputStream(file);
        outStream.write(content.getBytes());
        outStream.close();
    }

    /**
     * 保存文件
     *
     * @param filename
     *            文件名称
     * @param content
     *            文件内容
     */
    public void save(String filename, String content) throws Exception {
        // 私有操作模式:创建出来的文件只能被本应用访问,其它应用无法访问该文件,另外采用私有操作模式创建的文件,写入文件中的内容会覆盖原文件的内容
        FileOutputStream outStream = context.openFileOutput(filename,
                Context.MODE_PRIVATE);
        outStream.write(content.getBytes());
        outStream.close();
    }

    /**
     * 保存文件
     *
     * @param filename
     *            文件名称
     * @param content
     *            文件内容
     */
    public void saveAppend(String filename, String content) throws Exception {// ctrl+shift+y//
                                                                                // x
        // Context.Mode_APPEND:和私有一样只能被本应用访问;不同点 检查文件是否存在; 存在就追加到原文件中;
        FileOutputStream outStream = context.openFileOutput(filename,
                Context.MODE_APPEND);
        // content.getBytes(String encoding); 会使用 和系统指定的字符集编码; 如果没有指定 会使用iso8859-1;
        outStream.write(content.getBytes());
        outStream.close();
    }

    /**
     * 保存文件
     *
     * @param filename
     *            文件名称
     * @param content
     *            文件内容
     */
    public void saveReadable(String filename, String content) throws Exception {
        // 私有操作模式:创建出来的文件只能被本应用访问,其它应用无法访问该文件,另外采用私有操作模式创建的文件,写入文件中的内容会覆盖原文件的内容
        FileOutputStream outStream = context.openFileOutput(filename,
                Context.MODE_WORLD_READABLE);
        outStream.write(content.getBytes());
        outStream.close();
    }

    /**
     * 保存文件
     *
     * @param filename
     *            文件名称
     * @param content
     *            文件内容
     */
    public void saveWriteable(String filename, String content) throws Exception {
        // writeable 文件不能被其他的读取; 但是能够被写入(自己感觉是覆盖里面的内容)
        FileOutputStream outStream = context.openFileOutput(filename,
                Context.MODE_WORLD_WRITEABLE);
        outStream.write(content.getBytes());
        outStream.close();
    }

    /**
     * 保存文件
     *
     * @param filename
     *            文件名称
     * @param content
     *            文件内容
     */
    public void saveRW(String filename, String content) throws Exception {
        // 如果希望文件被其他应用读和写; 可以传入
        // Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE;
        // 默认的写的模式写模式是覆盖掉;如果想追加的话 在fileoutputStream(file,true);
        // 就会追加了;
        FileOutputStream outStream = context.openFileOutput(filename,
                Context.MODE_WORLD_WRITEABLE + Context.MODE_WORLD_READABLE);
        outStream.write(content.getBytes());
        outStream.close();
    }

    /**
     * 读取文件内容
     *
     * @param filename
     *            文件名称
     * @return 文件内容
     * @throws Exception
     */
    public String read(String filename) throws Exception {
        FileInputStream inStream = context.openFileInput(filename);
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();// 装进内存缓存流;
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);// 先读取到内存中;
        }
        byte[] data = outStream.toByteArray();//字节流的数组;
        return new String(data);
    }

}


//-----------------------------------------------本应用中的testCase -----AndroidTestCase-------------------------------------------------------

public class FileServiceTest extends AndroidTestCase {
    private static final String TAG = "FileServiceTest";
    
    public void testRead() throws Throwable{
        // 默认的是 保存到手机存储空间; 在本应用中这里不用写路径;
        FileService service = new FileService(this.getContext());
        String result = service.read("itcast.txt");
        Log.i(TAG, result);
    }
    
    public void testSaveAppend() throws Throwable{
        
        FileService service = new FileService(this.getContext());
        service.saveAppend("append.txt", ",liming");
    }

//----------------------------------------------------------------------other 其他应用中访问本应用的文件的TestCase-----------------------------------------


package cn.itcast.test;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;

import android.test.AndroidTestCase;
import android.util.Log;

public class AccessOtherAppFileTest extends AndroidTestCase {

    private static String read(InputStream inStream) throws Exception{
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while((len = inStream.read(buffer)) != -1){
            outStream.write(buffer, 0, len);
        }
        byte[] data = outStream.toByteArray();
        return new String(data);
    }
    
    public void testAccessFile() throws Throwable{
        String path = "/data/data/cn.itcast.files/files/itcast.txt";
        File file = new File(path);
        FileInputStream inStream = new FileInputStream(file);
        Log.i("AccessOtherAppFileTest", read(inStream));
    }
    
    public void testAccessFile2() throws Throwable{
        String path = "/data/data/cn.itcast.files/files/append.txt";
        File file = new File(path);
        FileInputStream inStream = new FileInputStream(file);
        Log.i("AccessOtherAppFileTest", read(inStream));
    }
    
    public void testAccessFile3() throws Throwable{
        String path = "/data/data/cn.itcast.files/files/readable.txt";
        File file = new File(path);
        FileInputStream inStream = new FileInputStream(file);
        Log.i("AccessOtherAppFileTest", read(inStream));
    }
    
    public void testAccessFile4() throws Throwable{
        String path = "/data/data/cn.itcast.files/files/writeable.txt";
        File file = new File(path);
        FileInputStream inStream = new FileInputStream(file);
        Log.i("AccessOtherAppFileTest", read(inStream));
    }
    
    public void testAccessFile5() throws Throwable{
        // 在访问别的项目的文件的时候 需要指定路径;
        String path = "/data/data/cn.itcast.files/files/writeable.txt";
        File file = new File(path);
        FileOutputStream outStream = new FileOutputStream(file);
        outStream.write("itcast".getBytes());
        outStream.close();
    }
    
    public void testAccessFile7() throws Throwable{
        String path = "/data/data/cn.itcast.files/files/rw.txt";
        File file = new File(path);
        FileInputStream inStream = new FileInputStream(file);
        Log.i("AccessOtherAppFileTest", read(inStream));
    }
    
    public void testAccessFile8() throws Throwable{
        String path = "/data/data/cn.itcast.files/files/rw.txt";
        File file = new File(path);
        FileOutputStream outStream = new FileOutputStream(file,true);// 在fileout putStream 可以指定 是否追加到文件末尾; 默认是覆盖;
        outStream.write("8888".getBytes());
        outStream.close();
    }
}