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 Type Method Description
void close() 关闭该流并释放与之关联的所有资源。
String getEncoding() 返回此流使用的字符编码的名称。
int read() 读取单个字符。
int read(char[] cbuf, int offset, int length) 将字符读入数组中的某一部分。
boolean ready() 判断此流是否已经准备好用于读取。
int read(char[] cbuf) 将字符读入数组。
int read(CharBuffer target) 试图将字符读入指定的字符缓冲区。
long skip(long n) 跳过n个字符。
void reset() 重置该流。
void mark(int readAheadLimit) 标记流中的当前位置。
boolean markSupported() 判断此流是否支持 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 Type Method Description
void close() 关闭此流,但要先刷新它。
void flush() 刷新该流的缓冲。
String getEncoding() 返回此流使用的字符编码的名称。
void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
void write(int c) 写入单个字符。
void write(String str, int off, int len) 写入字符串的某一部分。
void write(char[] cbuf) 写入字符数组cbuf
void write(String str) 写入字符串str
Write append(char c) 将指定字符c添加到此 writer。
Writer append(CharSequence csq) 将指定字符序列csq添加到此 writer。
Writer append(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();
    }
}

}

猜你喜欢

转载自blog.csdn.net/m0_46530662/article/details/119712077