Android SD卡简单的文件读写操作
2015-10-26 19:57
621 查看
最近有这样的需求,把每次统计到的数据,以txt形式保存到手机SD卡或是手机内存中,遇到一些问题,记录下来。
首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置:
[html]
view plaincopyprint?
<!-- 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卡是否存在
[java]
view plaincopyprint?
/**
* 判断SDCard是否存在 [当没有外挂SD卡时,内置ROM也被识别为存在sd卡]
*
* @return
*/
public static boolean isSdCardExist() {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
}
2,获取SD卡根目录
[java]
view plaincopyprint?
/**
* 获取SD卡根目录路径
*
* @return
*/
public static String getSdCardPath() {
boolean exist = isSdCardExist();
String sdpath = "";
if (exist) {
sdpath = Environment.getExternalStorageDirectory()
.getAbsolutePath();
} else {
sdpath = "不适用";
}
return sdpath;
}
3,获取默认的文件存放路径
[java]
view plaincopyprint?
/**
* 获取默认的文件路径
*
* @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读取文件
[java]
view plaincopyprint?
try {
le 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读取文件
[java]
view plaincopyprint?
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数据
[java]
view plaincopyprint?
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());
[java]
view plaincopyprint?
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写入文件
[java]
view plaincopyprint?
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写入文件
[java]
view plaincopyprint?
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++中就能看到换行后的效果?
[java]
view plaincopyprint?
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
[java]
view plaincopyprint?
BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
String info = " hey, yoo,bitch";
bw.write(info);
bw.write("\r\n");
bw.flush();
ok,先到这里,之后继续补充。
转载。
最近有这样的需求,把每次统计到的数据,以txt形式保存到手机SD卡或是手机内存中,遇到一些问题,记录下来。
首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置:
[html]
view plaincopyprint?
<!-- SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 向SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 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卡是否存在
[java]
view plaincopyprint?
/**
* 判断SDCard是否存在 [当没有外挂SD卡时,内置ROM也被识别为存在sd卡]
*
* @return
*/
public static boolean isSdCardExist() {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
}
/** * 判断SDCard是否存在 [当没有外挂SD卡时,内置ROM也被识别为存在sd卡] * * @return */ public static boolean isSdCardExist() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); }
2,获取SD卡根目录
[java]
view plaincopyprint?
/**
* 获取SD卡根目录路径
*
* @return
*/
public static String getSdCardPath() {
boolean exist = isSdCardExist();
String sdpath = "";
if (exist) {
sdpath = Environment.getExternalStorageDirectory()
.getAbsolutePath();
} else {
sdpath = "不适用";
}
return sdpath;
}
/** * 获取SD卡根目录路径 * * @return */ public static String getSdCardPath() { boolean exist = isSdCardExist(); String sdpath = ""; if (exist) { sdpath = Environment.getExternalStorageDirectory() .getAbsolutePath(); } else { sdpath = "不适用"; } return sdpath; }
3,获取默认的文件存放路径
[java]
view plaincopyprint?
/**
* 获取默认的文件路径
*
* @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;
}
/** * 获取默认的文件路径 * * @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读取文件
[java]
view plaincopyprint?
try {
le 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();
}
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读取文件
[java]
view plaincopyprint?
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();
}
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数据
[java]
view plaincopyprint?
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());
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
[java]
view plaincopyprint?
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);
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写入文件
[java]
view plaincopyprint?
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();
}
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写入文件
[java]
view plaincopyprint?
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();
}
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++中就能看到换行后的效果?
[java]
view plaincopyprint?
BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
String info = " hey, yoo,bitch";
bw.write(info);
bw.write("\n");
bw.flush();
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
[java]
view plaincopyprint?
BufferedWriter bw = new BufferedWriter(new FileWriter(file, true));
String info = " hey, yoo,bitch";
bw.write(info);
bw.write("\r\n");
bw.flush();
BufferedWriter bw = new BufferedWriter(new FileWriter(file, true)); String info = " hey, yoo,bitch"; bw.write(info); bw.write("\r\n"); bw.flush();
ok,先到这里,之后继续补充。
转载。
相关文章推荐
- Android 状态栏
- android 通过socket获取IP
- Android ADB 端口占用问题解决方案
- android中获取打气筒的几种方式
- android资源目录---assets与res/raw区别
- 【Android成长之路】最常用和最难用的控件——ListView的浅谈(提升ListView 的运行效率)
- Android JNI实现计算器demo
- Android JNI实现计算器demo
- Android JNI实现计算器demo
- Android ListView适配器BaseAdapter
- android部分目录分析
- Android开发手记(15) 拨打电话和收发短信
- Android 自定义字体
- android中的Bitmap
- Android实现崩溃统计(UncaughtExceptionHandler)
- Android应用清单文件:AndroidManifest.xml
- WIFI项目--Android Studio的.gitignore以及使用git提交拉取代码
- android短信接收处理和发送
- android 通知条效果
- android:LocationManager详解(-)