[Java教程]Java字节流与字符流的区别

0 2017-05-22 12:00:42

字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?

实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图12-6所示。

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

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

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();

// 此时没有关闭

}

}

程序运行结果:

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

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

package org.lxh.demo12.chariodemo;

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()方法完成。

范例:强制性清空缓冲区Java代码

package org.lxh.demo12.chariodemo;

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等。学习Java的同学注意了!!!

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:618528494我们一起学Java!

本文网址:http://www.shaoqun.com/a/309046.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

JAVA

0

java字符流实际上也是字节,[Java教程]Java字节流与字符流的区别相关推荐

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

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

  2. java中char是几个字节_关于java中char占几个字节,汉字占几个字节

    我们平常说,java中char占2个字节,可又说汉字在不通的编码格式中所占的位数是不同的,比如gbk中汉字占2个字节,utf8中多数占3个字节,少数占4个.而所有汉字在java程序中我们都可以简单的用 ...

  3. 第 1 章 一 JVM 和 Java 体系架构 (虚拟机介绍、字节码、Java跨平台性)

    第 1 章 JVM 和 Java 体系架构 1.JVM 前言 作为Java工程师, 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却 ...

  4. java 工具箱安装方法,Java工具包的安装配置和使用-JSP教程,Java技巧及代码

    1.下载j2sdk 1.4.1或更高版本 (http://java.sun.com,建议同时下载其java documentation,这是java帮助文档) 2.运行刚刚下载的j2sdk-1_4_1 ...

  5. c# java gt;gt;gt;,相同的字节数组=gt; Java和C#中的不同BigInteger值

    byte[] byteArray = { 52, 51, 102, 100, 55, 48, 48, 48, 57, 97, 57, 55, 97, 55, 100, 51, 49, 49, 99, ...

  6. java代码写jsp读取,Java IO学习基础之读写文本文件-JSP教程,Java技巧及代码

    java的io操作都是基于流进行操作的,为了提高读写效率一般需要进行缓冲. 简单的示例程序如下: /** * 读出1.txt中的内容,写入2.txt中 * */ import java.io.*; p ...

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

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

  8. 复习Java字节流_字符流使用及案例

    字节流_字符流 主要内容 IO流 字节流 字符流 异常处理 Properties 第一章 IO概述 1.1 什么是IO 生活中,你肯定经历过这样的场景.当你编辑一个文本文件,忘记了ctrl+s ,可能 ...

  9. 开课吧Java课堂:什么是流?如何运用字节流和字符流?

    Java程序通过流来完成输入/输出.流是生产或消费信息的抽象.流通过Java的输入/输出系统与物理设备链接.尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式.这样,相同的输入/输出类和方法 ...

最新文章

  1. 从Sql server 2000 到 Oracle 10g数据库迁移数据类型转化
  2. HTML学习笔记之二(回到顶部 与 回到底部)
  3. 3信号处理之:避免异步IO的类型,SIGCHLD信号处理
  4. Swift傻傻分不清楚系列(十一)类和结构体
  5. git遇到的问题解决方案
  6. CSS让图片垂直居中的几种技巧
  7. S32K的flexcan组件can fd使用
  8. 我收藏的PDF电子书第一部分
  9. 淘宝双十一最强星秀猫组队人气比拼活动规则和攻略
  10. 小猪短租住房信息爬取
  11. 使用R语言进行时间序列(arima,指数平滑)分析
  12. 微信公众号页面开发记录
  13. SSLOJ 1323.交流
  14. 自动驾驶技术——初学者笔记1:自动驾驶分级
  15. 实验二+070+胡阳洋
  16. 如何用p5js做一个可爱的鲶鲶并添加不倒翁效果
  17. cURL error 18: transfer closed with xxxxxxx bytes remaining to read
  18. 音视频SDK包-远程网络视频会议-在线远程教育-屏幕共享-电子白板-影音共享-在线直播等等都可以用
  19. RXJava2响应式编程框架设计三---Rxjava2背压、生命周期
  20. 大数据技术原理——期末复习storm

热门文章

  1. php $handle,laravel $kernel-handle 报错的解决办法_PHP开发框架教程
  2. ncf 推荐系统_浅析神经协同过滤NCF在推荐系统的应用
  3. 怎样把java项目转换成web项目_Eclipse中将Java项目转换成Web项目的方法
  4. matlab保存colormap失败
  5. 吴恩达《机器学习》学习笔记十一——应用机器学习的建议
  6. TensorFlow的基本介绍及Hello,world
  7. CompletableFuture详解~supplyAsync
  8. 为什么我们要使用HTTP Strict Transport Security?
  9. Consolidate Duplicate Conditional Fragments(合并重复的条件片段)
  10. 用jar 命令打包war包