监控sd卡数据恢复生成两个文件咋办,同时还有很多不可读的

102779人阅读
Android(38)
最近有这样的需求,把每次统计到的数据,以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卡]
public static boolean isSdCardExist() {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
2,获取SD卡根目录
* 获取SD卡根目录路径
public static String getSdCardPath() {
boolean exist = isSdCardExist();
String sdpath = &&;
if (exist) {
sdpath = Environment.getExternalStorageDirectory()
.getAbsolutePath();
sdpath = &不适用&;
3,获取默认的文件存放路径
* 获取默认的文件路径
public static String getDefaultFilePath() {
String filepath = &&;
File file = new File(Environment.getExternalStorageDirectory(),
&abc.txt&);
if (file.exists()) {
filepath = file.getAbsolutePath();
filepath = &不适用&;
4-1,使用FileInputStream读取文件
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读取文件
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 =
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写入文件
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写入文件
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,先到这里,之后继续补充。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4015432次
积分:14324
积分:14324
排名:第899名
原创:95篇
转载:24篇
评论:711条
(1)(1)(1)(1)(3)(2)(11)(6)(1)(7)(1)(1)(3)(2)(1)(10)(4)(6)(9)(4)(10)(1)(5)(4)(1)(3)(2)(9)(5)(1)(6)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'[转载]犯了个常识性错误——SD卡上文件无法删除问题的解决
&&&&这两天借同事的数码相机用了,导出照片时用的读卡器。打开存储卡时没发现有存储照片的文件夹DCIM,设置计算机显示系统文件及隐藏文件,发现是DCIM文件夹被隐藏了,且设置为只读--估计该SD卡被病毒亲密接触过或亲密接触中。将所照照片剪切出来,粘贴成功,但竟然无法删除!
在我的电脑中删除照片,提示“无法删除,磁盘被写保护”。难道SD卡上的病毒(恶意软件)如此厉害,竟然不给删除文件?!用杀毒软件、Windows清理助手、360安全卫士等轮番扫描存储卡,没提示有病毒或恶意软件。使用冰刃强行删除照片,提示删除失败;又反复使用其它强行删除工具删除,都提示失败。
这病毒就这么厉害!?难道只有格式化SD卡一条路可走了?将卡中数据复制出来,格式化!提示“磁盘有写保护!”,无法格式化!
不可思议!提示“磁盘被写保护”,将卡取下,发现SD卡的一侧缺口处有个白色推钮,且在缺口附近卡的正面有一条绿色线上标识“Lock”,而白色推钮正位于Lock处!难道此SD卡具有写保护功能?将白色推钮往另一方向推,远离Lock字样,再次删除文件,成功了。
上图是从网络上找来的一张SD卡图,我加上了文字标识
&&&&呵呵,犯了个常识性错误,很明显的提示是“写保护了”,我竟然没想到SD卡会有写保护功能!意识中只是软盘、U盘或移动硬盘有写保护功能,没想到SD卡也会有。所以就根据DCIM文件夹被隐藏的现状往查杀病毒的思路行动了。
看来,固定的思维模式也挺折腾人的。我们需要创新、思变!
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。2016年8月 移动开发大版内专家分月排行榜第二
2016年9月 移动开发大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。手机SD卡无法读取怎么办 手机SD卡无法读取解决方法【图文】
  最近有朋友反映手机sd卡无法读取了,相信广大网友也会遇到这种问题。那么,下面小编整理了手机sd卡无法读取怎么办及解决方法,一起来看看吧。    手机SD卡无法读取原因一:SD卡不干净  不少用户平时不注意保养自己的电子产品,对SD卡的保护不够好,SD卡的金属区域会沾有灰尘或油污,造成与卡槽接触不良,有时无法读取的情况。  解决方法:检查SD卡的金属区域是否暗淡或有斑,如果有,使用酒精或水清理,吹干即可。    手机SD卡无法读取原因二:卡槽受挤压  现在市场上的超薄机型越来越多,其卡槽设计非常巧妙。如果使用非原装电池,可能由于厚度超出标准对卡槽形成挤压,出现手机SD卡无法读取的现象。  解决方法:更换原装电池试试。  手机SD卡无法读取原因三:卡槽金属丝生锈或歪曲  很多手机的SD卡都支持 热插拔 ,频繁的抽查SD卡可能会造成SD卡卡槽金属丝过度弯曲或生锈。  解决方法:仔细检查卡槽金属丝是否弯曲或生锈,如果弯曲,用针将金属丝下挑;如果生锈,清理即可。    手机SD卡无法读取原因四:SD卡中病毒  目前智能手机的应用市场上有很多软件或游戏都包含病毒,如果SD卡中毒,很可能无法正常读取。  解决方法:使用读卡器连接电脑,使用杀毒软件清理,如果仍无法解决,将SD卡格式化。  手机SD卡无法读取原因五:SD卡损坏  这个很容易判断,使用读卡器连接电脑,如果可以正常显示,说明SD卡完好,如果不能读取,说明SD卡已经损坏。    手机SD卡无法读取原因六:手机故障  虽然这种情况出现的几率比较小,但也有因手机问题造成手机SD卡无法读取的情况,只能送修了。  以上就是小编为您介绍的手机SD卡无法读取的解决方法,希望能够帮助到您。更多关于手机SD卡无法读取的相关资讯,请继续关注IT百科。
最新更新栏目
您可能喜欢
大家都在搜

我要回帖

更多关于 sd卡监控无法循环 的文章

 

随机推荐