Java字节流和字符流的区别
来源:互联网 发布:人工智能新闻 编辑:程序博客网 时间:2024/05/18 00:07
今天在学习中,突然感觉自己的Java输出输入流有些记忆模糊了。所以又重新温习下。从一些简单的知识点开始
吧。
在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();
- // 此时没有关闭
- }
- }
程序运行结果:Hello world!
此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的。而下面继
续使用字符流完成,再观察效果。
范例:使用字符流不关闭执行
- 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()方法完成。
范例:强制性清空缓冲区
- 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();
- // 此时没有关闭
- }
- }
程序运行结果:Hello world!
了解字节流和字符流的基本操作后,已经大概地明白了操作流程的各个区别,那么在开发中是使用字节流好还是
字符流好呢?
个人感觉使用字节流更好。所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方
式存储的,而字符是只有在内存中才会形成,所以在开发中,个人感觉字节流稍微好一些,当然也要分情况。
但是要记住InputStream,OutputStream,Reader,writer都是抽象类。所以不可以直接new。
那什么时候使用字节流什么时候用字符流呢?
我把他们总结为以下分类:是文本用BufferedReader /BufferedWriter是对象用ObjectInputStream/ObjectOutputStream是字节用BufferedInputStream/BufferedOutputStream
一个小概念纠缠这么久,我看来真的是强迫症又犯了-。=...
- java字符流和字节流区别
- java中的字节流和字符流的存储区别
- Java IO中字节流和字符流的区别
- java中的字节流和字符流的存储区别
- Java中字节流和字符流的区别
- Java IO中字节流和字符流的区别
- Java IO中字节流和字符流的区别
- java字符流和字节流的区别
- java中的字节流和字符流的存储区别
- java 关于字节流和字符流的区别
- Java字节流和字符流的区别
- java字节流和字符流的区别
- Java字节流和字符流的区别
- Java字节流和字符流的区别
- java 字节流和字符流的区别
- java 字节流和字符流的区别 转载
- java 字节流和字符流的区别
- JAVA中字节流和字符流的区别 。
- 配置adb的环境变量(add offline解决方法)
- 编程算法 - n个骰子的点数(递归) 代码(C)
- javascrip分页展示
- shell脚本测试空字符串
- MAC 和 PHY
- Java字节流和字符流的区别
- mysql相关的非常好的 tutorial
- jquery 思想
- Fedora下使用Eclipse进行Gtk+开发
- 收费系统三层+抽象工厂+反射实例
- PHP 去除数组中的空元素
- 在tomcat下使用jni加载本地库的问题总结 处理UnsatisfiedLinkError错误
- 二:2.How To Install nginx on CentOS 6 with yum
- MySQL的字符编码体系(二)——数据传输编码