Android SD卡简单的文件读写操作

news/2024/11/23 5:13:16/



最近有这样的需求,把每次统计到的数据,以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,先到这里,之后继续补充。


http://www.ppmy.cn/news/653677.html

相关文章

苹果手机iCloud钥匙串的加密缺陷

什么是iCloud钥匙串 苹果钥匙串是苹果电脑&#xff0c;手机&#xff0c;平板上的密码管理器&#xff0c;帮助用户保存管理账号密码。开启iCloud云同步后&#xff0c;可以在用户的所有设备间同步账号密码&#xff0c;同时也会备份一份在iCloud上。 由于苹果默认会开启iCloud云同…

pc版android sd卡,告别瓶颈:安卓闪存(SD卡)I/O优化

告别瓶颈&#xff1a;安卓闪存(SD卡)I/O优化 闪存(SD卡)调度器 现在电脑的瓶颈往往不是什么内存CPU&#xff0c;而且吱吱嘎嘎的硬盘。在安卓机上&#xff0c;情况十分类似——虽然安卓机和SSD一样使用闪存&#xff0c;但没有专门的主控&#xff0c;速度好不到哪里去。由于成本限…

实名登记下的NFC手机读取二代证方法

实名登记在很多行业或者特殊场景都有很大的使用量&#xff0c;我们常见的银行业务办理、电信营业厅业务办理、酒店住宿、买车票、网吧、疫情期间的刷身份证检查核验等都在广泛使用。传统的方式我们都需要购买一个专用的“二代证读卡器”或者叫“身份证读卡器”的设备才能完成上…

苹果电脑ntfs如何打开硬盘?mac能读取的硬盘格式

如今&#xff0c;使用Mac电脑的用户越来越多&#xff0c;但是不少用户却面临着一个问题&#xff0c;那就是Mac无法正常读写自己的NTFS格式的外置硬盘&#xff0c;硬盘上面保存着很多重要的文件数据&#xff0c;想要进行复制或者是编辑等&#xff0c;压根没有办法在Mac电脑上进行…

使用android (android studio)和苹果ios手机读写NFC卡内容(MifareUltralight)方法 亲身完美体验过程

最近工作需要购买了一些nfc卡进行读写操作&#xff0c;目标是使用手机实现一些业务流程 淘宝购买1-2块钱一张卡&#xff0c;卖家提供的信息&#xff1a;卡的芯片是215 网上找的内容都是一段一段的&#xff0c;我现在把用到的资料都整合起来&#xff0c;以便看一篇就可以知道怎…

stm32 arduino 读取sd卡并在lcd(jlx12864)上播放badapple

目录 前言引脚连接代码示例 问题排查1. sd卡无法读取2. lcd无显示 前言 要问什么是测试单片机控制单色屏幕的最佳办法&#xff0c;我想badapple应该当之无愧&#xff0c;经典程度如helloworld。 这次&#xff0c;我用stm32f103c8t6arduino框架读取sd卡&#xff0c;并控制jlx12…

苹果7pnfc功能门禁卡_苹果下个月终于要开放NFC权限了!iphone一秒变身门禁卡

原标题:苹果下个月终于要开放NFC权限了!iphone一秒变身门禁卡 当我们开始习惯用iPhone的NFC功能进行移动支付,苹果公司要进一步开放NFC芯片功能,它将能用来充当钥匙,可以打开房门车门。 iPhone 6 之后的机型都配备了 NFC 芯片,这和蓝牙一样都是短距离通讯技术,可以在设备…

html 仿浏览器选项卡,【美化TabControl教程】仿苹果Safari浏览器选项卡

【实例简介】 【美化TabControl教程】仿苹果Safari浏览器选项卡 【实例截图】 一步一步玩控件:自定义TabControl——从山寨Apple Safari开始 教程: 分析,分析 山寨的灵魂在于分析,首先把刚才拍的高清果照扯过来分解了。 1337277056_9776.jpg (65.87 KB, 下载次数: 30) 【美…