java字节流与字符流的区别

╰+哭是因爲堅強的太久メ 2022-03-20 12:24 378阅读 0赞

java字节流与字符流的区别

主要区别有:
实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,看图:
在这里插入图片描述
下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。
范例:使用字节流不关闭执行

  1. public class OutputStreamDemo05 {
  2. public static void main(String[] args) throws Exception { // 异常抛出, 不处理
  3. // 第1步:使用File类找到一个文件
  4. File f = new File("d:" + File.separator + "test.txt"); // 声明File 对象
  5. // 第2步:通过子类实例化父类对象
  6. OutputStream out = null;
  7. // 准备好一个输出的对象
  8. out = new FileOutputStream(f);
  9. // 通过对象多态性进行实例化
  10. // 第3步:进行写操作
  11. String str = "Hello World!!!";
  12. // 准备一个字符串
  13. byte b[] = str.getBytes();
  14. // 字符串转byte数组
  15. out.write(b);
  16. // 将内容输出
  17. // 第4步:关闭输出流
  18. // out.close();
  19. // 此时没有关闭
  20. }
  21. }

运行结果为:Hello World!!!
此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的


范例:使用字符流不关闭执行

  1. public class WriterDemo03 {
  2. public static void main(String[] args) throws Exception { // 异常抛出, 不处理
  3. // 第1步:使用File类找到一个文件
  4. File f = new File("d:" + File.separator + "test.txt");// 声明File 对象
  5. // 第2步:通过子类实例化父类对象
  6. Writer out = null;
  7. // 准备好一个输出的对象
  8. out = new FileWriter(f);
  9. // 通过对象多态性进行实例化
  10. // 第3步:进行写操作
  11. String str = "Hello World!!!";
  12. // 准备一个字符串
  13. out.write(str);
  14. // 将内容输出
  15. // 第4步:关闭输出流
  16. // out.close();
  17. // 此时没有关闭
  18. }
  19. }

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

字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容


在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。
范例:强制性清空缓冲区

  1. public class WriterDemo04 {
  2. public static void main(String[] args) throws Exception { // 异常抛出不处理
  3. // 第1步:使用File类找到一个文件
  4. File f = new File("d:" + File.separator + "test.txt");// 声明File
  5. 对象
  6. // 第2步:通过子类实例化父类对象
  7. Writer out = null;
  8. // 准备好一个输出的对象
  9. out = new FileWriter(f);
  10. // 通过对象多态性进行实例化
  11. // 第3步:进行写操作
  12. String str = "Hello World!!!";
  13. // 准备一个字符串
  14. out.write(str);
  15. // 将内容输出
  16. out.flush();
  17. // 强制性清空缓冲区中的内容
  18. // 第4步:关闭输出流
  19. // out.close();
  20. // 此时没有关闭
  21. }
  22. }

运行结果为:Hello World!!!
此时,文件中已经存在了内容,更进一步证明内容是保存在缓冲区的。这一点在读者日后的开发中要特别引起注意。


提问:使用字节流好还是字符流好?学习完字节流和字符流的基本操作后,已经大概地明白了操作流程的各个区别,那么在开发中是使用字节流好还是字符流好呢?

回答:使用字节流更好。在回答之前,先为读者讲解这样的一个概念,所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。


发表评论

表情:
评论列表 (有 0 条评论,378人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java 节流字符区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在

    相关 java 节流字符区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在

    相关 Java 节流字符区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在