Java中的IO流之字符流Reader和Writer
作者:CodeJiao
这篇文章主要介绍了Java中的IO流之字符流Reader和Writer,Reader : 和InputStream的唯一的区别就在于读的数据单位不同,继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符16bit,需要的朋友可以参考下
1. Reader流
Reader : 和InputStream的唯一的区别就在于读的数据单位不同
继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit)
16位:一个字符也就是两个字节,使用Reader流读取数据时都是两个字节两个字节往外读的,为什么还要有这两种两个字节的读取方式呢? 因为有些字符是占2个字节的,如我们的中文字符在Java里面就是占两个字节的。如果采用一个字节一个字节往外读的方式,那么读出来的就是半个汉字,这样子Java就没有办法正确的显示中文字符的,所以有必要存在这种流,一个字符一个字符地往外读。
Reader的基本方法:
//读取一个字节并以整数的形式返回(0~255) //如果返回-1就说明已经到了输入流的末尾 int read() throws IOException //读取一系列字节并存储到一个数组buffer //返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1 int read(byte[] buffer) throws IOException //从offset位置开始,读取length个字节 并存储到一个字节数组buffer, //返回实际读取的字节数,如果读取前以到输入流的末尾返回-1. int read(byte[] buffer,int offset,int length) throws IOException //关闭流释放内存资源 void close() throws IOException //跳过n个字节不读,返回实际跳过的字节数 long skip(long n) throws IOException
2. Writer流
继承自Writer的流都是用于程序中输出数据,且数据的单位为字符(16bit);
Writer的基本方法:
//向输出流中写入一个字节数据,该字节数据为参数b的低16位 void write(int b) throws IOException //将一个字节类型的数组中的数据写入输出流 void write(byte[] b) throws IOException //将一个字节类型的数组中的从指定位置(off)开始的len个字节写入到输出流 void write(byte[] b,int off,int len) throws IOException //关闭流释放内存资源 void close() throws IOException //将输出流中缓冲的数据全部写出到目的地 void flush() throws IOException
【演示:使用FileWriter(字符流)向指定文件中写入数据】:
read.txt
Hello Java!
Hello C!
Hello Python!
Hello C#!
write.txt
Test.java
package character1; import java.io.FileReader; import java.io.FileWriter; /*使用FileWriter(字符流)向指定文件中写入数据写入数据时以1个字符为单位进行写入*/ public class Test { public static void main(String[] args) { /*使用FileWriter输出流从程序把数据写入到write.txt文件中 使用FileWriter流向文件写入数据时是一个字符一个字符写入的*/ try (FileWriter fileWriter = new FileWriter("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\write.txt"); FileReader fileReader = new FileReader("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\read.txt");) { /* 字符的本质是一个无符号的16位整数 字符在计算机内部占用2个字节 这里使用for循环把0~60000里面的所有整数都输出 这里相当于是把全世界各个国家的文字都以0~60000内的整数的形式来表示 */ for (int i = 0; i < 60000; i++) { /* 使用write(int c)把0~60000内的整数写入到指定文件内 调用write()方法时,我认为在执行的过程中应该使用了“(char)c”进行强制 转换, 即把整数转换成字符来显示 因为打开写入数据的文件可以看到,里面显示的数据并不是0~60000内的整数, 而是不同国家的文字的表示方式 */ fileWriter.write(i); } /*使用FileReader(字符流)读取指定文件里面的内容 读取内容时是以一个字符为单位进行读取的*/ int b = 0; long num = 0; while ((b = fileReader.read()) != -1) { System.out.print((char) b); num++; } System.out.println(); System.out.println("总共读取了" + num + "个字符"); } catch (Exception e) { // 打印异常信息 e.printStackTrace(); // 异常退出 System.exit(-1); } } }
3. 小结
FileReader和FileWriter这两个流都是字符流,都是以一个字符为单位进行输入和输出的。所以读取和写入占用2个字节的字符时都可以正常地显示出来,以上是以File(文件)这个类型为例对节点流进行了讲解,所谓的节点流指定就是直接把输入流或输出插入到数据源上,直接往数据源里面写入数据或读取数据。
到此这篇关于Java中的IO流之字符流Reader和Writer的文章就介绍到这了,更多相关Java字符流Reader和Writer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!