Java中的字节流和字符流区别

Posted 麦田

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的字节流和字符流区别相关的知识,希望对你有一定的参考价值。

字节流

  • 1、字节流在操作的时候不会用到缓冲区(也就是内存)
  • 2、字节流可用于任何类型的对象,包括二进制对象
  • 3、字节流处理单元为1个字节,操作字节和字节数组。

字符流

  • 1、而字符流在操作的时候会用到缓冲区
  • 2、而字符流只能处理字符或者字符串
  • 3、字符流处理的单元为2个字节的Unicode字符,操作字符、字符数组或字符串,

在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成。
所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的。

下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。

使用字节流不关闭执行

public static void main(String[] args) 
	File file = new File("d:" + File.separator + "test1.txt");
	try 
		OutputStream os = new FileOutputStream(file);
		String str = "hello world";
		byte b[] = str.getBytes();
		os.write(b);
	 catch (FileNotFoundException e) 
		e.printStackTrace();
	 catch (IOException e) 
		e.printStackTrace();
	

查看文件内容:

此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的


使用字符流不关闭执行

public static void main(String[] args) 
File file = new File("d:" + File.separator + "test2.txt");
	try 
		Writer out = new FileWriter(file);
		String str = "hello world";
		out.write(str);
	 catch (IOException e) 
		e.printStackTrace();
	

查看文件内容:

没有内容,这是因为字符流操作时使用了缓冲区,而 在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。。


使用字符流强制清空缓存区

public static void main(String[] args) 
File file = new File("d:" + File.separator + "test2.txt");
	try 
		Writer out = new FileWriter(file);
		String str = "hello world";
		out.write(str);
		//强制清空缓存区内容
		out.flush();
	 catch (IOException e) 
		e.printStackTrace();
	

此时文件中已被写入内容,更加说明了字符操作内容是保存在缓冲区的

以上是关于Java中的字节流和字符流区别的主要内容,如果未能解决你的问题,请参考以下文章

java IO的字节流和字符流及其区别

Java中字符流与字节流的区别

理解Java中字符流与字节流的区别

理解Java中字符流与字节流的区别(转)

Java中常用的字节流和字符流

字符流和字节流的区别