我们java中的io流分为两大类,字节流和字符流。
可是在具体使用的时候怎么视情况进行使用?
怎么使用更加有效率?
有两个例子,帮忙看看解释一下,用哪种比较有效率以及适用情况。
下面是用字符流进行读写
写入
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
//关闭
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
读取
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
//关闭
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
下面使用字节流读写
写入
public void WriteFiles(String content){
try {
FileOutputStream fos = openFileOutput("a.txt", MODE_WORLD_READABLE+MODE_WORLD_WRITEABLE);
fos.write(content.getBytes());
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
读取
public String readFiles(){
String content = null;
try {
FileInputStream fis= openFileInput("a.txt");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte [] buffer = new byte[1024];
int len = 0;
while ((len=fis.read(buffer))!=-1) {
baos.write(buffer, 0, len);
}
content = baos.toString();
fis.close();
baos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
}
对小文件读写,几乎无差异。
对大文件读写,Buffer比较好些。对于多次读写硬盘,好的缓存机制能快些。比方说60GB文件,你肯定分批(甚至分行),多次读写。
其次,你想处理字符,还是字节,根据需要选择。
两者的区别就是:字节流可以既可以操作文本文件,也可以操作非文本文件,如一些二进制数据(图片,视频,对象),而字符流只能操作文本。这也是两者的适用情况,如何决定该使用哪种数据流读写取决于要读写的数据类型,若是文本本件,当然选择字符流,因为我们都知道字符流每次处理的单元为2个字节的Unicode字符,而字节流每次处理的是一个,若是非文本文件,那么就只能用字节流了,这个时候就不能单纯的看谁的效率高了。我想这也是为什么要有两者数据流的原因吧。
所有的IO操作都是通过字节完成的,系统底层不存在字符这个概念,Java中 InputStream 和 OutputStream 中只有字节操作方法,没有字符串方法。所有的可以进行字符串读写的流封装对象,都是上层实现,方便使用而已。
具体选择那种流来使用,他们之间效率如何,都要看具体场景和功能实现的目的,没有单纯的好坏。
以你上面的两个例子,效果完全是一样的,只不过你选择使用 BufferedWriter 和 BufferedReader 的内部实现还是字节实现 Buffer 缓冲而已。
Java 是开源的,建议多看源码,熟悉内部原理和实现。