Java 学习笔记- I/O - Character Stream



 

所有Character Stream的类都继承类Reader 或 Writer。

对于Character Stream的类来说,其行为上类似于对Byte Stream的封装,在真正进行物理I/O操作是也是通过Byte Stream 与Character Stream之间的互相转换来实现的。

常用的Character Stream 类有 :

FileReader,FileWriter常用的构造方法 FileReader(String fileName),FileWriter(String fileName), 或者FileReader(File file),FileWriter(File file). 常用方法为 read() 和write(int c)

FileReader,FileWriter分别继承类InputStreamReader 和OutputStreamWriter 而这两个父类的构造方法的参数分别为字节流类型的InputStream 和OutputStream,所以也可以说Character Stream 是对Byte Stream的封装。

代码示例:

package io.characterstream;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * IO Stream:
 * 
 * 2.Character Stream. All Character Stream classes are descended from Reader and Writer. Java Platform stores character
 * values using Unicode convention。 Character Stream I/O automatically translates this internal format to and from the
 * local character set.
 * 
 * @author PENGGR
 * 
 */

public class CopyCharacters {

    public static void main(String[] args) {
        FileReader inputStream = null;
        FileWriter outputStream = null;

        try {
            inputStream = new FileReader("D:\\360云盘\\javase\\src\\io\\xanadu.txt");
            outputStream = new FileWriter("D:\\360云盘\\javase\\src\\io\\characterStreamOut.txt");
            int c;
            while ((c = inputStream.read()) != -1) {
                outputStream.write(c);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

}

 

此外,类BufferedReader,BufferedWriter是常用的Character Stream的Buffer,其构造方法为BufferedReader(Reader in ),BufferedWriter(Writer out) 常用方法为 readLine() write(String l).

代码示例:

 

package io.characterstream;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class CopyLines {

    public static void main(String[] args) {
        BufferedReader inputStream = null;
//        PrintWriter outputStream = null;
        BufferedWriter bout = null;
        try {
            inputStream = new BufferedReader(new FileReader("D:\\360云盘\\javase\\src\\io\\xanadu.txt"));
            bout = new BufferedWriter(new FileWriter("D:\\360云盘\\javase\\src\\io\\characterLineOut.txt"));
//            outputStream = new PrintWriter(new FileWriter("D:\\360云盘\\javase\\src\\io\\characterLineOut.txt"));
            String l;
            while ((l = inputStream.readLine()) != null) {
                // outputStream.write(l);
                // outputStream.println(l);
                System.out.println(l);
                bout.write(l + "\n");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                // if (outputStream != null) {
                // outputStream.close();
                // }
                if (bout != null) {
                    bout.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

此外,如果这段代码finally 里面的bout 对象没有被close,那么写入的文件中是看不到任何内容的,除非调用了flush方法把 字符流从内存写入到文件中。 此处想说的是character stream是在输出流关闭的时候或者缓存了足够大的容量的时候才把内容写到文件上,但是Byte stream 是实时写入文件的,所以,character stream的真正IO操作相对少一些,效率高一些。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值