您的位置:首页 > 移动开发 > Android开发

Android之SD卡以追加形式写文件并把文件保存到SD卡中

2016-07-08 22:24 537 查看
android手机内存本来就不大,要是老把数据放在手机里,很明显会让手机的使用者体验到什么是“卡”,所以,我们把数据要放到SD卡中,以减少手机内存的使用,本文仅写入文件,不对读文件进行说明。好,go!

第一步:新建android项目,命名为Test



next -> next ..一切默认

第二步:在AndroidManifest.xml中添加权限

往往是用到什么再最后加权限,既然现在的目的很明确,就直接将文件创建删除权限以及SD卡的读写权限一并添加上了

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


别忘了,这些权限是加在<application>标签对的外面

第三步:创建界面,默认已经生成了layout文件 activity_main.xml 

现在要实现的功能只是以追加形式写文件并把文件保存到SD卡中,对界面没什么需求,界面不改了,默认显示出hello world 吧

 

第四步:完善代码

核心功能来了,直接附上代码吧

MainActivity.JAVA

[java] view
plain copy

package com.example.test;  

  

import java.io.BufferedWriter;  

import java.io.File;  

import java.io.FileInputStream;  

import java.io.FileOutputStream;  

import java.io.FileWriter;  

import java.io.IOException;  

import java.io.OutputStreamWriter;  

import java.io.RandomAccessFile;  

  

import android.app.Activity;  

import android.os.Bundle;  

import android.os.Environment;  

import android.view.Menu;  

  

public class MainActivity extends Activity {  

    FileOutputStream fos;  

    FileInputStream fis;  

  

    @Override  

    protected void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  

        String fileName = getSDPath() + "/" + "testYL.txt";  

        method1(fileName, "I am the new content\n");  

        method2(fileName, "I am the new content\n");  

        method3(fileName, "I am the new content\n");  

    }  

  

    /** 

     * 追加文件:使用FileOutputStream,在构造FileOutputStream时,把第二个参数设为true 

     *  

     * @param fileName 

     * @param content 

     */  

    public static void method1(String file, String conent) {  

        BufferedWriter out = null;  

        try {  

            out = new BufferedWriter(new OutputStreamWriter(  

                    new FileOutputStream(file, true)));  

            out.write(conent);  

        } catch (Exception e) {  

            e.printStackTrace();  

        } finally {  

            try {  

                out.close();  

            } catch (IOException e) {  

                e.printStackTrace();  

            }  

        }  

    }  

  

    /** 

     * 追加文件:使用FileWriter 

     *  

     * @param fileName 

     * @param content 

     */  

    public static void method2(String fileName, String content) {  

        try {  

            // 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件  

            FileWriter writer = new FileWriter(fileName, true);  

            writer.write(content);  

            writer.close();  

        } catch (IOException e) {  

            e.printStackTrace();  

        }  

    }  

  

    /** 

     * 追加文件:使用RandomAccessFile 

     *  

     * @param fileName 

     *            文件名 

     * @param content 

     *            追加的内容 

     */  

    public static void method3(String fileName, String content) {  

        try {  

            // 打开一个随机访问文件流,按读写方式  

            RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");  

            // 文件长度,字节数  

            long fileLength = randomFile.length();  

            // 将写文件指针移到文件尾。  

            randomFile.seek(fileLength);  

            randomFile.writeBytes(content);  

            randomFile.close();  

        } catch (IOException e) {  

            e.printStackTrace();  

        }  

    }  

  

    public String getSDPath() {  

        File sdDir = null;  

        boolean sdCardExist = Environment.getExternalStorageState().equals(  

                android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在  

        if (sdCardExist) {  

            sdDir = Environment.getExternalStorageDirectory();// 获取跟目录  

        }  

        return sdDir.toString();  

    }  

  

    @Override  

    public boolean onCreateOptionsMenu(Menu menu) {  

        // Inflate the menu; this adds items to the action bar if it is present.  

        getMenuInflater().inflate(R.menu.activity_main, menu);  

        return true;  

    }  

}  

 

经本人联想630真机测试,完全通过。

至此,要对以上代码做一些说明

  1.RandomAccessFile是用来访问那些保存数据记录的文件的,这样你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。

  2.细心的朋友会发现,中文存入之后会出现乱码,乱码的问题就不在这进行解决了,先写到这吧
感谢http://blog.csdn.net/mexican_ok/article/details/12686279
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息