java IO 四(转换流的使用)

扯点别的: 随着年龄的慢慢增长,有些道理才明白,有些爱才感慨。家人或许希望你能立足大城市,开创一番事业。但是在内心里家人永远希望你多花点时间陪陪他们,一起吃吃饭,说说话,只要你平平安安,生活快乐,家人就感到幸福。所以多花点时间陪陪父母、陪陪爱人、陪陪孩子。

又搁置了不短的时间,继续写java io的知识,现在感觉自己的记忆力真的不行了,总是记不住东西,哎,关键还是理解不够深入,靠死记硬背是不行的看样。开搞。参考自毕向东老师的视频
第一: InputStreamReader
看看JDK里面的解释,强调一下自己看英文文档的重要性,不要害怕,害怕永远看不懂英文,坚持看!

Class InputStreamReader
    java.lang.Object 
        java.io.Reader 
        java.io.InputStreamReader 

InputStreamReader 是字节流转换成字符流的桥梁,使用指定的字符集读取字节并将其解码为字符。字符集可以由名称指定或者显式给出,或者使用平台默认的字符集。

每次调用一个InputStreamReader的read()方法都会从低产能字节流中读取一个或者多个字节,为了提高字节转化为字符的效率,可以提前从底层的字节流中读取更多的字节使其超过满足当前的读操作所需的字节数。

为了提高效率,使用BufferedReader把InputStreamReader包裹起来,例如
 BufferedReader in
   = new BufferedReader(new InputStreamReader(System.in));

构造方法

InputStreamReader(InputStream in) 
使用默认的字符集创建一个InputStreamReader实例

InputStreamReader(InputStream in, Charset cs) 
使用指定的的字符集创建一个InputStreamReader实例

InputStreamReader(InputStream in, CharsetDecoder dec) 
使用指定的字符解码创建一个InputStreamReader实例

InputStreamReader(InputStream in, String charsetName) 
使用默认的字符集名称创建一个InputStreamReader实例 

第二 OutPutStreamWriter

OutPutStreamWriter是字符流转为字节流的桥梁,字符流通过指定的字符集将字符编码为字节。字符集可以通过名称指定或者显式给出,或者使用平台默认的字符集。
每次调用一个writer()方法就会导致指定了字符集的编码转换器被调用,编码完的字节在写出到底层流中之前会累计存储在一个缓冲区中。这个缓冲区的大小可以指定,一般使用默认的大小就行。被write()方法写的字符并没有被缓存。
为了高效,使用BufferedWriter()把OutPutStreamWriter包裹起来,以避免转换器的频繁调用。例如
Writer out
   = new BufferedWriter(new OutputStreamWriter(System.out));

下面的叙述应该是关于乱码问题的吧。
代理项对是由两个char值序列表示一个字符:高代理范围从'\ uD800''\ uDBFF'随后是低代理范围从'\ uDFFF''\ uDC00“。 格式不正确替代元素是一个高代理后面没有一个低代理或不是由一个高代理开头的低代理。 OutputStreamWriter总是使用字符集默认替代序列替换畸形代理元素和不可映射字符序列。当需要在编码过程更多的控制,使用CharsetEncoder类 
构造函数
OutputStreamWriter(OutputStream out) 
使用默认的字符编码构造一个OutputStreamWriter 实例。

OutputStreamWriter(OutputStream out, Charset cs) 
使用指定的字符集构造一个OutputStreamWriter 实例。

OutputStreamWriter(OutputStream out, CharsetEncoder enc) 
使用指定的字符编码器构造一个OutputStreamWriter 实例。

OutputStreamWriter(OutputStream out, String charsetName) 
使用指定的字符集名称构造一个OutputStreamWriter 实例。

使用例子,从键盘录入打印到控制台;

package javase;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class TransStreamDemo1 {

//抛出异常
    public static void main(String[] args) throws IOException {

        //构建一个BufferedReader 
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
        //构建一个BufferedWriter 
        BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(System.out));

        String line=null;
        while ((line=bufferedReader.readLine())!=null) {

            if ("over".equals(line)) {
                break;
            }
            bufferedWriter.write(line);
            bufferedWriter.newLine();//换行
            bufferedWriter.flush();

        }
        bufferedWriter.close();
    }
}

如果想把键盘录入的内容,存储到一个文本文件中,只需要更改代码中的一行代码即可。

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt")));

这样,从键盘录入的内容,就会存储到工程out.txt文件中

如果想把一个文本文件中的内容打印到控制台上,只要改变输入流的来源即可,如下所示。

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("in.txt")));

如过想把一个文本文件中的内容复制到另外一个文本文件中,只要将源和目的指定为文件即可。如下所示,将in.txt文件中的字符复制到out.txt中

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("in.txt")));

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt")));

注意,这里只是为了演示字节字符转换流的使用,如果真要把一个文本文件进行复制,完全可以使用字符流就能完成。如下所示

BufferedReader bufferedReader = new BufferedReader(new FileReader("in.txt"));
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("out.txt"));

小插曲,如果想改变标准输入输出流,就是键盘和控制台,可以使用System的静态方法。

static void setIn(InputStream in) 
Reassigns the "standard" input stream. 
static void setOut(PrintStream out) 
Reassigns the "standard" output stream. 

结尾,今天知识也没学多少,又看电视,有打球,下午还有场,也是艰难。我的小腰啊,还是疼。

你可能感兴趣的:(java)