java IO流之InputStreamReader OutputStreamWriter 转换流 复制文件实例

java IO流之InputStreamReader OutputStreamWriter 转换流

  • 作用:将字节流和字符流进行转换。
  • 转换流属于字符流
    • InputStreamReader :字节输入流 -->字符的输入流
    • OutputStreamWriter : 字符输出流 -->字节的输出流

在这里插入图片描述

InputStreamReader

  • InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

  • 每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

  • 为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如: BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

构造方法摘要

  • InputStreamReader(InputStream in[, Charset cs])
    • 创建使用给定(未指定则使用默认字符集)字符集的 InputStreamReader
  • InputStreamReader(InputStream in, CharsetDecoder dec)
    创建使用给定字符集解码器的 InputStreamReader。
  • InputStreamReader(InputStream in, String charsetName)
    创建使用指定字符集的 InputStreamReader。

方法

Modifier and TypeMethodDescription
voidclose()关闭该流并释放与之关联的所有资源。
StringgetEncoding()返回此流使用的字符编码的名称。
intread()读取单个字符。
intread(char[] cbuf, int offset, int length)将字符读入数组中的某一部分。
booleanready()判断此流是否已经准备好用于读取。
intread(char[] cbuf)将字符读入数组。
intread(CharBuffer target)试图将字符读入指定的字符缓冲区。
longskip(long n)跳过n个字符。
voidreset()重置该流。
voidmark(int readAheadLimit)标记流中的当前位置。
booleanmarkSupported()判断此流是否支持 mark() 操作。
  • 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

OutputStreamWriter

  • OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

  • 每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。

  • 为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如: Writer out = new BufferedWriter(new OutputStreamWriter(System.out));

  • 代理对surrogate pair是一个字符,它由两个 char 值序列表示:高 high代理项的范围为 ‘\uD800’ 到 ‘\uDBFF’,后跟范围为 ‘\uDC00’ 到 ‘\uDFFF’ 的低 low 代理项。错误代理元素malformed surrogate element 指的是后面不跟低代理项的高代理项,或前面没有高代理项的低代理项。 此类总是使用字符集的默认替代序列 替代错误代理元素和不可映射的字符序列。如果需要更多地控制编码过程,则应该使用 CharsetEncoder 类。

构造方法摘要

OutputStreamWriter(OutputStream out[, Charset cs])
创建使用给定(未指定则使用默认字符集)字符集的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
创建使用给定字符集编码器的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter。

方法

Modifier and TypeMethodDescription
voidclose()关闭此流,但要先刷新它。
voidflush()刷新该流的缓冲。
StringgetEncoding()返回此流使用的字符编码的名称。
voidwrite(char[] cbuf, int off, int len)写入字符数组的某一部分。
voidwrite(int c)写入单个字符。
voidwrite(String str, int off, int len)写入字符串的某一部分。
voidwrite(char[] cbuf)写入字符数组cbuf
voidwrite(String str)写入字符串str
Writeappend(char c)将指定字符c添加到此 writer。
Writerappend(CharSequence csq)将指定字符序列csq添加到此 writer。
Writerappend(CharSequence csq, int start, int end)将指定字符序列的子序列添加到此 writer。
  • 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

分步实现

以复制文件为例

  1. 源文件目标文件创建实例

    //1.源文件目标文件创建实例
    File f1 = new File("d:\\Test.txt");
    File f2 = new File("d:\\Demo.txt");
    
  2. 输入方向:转换字符流InputStreamReader嵌套文件字节流FileInputStream

    //2.输入方向:转换字符流InputStreamReader嵌套文件字节流FileInputStream
    FileInputStream fis = new FileInputStream(f1);
    InputStreamReader isr = new InputStreamReader(fis,"utf-8");//指定源文件打开格式utf-8
    
  3. 输出方向:转换字符流OutputStreamWriter嵌套文件字节流FileOutputStream

    //3.输出方向:转换字符流OutputStreamWriter嵌套文件字节流FileOutputStream
    FileOutputStream fos = new FileOutputStream(f2);
    OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");//指定目标文件编码格式gbk
    
  4. 操作内容

    char[] ch = new char[20];
    int len = isr.read(ch);
    while(len!=-1){
        osw.write(ch,0,len);
        len = isr.read(ch);
    }
    
  5. 关闭流,倒着关闭,如果处理流包裹着节点流的话,那么其实只要关闭高级流(处理流),那么里面的字节流也会随之被关闭。

    osw.close();
    isr.close();
    

完整程序

try-catch-finally
public class IOsrwTC {
    public static void main(String[] args){
        //1.源文件目标文件创建实例
        File f1 = new File("IOStream/src/testfile/test.txt");
        File f2 = new File("IOStream/src/testfile/demo.txt");

        FileInputStream fis = null;
        InputStreamReader isr = null;
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        try {
            //2.输入方向:转换字符流InputStreamReader嵌套文件字节流FileInputStream
            fis = new FileInputStream(f1);
            isr = new InputStreamReader(fis,"utf-8");
            //3.输出方向:转换字符流OutputStreamWriter嵌套文件字节流FileOutputStream
            fos = new FileOutputStream(f2);
            osw = new OutputStreamWriter(fos,"gbk");
            //4.开始动作:
            char[] ch = new char[20];
            int len = isr.read(ch);
            while(len!=-1){
                osw.write(ch,0,len);
                len = isr.read(ch);
            }
        } catch (FileNotFoundException | UnsupportedEncodingException e) {
            e.printStackTrace();
            System.out.println("文件找不到或编码格式不支持");
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //5.关闭流:
            try {
                if (osw != null) {
                    osw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (isr != null) {
                    isr.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
try-with-resource
import java.io.*;

public class IOsrwTC {
    public static void main(String[] args){
        //1.源文件目标文件创建实例
        File f1 = new File("IOStream/src/testfile/test.txt");
        File f2 = new File("IOStream/src/testfile/demo.txt");
        try (
                //2.输入方向:转换字符流InputStreamReader嵌套文件字节流FileInputStream
                FileInputStream fis = new FileInputStream(f1);
                InputStreamReader isr = new InputStreamReader(fis,"utf-8");
                //3.输出方向:转换字符流OutputStreamWriter嵌套文件字节流FileOutputStream
                FileOutputStream fos = new FileOutputStream(f2);
                OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
                ){
            //4.开始动作:
            char[] ch = new char[20];
            int len = isr.read(ch);
            while(len!=-1){
                osw.write(ch,0,len);
                len = isr.read(ch);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("文件找不到");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            System.out.println("编码格式不支持");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
} catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        System.out.println("编码格式不支持");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

posted @ 2021-08-15 12:22  SKPrimin  阅读(116)  评论(0编辑  收藏  举报