java中字符流与字节流的区别:

1、字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。

2、字节流默认不使用缓冲区;字符流使用缓冲区。

3、字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。

字节流

Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流。

InputStream类与OutputStream类均为抽象类,我们在实际使用中通常使用Java类库中提供的它们的一系列子类。下面我们以InputStream类为例,来介绍下Java中的字节流。

InputStream类中定义了一个基本的用于从字节流中读取字节的方法read,这个方法的定义如下:

public abstract int read() throws IOException;

这是一个抽象方法,也就是说任何派生自InputStream的输入字节流类都需要实现这一方法,这一方法的功能是从字节流中读取一个字节,若到了末尾则返回-1,否则返回读入的字节。

关于这个方法我们需要注意的是,它会一直阻塞知道返回一个读取到的字节或是-1。另外,字节流在默认情况下是不支持缓存的,这意味着每调用一次read方法都会请求操作系统来读取一个字节,这往往会伴随着一次磁盘IO,因此效率会比较低。

有的小伙伴可能认为InputStream类中read的以字节数组为参数的重载方法,能够一次读入多个字节而不用频繁的进行磁盘IO。那么究竟是不是这样呢?我们来看一下这个方法的源码:

public int read(byte b[]) throws IOException {

return read(b, 0, b.length);

}

它调用了另一个版本的read重载方法,那我们就接着往下追:

public int read(byte b[], int off, int len) throws IOException {

if (b == null) {

throw new NullPointerException();

} else if (off < 0 || len < 0 || len > b.length - off) {

throw new IndexOutOfBoundsException();

} else if (len == 0) {

return 0;

}

int c = read();

if (c == -1) {

return -1;

}

b[off] = (byte)c;

int i = 1;

try {

for (; i < len ; i++) {

c = read();

if (c == -1) {

break;

}

b[off + i] = (byte)c;

}

} catch (IOException ee) {

}

return i;

}

从以上的代码我们可以看到,实际上read(byte[])方法内部也是通过循环调用read()方法来实现“一次”读入一个字节数组的,因此本质来说这个方法也未使用内存缓冲区。要使用内存缓冲区以提高读取的效率,我们应该使用BufferedInputStream。

字符流

Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据。所谓Unicode码元,也就是一个Unicode代码单元,范围是0x0000~0xFFFF。在以上范围内的每个数字都与一个字符相对应,Java中的String类型默认就把字符以Unicode规则编码而后存储在内存中。

然而与存储在内存中不同,存储在磁盘上的数据通常有着各种各样的编码方式。使用不同的编码方式,相同的字符会有不同的二进制表示。实际上字符流是这样工作的:

输出字符流:把要写入文件的字符序列(实际上是Unicode码元序列)转为指定编码方式下的字节序列,然后再写入到文件中;

输入字符流:把要读取的字节序列按指定编码方式解码为相应字符序列(实际上是Unicode码元序列从)从而可以存在内存中。

我们通过一个demo来加深对这一过程的理解,示例代码如下:

import java.io.FileWriter;

import java.io.IOException;

public class FileWriterDemo {

public static void main(String[] args) {

FileWriter fileWriter = null;

try {

try {

fileWriter = new FileWriter("demo.txt");

fileWriter.write("demo");

} finally {

fileWriter.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

java字符流和字节流的区别_java字符流与字节流的区别是什么相关推荐

  1. java 字符流与字节流区别_JAVA 字符流与字节流的区别

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  2. JAVA中重写和实现的区别_Java中重载和重写的区别

    Java中重载和重写的区别 1.1重载是什么 Overloading   方法重载是让类以统一的方式处理不同类型数据的一种手段,多个同名函数同时存在,具有不同的参数个数/类型 1.2为什么用重载 重载 ...

  3. java中字符流和字节流的区别_java中字节流和字符流有哪些区别

    java中字节流和字符流的区别有:1.定义不同:2.结尾不同:3.处理方式不同:4.缓冲区不同:5.编码方式不同.字节流默认不使用缓冲区,而字符流使用缓冲区.字节流采用ASCII编码,字符流采用uni ...

  4. Java传统的io和nio区别_Java中IO和NIO的本质和区别

    简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就 ...

  5. java中string 和stringbuffer的区别_Java中的String,StringBuilder,StringBuffer三者的区别...

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  6. java中int和integer的区别_Java异常中throw和throws关键字的区别

    Java中常常弄混的两个关键字,throw和throws,它们有什么区别呢?如何记忆他们,而不至于出错呢? throw和throws 区别 throws:出现在方法的签名中,声明当前方法可能抛出的所有 ...

  7. java中堆与栈的区别_java中堆和栈的区别分析

    堆和栈是Java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...

  8. java 策略模式和工厂模式区别_Java编程细节——什么是策略模式

    策略模式应该是Java设计模式中最简单的一种模式, 它的核心思想是,一个类的行为可以在运行时动态改变,有不同的实现逻辑. 其实具体的说,它也是基于面向接口编程的思想,通过定义不同的实现类逻辑来做到的. ...

  9. java可比较的和比较器的区别_Java中Compareable和Comparator两种比较器的区别

    对于JDK8而言,有三种实现对象比较的方法: 1.在需要比较的对象类中覆写Object类的equals()方法: 2.需要比较的类继承Comparable接口,然后在其类内部实现compareTo() ...

最新文章

  1. 380万播放量,也许是全网最火的机器学习视频
  2. R语言使用timeROC包计算无竞争情况下的生存资料多时间AUC值、R语言使用timeROC包的plotAUCcurve函数可视化多时间生存资料的不同标记物情况下对应的AUC曲线、并进行对比
  3. 最新:2020年度陈嘉庚科学奖出炉!施一公获生命科学奖
  4. C#设计模式——生成器模式(Builder Pattern)
  5. element的滚动去掉横向_textarea去掉滚动条 textarea横向或纵向滚动条的去掉方法
  6. 【转】人工智能-1.1.1 什么是神经网络
  7. HTML中光移动边框,CSS 边框各边
  8. Office 程序默认打开方式
  9. tensorflow学习笔记(3):使用tf.data API导入数据
  10. java dateutils工具类_DateUtils 日期工具类
  11. matlab getdata函数,用getdata函数读取数据的时候数据读取不过来
  12. HttpClient下载图片实例
  13. 85条高级AutoCAD工程师绘图技巧(2)
  14. Python每天一个小程序——字典翻转输出和《沉默的羔羊》之最多单词
  15. plist图片列表分割拆分器(修复输出图片错误的BUG)
  16. JDBC深入浅出-jdbc学习笔记【入门到精通】
  17. Spark—15分钟教程
  18. [刷题]2017百度之星资格赛 - 度度熊与邪恶大魔王
  19. python进行数据预处理(最大最小值规范化、零均值规范化、剔除奇异值、去噪、曲线拟合)
  20. SpringBoot获取Ip并解析地址,Docker部署 (ip2region.xdb)

热门文章

  1. CloudDBA新功能上线--SQL过滤/限制/防火墙
  2. 俞永福卸任阿里大文娱董事长,改任 eWTP 投资组长
  3. mybatis对java自定义注解的使用——入门篇
  4. Android Studio apk 打包流程
  5. ProFTPD 初探
  6. 一次失败的蛋疼的设计
  7. Spring IOC容器组件注入的几种方式
  8. 当使用easyui时,jquery的设置disabled属性方法失效
  9. 软件测试员对英语,软件测试工程师英语面试题
  10. easyexcel 设置标题_使用easyexcel完成复杂表头及标题的导出功能(自定义样式)