黑马程序员技术交流社区

标题: IO接口原理三 站起来,往前冲! [打印本页]

作者: 刘付力    时间: 2012-8-1 10:08
标题: 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>、期待与您交流! --------

作者: 滔哥    时间: 2012-8-1 10:47
楼主,请提问转移13期板块,此板块提问,无法获得技术分。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2