1.对于字节流InputStream和OutPutStream,当read()和writer()时,他们只接受byte[]型数组。
对于字符流Reader和Writer,read()接受char[]类型,writer()可以接受字符串、char[]数组,int值等参数。
为什么已经存在字节流还要引入字符流
熟悉java的应该知道,字节流比字符流产生的更早,可以说jdk一面世,已经有字节流了。那么为什么后面又引入了字符流呢?
首先,各个单位之间的关系,我们要清楚:
字节我们用Byte做单位,位我们用bit做单位,这就是大小b的关系
1字节(B) = 8位(b)
1字符 = 2字节(B) = 16位(b)
然后国际化的Unicode编码是16位的,也就是占2个字节,或者1个字符。那么我们简单的用字节流来处理Unicode编码,就显得非常鸡肋,所以字符流也就应运而生了。同时,使用字符流操作会比字节流操作更加的迅速,为什么会更加迅速呢?一个最显然的加速方式就是缓存区。字符流是用了缓存区的,而字节流是直接与文件进行操作。当我们关闭字符流的时候会自动将缓存区中的内容写入文件,若不关字符流则不会写入文件。或者我们刷新缓存区也可以。以下是一个典型的试验,用两者方式输出一个文件,但是都不关闭流,如果存在缓存区的话,那么它的触发机制就是流关闭导致它的缓存结束:
package com.brickworkers.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
public class FileReadTest {
public static void main(String[] args) throws IOException {
File file1 = new File("F:/java/io/write1.txt");
//字节流输出
OutputStream os = new FileOutputStream(file1);
String txt = "helloworld";
try{
os.write(txt.getBytes());
}finally{
//不关闭流
}
File file2 = new File("F:/java/io/write2.txt");
Writer writer = new FileWriter(file2);
try{
writer.write(txt);
}finally{
//不关闭流
}
}
}
运行结果你会发现:使用字节流的在文本文件中已经写入了hello world,但是字符流却没有写入,说明字符流是带有缓存区的,这个时候就需要刷新缓存区,或者关闭流来触发输出。不要在输入流用不关闭流来进行上述测试,试想一下不管存不存在缓存区,你数据读取了,那么就都会是有了的,并不会收缓存区影响。
当然,并不是说摒弃字节流全部都使用字符流,在很多情况下字符流是不能用的,什么情况呢?指定字节操作的时候就不可以用字符流。前面说过,所有的资源都是以字节的形式存储的,包括图片,视频,音频等等,所以在日常的开发中字节流的操作还是非常普及的。
两个流派进行转化
一个面向字符流,一个面向字节流。那么他们之间在JDK中是如何转化的呢?Reader与Writer中有两个类来处理这种转化,他们分别是InputStreamReader与OutputStreamWriter,可以称这两个为适配器类。
package com.brickworkers.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class FileReadTest {
public static void main(String[] args) throws IOException {
File file = new File("F:/java/io/write.txt");
//字节流输出
OutputStream os = new FileOutputStream(file);
String txt = "hello world";
//把字节流转化成字符流操作
Writer writer = new OutputStreamWriter(os);
try {
writer.write(txt);
} finally{
writer.close();
}
}
}
上面的代码字节流转化成字符流