zoukankan      html  css  js  c++  java
  • android 以追加形式写文件并把文件保存到SD卡中

      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

    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
    ");
            method2(fileName, "I am the new content
    ");
            method3(fileName, "I am the new content
    ");
        }
    
        /**
         * 追加文件:使用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;
        }
    }
    View Code

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

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

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

      2.细心的朋友会发现,中文存入之后会出现乱码,乱码的问题就不在这进行解决了,先写到这吧

  • 相关阅读:
    三: 视图容器。
    (微信小程序)一 : 初识微信小程序
    Centos 从零开始 (四)
    Centos 从零开始 (三)
    Centos 从零开始 (二)
    Centos 从零开始 (一)
    9、下拉刷新 与 上拉加载
    8、导航:Nav
    C#异步编程 Task await的理解
    WPF 获取主线程
  • 原文地址:https://www.cnblogs.com/goldeneast/p/3277534.html
Copyright © 2011-2022 走看看