最近有这样的需求,把每次统计到的数据,以txt形式保存到手机SD卡或是手机内存中,遇到一些问题,记录下来。

首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置:

  <!-- SDCard中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 向SDCard写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

接着在使用SDcard进行读写的时候 会用到Environment类下面的几个静态方法  :

1: getDataDirectory() 获取到Android中的data数据目录(sd卡中的data文件夹)
    2:getDownloadCacheDirectory() 获取到下载的缓存目录(sd卡中的download文件夹)
    3:getExternalStorageDirectory() 获取到外部存储的目录 一般指SDcard(/storage/sdcard0)
    4:getExternalStorageState() 获取外部设置的当前状态 一般指SDcard,比较常用的应该是 MEDIA_MOUNTED(SDcard存在并且可以进行读写)还有其他的一些状态,可以在文档中进行查找。

5:getRootDirectory()  获取到Android Root路径

好,以下是具体操作,直接看代码:

1,判断SD卡是否存在

 /*** 判断SDCard是否存在 [当没有外挂SD卡时,内置ROM也被识别为存在sd卡]* * @return*/public static boolean isSdCardExist() {return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);}

2,获取SD卡根目录

 /*** 获取SD卡根目录路径* * @return*/public static String getSdCardPath() {boolean exist = isSdCardExist();String sdpath = "";if (exist) {sdpath = Environment.getExternalStorageDirectory().getAbsolutePath();} else {sdpath = "不适用";}return sdpath;}

3,获取默认的文件存放路径

 /*** 获取默认的文件路径* * @return*/public static String getDefaultFilePath() {String filepath = "";File file = new File(Environment.getExternalStorageDirectory(),"abc.txt");if (file.exists()) {filepath = file.getAbsolutePath();} else {filepath = "不适用";}return filepath;}

4-1,使用FileInputStream读取文件

        try {File file = new File(Environment.getExternalStorageDirectory(),"test.txt");FileInputStream is = new FileInputStream(file);byte[] b = new byte[inputStream.available()];is.read(b);String result = new String(b);System.out.println("读取成功:"+result);} catch (Exception e) {e.printStackTrace();}

4-2,使用BufferReader读取文件

     try {File file = new File(Environment.getExternalStorageDirectory(),DEFAULT_FILENAME);BufferedReader br = new BufferedReader(new FileReader(file));String readline = "";StringBuffer sb = new StringBuffer();while ((readline = br.readLine()) != null) {System.out.println("readline:" + readline);sb.append(readline);}br.close();System.out.println("读取成功:" + sb.toString());} catch (Exception e) {e.printStackTrace();}

httpConnection读取流保存成String数据

         URL url = new URL(getForwardUrl("/queryUserByUNorIP"));HttpURLConnection conn = (HttpURLConnection) url.openConnection();InputStream is = conn.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));StringBuilder sb = new StringBuilder();String readline = null;while ((readline = br.readLine()) != null) {sb.append(readline);}System.out.println("result"+sb.toString());

等效于使用ByteArrayOutputStream

             InputStream is = conn.getInputStream();ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len =-1 ;while ((len=is.read(buffer))!=-1) {bos.write(buffer, 0, len);}is.close();bos.close();String result = new String(bos.toByteArray());System.out.println("result"+result);

5-1,使用FileOutputStream写入文件

     try {File file = new File(Environment.getExternalStorageDirectory(),DEFAULT_FILENAME);FileOutputStream fos = new FileOutputStream(file);String info = "I am a chinanese!";fos.write(info.getBytes());fos.close();System.out.println("写入成功:");} catch (Exception e) {e.printStackTrace();}

5-2,使用BufferedWriter写入文件

     try {File file = new File(Environment.getExternalStorageDirectory(),DEFAULT_FILENAME);//第二个参数意义是说是否以append方式添加内容BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));String info = " hey, yoo,bitch";bw.write(info);bw.flush();System.out.println("写入成功");} catch (Exception e) {e.printStackTrace();}

读取和写入我们都实现了,貌似很简单的样子,但是我们现在想每隔30秒进行一次数据整理,然后把他们写入到我们制定的txt文件中,但是我想每次都能在上一次的结尾处开始写入,这样在电脑上通过文本打开时,就能看到每一行的数据了。

这其实要求我们每一次写入数据时,都要有换行的操作符号,比如:\n,并且IO读写能以追加的方式写入到文件里。

刚开始我很笨的想到,每次写入前,先把文件读取出来并且生成一个StringBuffer,然后再append,然后再写入.....这种方式导致每次都要2次以上的IO操作,读和写。其实系统写入时就给我们自带了append方式,还是要勤看文档啊!

BufferedWriter

使用BufferedWriter,在构造BufferedWriter时,把第二个参数设为true
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(  
                    new FileOutputStream(file, true)));  
         out.write(conent);

FileWriter

构造函数中的第二个参数true表示以追加形式写文件  
         FileWriter writer = new FileWriter(fileName, true);  
         writer.write(content);  
         writer.close();

// 打开一个随机访问文件流,按读写方式  
RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");  
// 文件长度,字节数  
long fileLength = randomFile.length();  
// 将写文件指针移到文件尾。  
randomFile.seek(fileLength);  
randomFile.writeBytes(content);  
randomFile.close();

问题:我在file写入时,没一次写完后,明明都添加了换行符(bw.write("\n")),为什么在Window的文本文档中看不到换行呢?而在EditPlus或是notepad++中就能看到换行后的效果?

         BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));String info = " hey, yoo,bitch";bw.write(info);bw.write("\n");bw.flush();

如上代码所示,可是在windows的文本文档中:

但是在诸如notepad++或EditPlus中看到却是没问题的:

这是为什么呢?

这是windows与linux系统的编码模式不同造成的。android系统是linux内核,与windows不同。windows是采用的是DOS编码方式,所用的换行符是DOS换行符CR/LF,也就是我们俗称的\r\n,(如果不理解可以去百度一下转义字符,一般程序员会用到这些知识),而linux系统的换行符为UNIX换行符LF,也就是\n,苹果的MAC系统用的是MAC换行符CR,也就是\r,现在我想你也差不多理解了。你在android手机里建立的文档肯定用的是UNIX换行符,也就是一个\n,但是这个文档你拿到windows里用记事本打开的话,因为windows记事本是DOS换行符\r\n,所以你少了个\r,所以没法识别成换行,只能给你识别成一个小方块了,解决办法很简单,你可以用EditPlus或者UltraEdit软件打开,UltraEdit也能转换这些编码模式,转换成DOS模式就可以了。

所以,我们只需要添加:\r\n

         BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));String info = " hey, yoo,bitch";bw.write(info);bw.write("\r\n");bw.flush();

ok,先到这里,之后继续补充。

Android SD卡简单的文件读写操作相关推荐

  1. android sd卡列目录文件_Android正确获取SD卡目录及使用SD卡目录

    此文乃是转载,原文在这里链接 SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件.因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作 ...

  2. android浏览SD卡的文件,简单实现浏览Android SD卡中的文件

    ----Main.java public class Main extends Activity { private TextView textView; private Button button; ...

  3. android sd卡列目录文件_Android加载SD卡目录,文件夹遍历,图片设置,设置文件对应打开方式等...

    public class GridViewFile extends Activity implementsView.OnClickListener {privateContext context;pr ...

  4. android sd卡列目录文件_(科普)详解Android系统SD卡各类文件夹名称

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 15.moji:墨迹天气的缓存目录. 16.MusicFolders:poweramp产生的缓存文件夹. 17.openfeint:openfeint的缓 ...

  5. Android中的文件读写操作

    在android开发中文件操作使用的其实还是比较高频的,之前我遇到这种需求都随便写写,对此没有一个比较全面的认识,所以想借这篇文章来梳理一遍. 由于需要读写文件,这包含了读写外部sd card的文件, ...

  6. 【嵌入式20】STM32F103完成对SD卡的数据读取详细操作

    本文主要利用STM32F103完成对SD卡的数据读取,介绍该实验的详细操作 一.题目要求 二.SD卡协议原理 1.SD卡简述 2.SD卡物理结构 3.SD卡寄存器 4.SD卡操作模式 5.SD卡初始化 ...

  7. android读写sd卡代码,android读写SD卡中的文件 demo

    有时,我们需要将更大的文件保存下来,就不能用手机内置的存储空间,毕竟是有限的,所以将文件保存在SD卡中. 要读写SD卡,首先要知道手机上是否有SD卡,且是否可读写 String str = " ...

  8. kotlin读取sd卡里的文件_Kotlin Android读写外部存储

    本文概述 Android外部存储空间是我们执行读写操作的存储空间.外部存储器中的文件存储在/ sdcard或/ storage文件夹等中.保存在外部存储器中的文件是可读的, 并且可由用户修改. 在访问 ...

  9. Android - 文件读写操作 总结

    http://blog.csdn.net/ztp800201/article/details/7322110 在android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中 ...

最新文章

  1. Php Fatal error: Allowed memory size of 33554432 bytes exhausted 的解决办法
  2. 你有一张邀请函:全球AI技术开发日南京站——9月8日走进地平线
  3. (课程)基于Spark的机器学习经验
  4. hough变换是如何检测出直线和圆的
  5. ECMAScript 2021(ES12)新特性简介
  6. PX4飞控之导航及任务架构
  7. nodejs+grunt配置记
  8. 记忆化搜索,FatMouse and Cheese
  9. oracle中的视图
  10. c语言 malloc_C语言数据结构 | 第一讲
  11. 【洛谷 1027】双重回文数
  12. Oracle数据库的学习
  13. MATLAB实现的Reed-Muller(RM码,里德-马勒编码)编码解码纠错以及BER分析
  14. Matlab/Simulink仿真问题及技巧汇总【持续更新】
  15. WorkFlow:BPMN 2.0介绍(一):参与者(Participant)
  16. 对于程序员“中年危机”的一点思考
  17. Linux 模拟网络丢包及延时
  18. 92.【SpringCloud NetFilx】
  19. 虚拟ip+keeplalived+nginx 负载实现
  20. 电脑定时关机怎么设置?win10怎么设置定时关机

热门文章

  1. C++中的stack容器适配器
  2. 到底什么才是真正的商业智能(BI)
  3. 电路实验一阶电路误差分析_常见滤波电路分析技巧
  4. java基础-1 基础知识
  5. BIOS工程师需要掌握的知识
  6. 记录每天学习的新知识:AlarmManager 定时任务
  7. wps字体缺失,问题
  8. 小米电脑桌面没见计算机怎么办,手机屏幕太小?一分钟教会你小米手机投屏电脑方法,低调收藏!...
  9. 将 Cpar 文件导入 2019 版的 Carsim 后,无法打开 video+plot 是什么问题?
  10. 关于meta: description HTML 标签的解释 ,SEO