Java IO(四、字符流)

Java IO. 字符操作

字符流

使用字节流读取文本文件时,有时会出现问题。比如遇到中文字符,可能会出现乱码,因为存储这些字符需要占用多个字节。Java IO中提供了字符流类,以字符(java中字符是Unicode编码,一个字符占2 bytes)为单位读写数据,用于处理文本文件。

Writer

Writer是一个抽象类,是表示字符输出流的所有类的基类,将指定的字符信息写出到目的地。它定义了字符输出流的基本功能方法。

  • void write(int c): 写入单个字符。
  • void write(char[] cbuf): 写入字符数组。
  • abstract void write(char[] cbuf, int off, int len): 写入字符数组的一部分,off为数组的起始索引,len表示从起始索引开始写的长度(即字符个数)。
  • void write(String str): 写入字符串。
  • void write(String str, int off, int len): 写入字符串的某一部分,off为数组的起始索引,len表示从起始索引开始写的长度(即字符个数)。
  • void flush(): 刷新该流的缓冲。
  • void close(): 关闭该流,但要先刷新它。

FileWriter

FileWriter 是Writer一个很典型的实现类,用于写出字符到文件。构造时使用系统默认的字符编码和默认字节缓冲区。
构造方法:

  • FileWriter(File file) : 创建一个新的 FileWriter对象,传入要读取的File对象。
  • FileWriter(String name) : 创建一个新的 FileWriter对象,传入要读取文件的名称。
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class WriterTest {
    public static void main(String[] args) throws IOException {
        Writer writer = new FileWriter("C:\\Users\\Administrator\\Desktop\\writerTest.txt");
        //写入一个字符可以使用其编码或者直接写入字符本身
        writer.write(97);//结果a
        writer.write('b');//结果a,b
        //写入字符数组
        char[] text = {'c', 'd'};
        writer.write(text);//结果a,b,c,d
        
        //写入字符串
        String str = "床前明月光,\n" +
                "疑是地上霜。\n" +
                "举头望明月,\n" +
                "低头思故乡。";
        writer.write(str);
        writer.close();
    }

加上异常处理后代码:

    public static void main(String[] args) {
        Writer writer = null;
        try {
            writer = new FileWriter("C:\\Users\\Administrator\\Desktop\\writerTest.txt");
            //写入一个字符可以使用其编码或者直接写入字符本身
            writer.write(97);//结果a
            writer.write('b');//结果a,b
            //写入字符数组
            char[] text = {'c', 'd'};
            writer.write(text);//结果a,b,c,d
            
            //写入字符串
            String str = "床前明月光,\n" +
                    "疑是地上霜。\n" +
                    "举头望明月,\n" +
                    "低头思故乡。";
            writer.write(str);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

Reader

Reader是一个抽象类,是表示字符输入流的所有类的基类,可以读取字符信息到内存中。它定义了字符输入流的基本功能方法。

  • public void close() :关闭该流并释放相关联的系统资源。
  • public int read() : 从输入流读取一个字符。如果读取到eof(文件最后)返回-1。
  • public int read(char[] cbuf) : 从输入流中每次读取cbuf长度个字符,并将它们存储到字符数组 cbuf中。返回读取到的有效字符个数,如果读取到eof(文件最后)返回-1。

FileReader

FileReader类是Reader的一个实现类。构造时使用系统默认的字符编码和默认字节缓冲区。
构造方法:

  • FileReader(File file) : 创建一个新的 FileReader 对象,传入要读取的File对象。
  • FileReader(String fileName) : 创建一个新的 FileReader对象 ,传入要读取文件的名称。
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class ReaderTest {
    public static void main(String[] args) throws IOException {
        Reader reader = new FileReader("C:\\Users\\Administrator\\Desktop\\writerTest.txt");
        //按单个字符读取
//        int ch;
//        while ((ch = reader.read()) != -1) {
//            char text = (char) ch;
//            System.out.print(text);
//        }

        //按字符数组读取
        char[] chars = new char[5];
        int len;
        StringBuilder sb = new StringBuilder();
        while ((len = reader.read(chars)) != -1) {
            String text = new String(chars, 0, len);
            sb.append(text);
        }
        System.out.println(sb);
        reader.close();

        //输出结果
        /*
        abcd床前明月光,
        疑是地上霜。
        举头望明月,
        低头思故乡。
        */
    }
}

加上异常处理后代码:

public class ReaderTest {
    public static void main(String[] args){
        Reader reader = null;
        try {
            reader = new FileReader("C:\\Users\\Administrator\\Desktop\\writerTest.txt");
            //按单个字符读取
//        int ch;
//        while ((ch = reader.read()) != -1) {
//            char text = (char) ch;
//            System.out.print(text);
//        }

            //按字符数组读取
            char[] chars = new char[5];
            int len;
            StringBuilder sb = new StringBuilder();
            while ((len = reader.read(chars)) != -1) {
                String text = new String(chars, 0, len);
                sb.append(text);
            }
            System.out.println(sb);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (reader != null)
                    reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //输出结果
        /*
        abcd床前明月光,
        疑是地上霜。
        举头望明月,
        低头思故乡。
        */
    }
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值