java字符流和字节流
字符流和字节流的区别
字节流 | 字符流 | |
---|---|---|
使用缓存 | 否 | 是 |
是否编码 | 否 | 是 |
读取字节数 | 中文1个,英文1个 | 中文2个,英文1个 |
是否使用缓存
字节流不使用缓存,字符流使用缓存
字节流:
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator + "test.txt");
OutputStream out = new FileOutputStream(f);
String str = "Hello World!!!";
out.write(str.getBytes());
out.flush();//在此处断住查看文件,文件写入Hello World!!!
out.close();
}
字符流:
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator + "test.txt");
Writer out = new FileWriter(f);
String str = "Hello World!!!";
out.write(str);
out.flush();//在此处断住查看文件,文件并没有写入Hello World!!!
out.close();
}
是否编码
字节流读入和写出都是使用byte类型或者int类型所以自然就不存在编码问题
字符流牵扯读入之后需要将字节转换为字符,而字符的显示本身就需要编码,具体参见aip接口
读取字节数
字节流1个,取值范围在0~255之间
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator + "test.txt");
InputStream reader = new FileInputStream(f);
System.out.println(reader.read());
reader.close();
}
读中文“我是程序员”
输出:
230
字节流读取中文是一个字节
读英文“abcdef”
输出:97
字节流读取英文是一个字节
字符流2个,取值范围在0~65536之间
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator + "test.txt");
Reader reader = new FileReader(f);
System.out.println(reader.read());
reader.close();
}
读中文“我是程序员”
输出:
37812
字符流读取中文是一个字节
读英文“abcdef”
输出:97
字符流读取英文是一个字节
使用场景(后续补充,暂未想好)
字符流:
建议在需要缓存的情况下使用,比如文件拷贝,数据的即时传输
字节流:
建议在读取字节的情况下使用比如读取中文,在需要缓存的情况下使用,比如socket通信