黑马程序员技术交流社区
标题:
IO接口原理三
[打印本页]
作者:
刘付力
时间:
2012-8-18 07:57
标题:
IO接口原理三
------- <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! ----
关于IO接口原理的第三贴 生命不息,折腾不止!向上吧,骚年!!!
第一节 缓冲流
为了提高数据读写能力,我们一般会使用一种新的流类,缓冲流。,他会创建一个内部缓冲区数组。在读取字节或字符
时,会先把从数据源读取到的数据填充该内部缓冲区,然后再返回;在写入字符或字节时,会先把要写入的数据填充该内部缓冲区,然后一次性写入到目标数据源中。
根据数据操作单位可以吧缓冲流分为两类。
BufferInputStream和BufferOutputStream:正对字节的缓冲输入和输出流。
BufferedReader和BufferedWriter:针对字符的缓冲输入和输出流。
缓冲流属于过滤流,也就是缓冲流并不直接操作数据源,而是对直接操作数据源的节点流的一个包装,以此增强他的功能。下面给出一个使用缓冲流来改写字符文本文件
复制功能的例子代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**用BufferedReader和BufferedWriter实现字符文本文件复制的功能 */
public class BufferedTextCopyTest {
public static void main(String[] args) {
BufferedReader br = null;
BufferedWriter bw = null;
try {
//创建缓冲流对象:它是过滤流,是对节点流的包装
br = new BufferedReader(new FileReader("d:\\IOTest\\source.txt"));
bw = new BufferedWriter(new FileWriter("d:\\IOTest\\destBF.txt"));
String str = null;
while ((str = br.readLine()) != null) { //一次读取字符文本文件的一行字符
bw.write(str); //一次写入一行字符串
bw.newLine(); //写入行分隔符
}
bw.flush(); //刷新缓冲区
} catch (IOException e) {
e.printStackTrace();
} finally {
// step3: 关闭IO流对象
try {
if (null != bw) {
bw.close(); //关闭过滤流时,会自动关闭它所包装的底层节点流
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (null != br) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在操作字节文件或字符文本文件时,建议使用缓冲流,这样程序的效率会更高一些。
第二节、转换流
有事我们需要在字节流和字符流之间进行转换,以便操作。这个时候我们就用到了转换流,InputStreamReader和OutputStreamWriter。
1、InputStreamReader用于将字节流中读取到的字节按指定字符集解码成字符。需要跟InputSteam套接使用。格式如下:
public InputStreamReader(InputStream in):创建一个使用默认字符集的 InputStreamReader。
public InputStreamReader(InputStream in,String charsetName):创建使用指定字符集的InputStreamReader。
2、OutputStreamWriter用于将要写入到字符流中的字符按指定字符集编码成字节。其需要和OutStream套接,格式如下:
public OutputStreamWriter(OutputStreamWriter out):创建使用默认字符编码的OutputStreamWriter
public OutputStreamWriter(OutputStreamWriter out,String charsetName):创建使用指定字符编码的OutputStreamWriter;
上面的介绍太抽象,下面给出转换流的使用实例:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/** 转换流的使用示例 */
public class ByteToCharTest {
public static void main(String[] args) {
System.out.println("请输入信息(退出输入e或exit):");
//把"标准"输入流(键盘输入)这个字节流包装成字符流,再包装成缓冲流
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
String s = null;
try {
while ((s = br.readLine()) != null) { //读取用户输入的一行数据 --> 阻塞程序
if (s.equalsIgnoreCase("e")
|| s.equalsIgnoreCase("exit")) {
System.out.println("安全退出!!");
break;
}
//将读取到的整行字符串转成大写输出
System.out.println("-->:"+s.toUpperCase());
System.out.println("继续输入信息");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (null != br) {
br.close(); //关闭过滤流时,会自动关闭它包装的底层节点流
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
------- <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! --------
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2