Java IO流--Reader流(字符输入流) & Writer流(字符输出流)
Posted Z && Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java IO流--Reader流(字符输入流) & Writer流(字符输出流)相关的知识,希望对你有一定的参考价值。
InputStream(字节输入流) & OutputStream(字节输出流)
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 IO_003.Reader与Writer--字符流以及编码对数据的操作(读取与写入)