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

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

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

程序运行结果:

此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的。而下面继续使用字符流完成,再观察效果。

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

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

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

程序运行结果:

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

提问:什么叫缓冲区?在很多地方都碰到缓冲区这个名词,那么到底什么是缓冲区?又有什么作用呢?

回答:缓冲区可以简单地理解为一段内存区域。可以简单地把缓冲区理解为一段特殊的内存。某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。

范例:强制性清空缓冲区

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

程序运行结果:

此时,文件中已经存在了内容,更进一步证明内容是保存在缓冲区的。这一点在读者日后的开发中要特别引起注意。
提问:使用字节流好还是字符流好?学习完字节流和字符流的基本操作后,已经大概地明白了操作流程的各个区别,那么在开发中是使用字节流好还是字符流好呢?
回答:使用字节流更好。

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

字节流与字符流主要的区别是他们的的处理方式
流分类:
1.Java的字节流
   InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。
2.Java的字符流
  Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象类。所以不能直接new

字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的,但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的Encode来处理,也就是要进行字符集的转化。这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联。
在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。

在从字节流转化为字符流时,实际上就是byte[]转化为String时,

public String(byte bytes[], String charsetName)

有一个关键的参数字符集编码,通常我们都省略了,那系统就用操作系统的lang
而在字符流转化为字节流时,实际上是String转化为byte[]时,
byte[]    String.getBytes(String charsetName)
也是一样的道理

至于java.io中还出现了许多其他的流,按主要是为了提高性能和使用方便,
如BufferedInputStream,PipedInputStream等

try{ }:最后结果是,文本里面也是照样保存了

File f1 = new File("F:/test/text.txt");// 创建基于文件的Writertry (FileWriter fr = new FileWriter(f1)) {// 以字符流的形式把数据写入到文件中String data="abcdefg1234567890";char[] cs = data.toCharArray();fr.write(cs);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

 这个try(){}catch{},try后面()会自动释放资源的,所以说表面是没有关闭,其实是关闭流了,这个jdk1,7的新特性,叫自动资源管理

java 字节流与字符流的区别相关推荐

  1. 1.8 Java字节流和字符流的区别,如何区分输入流和输出流?

    Java字节流和字符流的区别 首先我们先大概总结一下前面学习的内容,可分为以下几点: 以 Stream 结尾都是字节流,Reader 和 Writer 结尾都是字符流. InputStream 是所有 ...

  2. java字符流实际上也是字节,[Java教程]Java字节流与字符流的区别

    [Java教程]Java字节流与字符流的区别 0 2017-05-22 12:00:42 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身 ...

  3. Java字节流和字符流的区别?

    字符流:就是在字节流的基础上,加上编码,形成的数据流 字符流出现的意义:因为字节流在操作字符时,可能会有中文导致的乱码,所以由字节流引申出了字符流. 程序中所有的数据都是以流的方式进行传输或保存的,字 ...

  4. Java字节流与字符流的区别和执行效率

    区别: 1.字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的 2.字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是 ...

  5. java字节流与字符流的区别编码缓冲

    部分摘自http://blog.csdn.net/cynhafa/article/details/6882061 所有的文件在存储和传输时都是以字节(byte)为单位进行的,包括图片等都是按字节的方式 ...

  6. java字节流转字符串_字节流与字符流的区别及相互转换

    先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输出都是以流的形 ...

  7. Java I/O之字节流与字符流的区别

    字节流与字符流的区别: 上图解析: 字节输出流是直接把字节数据写出到磁盘或其他设备上,而字符输出流会先把字符输出流按一定的编码规则进行编码成二进制的字节输出流再写出到磁盘或其他设备上. 字节输入流每次 ...

  8. java精选面试题---字节流和字符流的区别

    字节流和字符流的区别 字节流读取的时候,读到一个字节就返回一个字节: 字符流使用了字节流读到一个或多个字节(中文对应的字节 数是两个,在 UTF-8 码表中是 3 个字节)时.先去查指定的编码表,将查 ...

  9. Java字节流和字符流的优缺点_字节流与字符流的区别用字节流好还是用字符流好?...

    字节流: (A)FileOutputStream(File name) 创建一个文件输出流,向指定的 File 对象输出数据. (B)FileOutputStream(FileDescriptor) ...

最新文章

  1. NETMerger - DotNet 组件(dll或exe)合并
  2. AngularJS 、Backbone.js 和 Ember.js 的比较
  3. c语言建立队列(顺序队列、循化队列和链式队列)
  4. fc oracle,使用 CLI 配置 FC
  5. 操作系统 第四章【存储器管理】【MOOC答案】
  6. java jdbc连接oracle_Java使用JDBC连接Oracle 11gR2
  7. MAC地址表配置与绑定
  8. [JZOJ5866]【NOIP2018模拟9.13】指引
  9. [HNOI2017]礼物
  10. vue路由参数改变,组件数据没重新更新问题
  11. 多线程的那点儿事(之自旋锁)
  12. 修改了JS代码,刷新网页后,加载的JS还是原来旧的?
  13. python四种方法实现去除列表中的重复元素
  14. css叠层_CSS 理解样式层叠
  15. Java——常用类(String)
  16. 黑苹果怎么进recovery_黑苹果怎么自定义Clover GUI启动选项 黑苹果修复Clover GUI启动选项教程...
  17. 视频格式转换完全进阶
  18. 存储过程和函数的区别
  19. 13个开源GIS软件
  20. 使用正交表高效地设计测试用例

热门文章

  1. c mysql maxpoolsize_记一次 druid maxPoolSize(maxActive) 配置引起的线上事故
  2. 12星座个性陶瓷复古项链
  3. ssh安装及配置详解
  4. LODOP有选择性显示页眉页脚
  5. Vue.js动态改变样式
  6. 徒手撸了一台智能无人机,网友:奥利给
  7. ESP8266-5-使用API获取知心天气数据
  8. 初学VR(二):第一/三人称角色的创建
  9. Android Studio 中使用Java 8 特性
  10. 称特价影票被取消后影片仍正常放映 购票人起诉“淘票票”索赔500元