android学习之文件
一、输入输出流
首先,你要明白什么是“流”。直观地讲,流就像水一样,不存在大小问题,也避免了完整性问题。非流的数据传输,比如你下载一张图片,需要整幅图片下载完之后才能使用,而流则不同,就像水,你取一杯也可以用,取一桶也可以用。所以说,流是一种数据传输的模式。
而输入流和输出流,差别在于出和入,是相对于程序而言的。“输入流式得到数据,输出流是输出数据”,这种说法是对的。你把问题想复杂了,输入是程序得到外部数据,输出是程序向外部传输数据,二者没有必然的联系,都是流,差别是方向不同,也就是说,程序可以只有输入流而没有输出流,或者只有输出流而没有输入流。
另外补充一下,流的好处是接收方可以提前处理,缩短等待时间,提高速度。比如你上youku看视频,并不是整个视频下载好了才播放的,而是下一点播一点。但是不是所有应用都适合,比如加密了的文件,往往需要整个加密文件接收完了才能解密。
总结如下:
1.流是一种数据传输模式。
2.出与入是相对于程序。
3.流的好处是无须全部接受完就可以处理。
二、android文件操作
下面是我自己总结的文件操作的代码。
package com.lintao.file; import org.apache.http.util.EncodingUtils; import android.content.Context; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class FileDemo { /** * 读取私有文件夹下的文件,流的操作一般都会通过一个byte[]数组作为buffer来作为转存,这里 * 猜想,实时的视频播放大概就是这么做出来的,因为可以一小块一小块地读取,可以减轻内存压力,而且 不需要所有都读取完了才能播放,可以边读边播放 * * @param context * @param fileName * 当fileName仅仅只是一个文件名字时,操作的是私有文件夹下的文件,但如果将路径传递过去,可以操作其它路径下的文件 * @return * @throws IOException */ public static String readAppFile(Context context, String fileName) throws IOException { if (context == null || fileName == null || fileName.equals("")) { return null; } ByteArrayOutputStream stream = new ByteArrayOutputStream(); FileInputStream fileInputStream = context.openFileInput(fileName); byte[] buffer = new byte[1024]; int len = -1; /* * fis.read(buffer)表示fis.read(buffer,0,buffer.length),表示从0开始读取buffer, * 读取buffer * .length长度至buffer,一直到读取完毕1024byte,不足1024时会读取到末尾,再将buffer写入stream */ while ((len = fileInputStream.read(buffer)) != -1) { // stream.write(buffer, 0, len); } stream.close(); fileInputStream.close(); // 关闭输入流 // 转化成字符串, return stream.toString(); } /** * 往私有文件写内容 * * @param context * @param fileName * 当fileName仅仅只是一个文件名字时,操作的是私有文件夹下的文件,但如果将路径传递过去,可以操作其它路径下的文件 * @param content * 要写的内容 * @return * @throws IOException */ public static void writeAppFile(Context context, String fileName, String content) throws IOException { if (context == null || fileName == null || fileName.equals("")) { return; } FileOutputStream fileOutputStream = context.openFileOutput(fileName, context.MODE_APPEND); fileOutputStream.write(content.getBytes()); fileOutputStream.close(); // 关闭输出流 } /** * 从assets中读取文件数据,该样例是读取一个文件的字符串并进行返回, 实际使用中也可以读这个文件读取至SD卡,实现文件的复制等 * * @param context * @param fileName * @throws IOException */ public static String readFromAssets(Context context, String fileName) throws IOException { String res = ""; // 得到资源中的asset数据流 InputStream inputStream = context.getResources().getAssets() .open(fileName); int length = inputStream.available(); byte[] buffer = new byte[length]; // 先将数据流读入buffer inputStream.read(buffer); // 将buffer以utf-8转化成String并赋值 res = EncodingUtils.getString(buffer, "UTF-8"); return res; } // 读文件 public static String readSDFile(String fileName) throws IOException { String res = ""; File file = new File(fileName); FileInputStream fis = new FileInputStream(file); int length = fis.available(); byte[] buffer = new byte[length]; fis.read(buffer); res = EncodingUtils.getString(buffer, "UTF-8"); fis.close(); return res; } // 写文件 public static void writeSDFile(String fileName, String write_str) throws IOException { String res = ""; File file = new File(fileName); FileOutputStream fos = new FileOutputStream(file); byte[] bytes = write_str.getBytes(); fos.write(bytes); fos.close(); } }
1)测试writeAppFile和readAppFile,代码如下:
FileDemo.writeAppFile(this, "test.txt", "测试项"); String test = FileDemo.readAppFile(this, "test.txt"); Log.v(TAG,test);
在应用的私有文件夹下可以看到文件已生成,
2)测试public static String readFromAssets(Context context, String fileName);
代码如下:
String readFromAssets = FileDemo.readFromAssets(this, "test.txt"); Log.v(TAG, readFromAssets);
已经将刚才生成的text.txt放至assets文件夹下,结果如下:
3)测试public static void writeSDFile(String fileName, String writeContent)和public static String readSDFile(String fileName)
代码如下:
FileDemo.writeSDFile("/sdcard/test.txt", "测试一下"); String readFromSDFile = FileDemo.readSDFile("/sdcard/test.txt"); Log.v(TAG, readFromSDFile);
可以看到文件已经生成,
log如下,
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。