java-IO-字节流与和字符流

字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?
实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图12-6所示。  下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。
范例:使用字节流不关闭执行

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

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

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

程序运行结果: 

程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而   在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。
提问:什么叫缓冲区?
在很多地方都碰到缓冲区这个名词,那么到底什么是缓冲区?又有什么作用呢?
回答:缓冲区可以简单地理解为一段内存区域。
可以简单地把缓冲区理解为一段特殊的内存。
某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。
范例:强制性清空缓冲区

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

程序运行结果:  此时,文件中已经存在了内容,更进一步证明内容是保存在缓冲区的。这一点在读者日后的开发中要特别引起注意。
提问:使用字节流好还是字符流好?
学习完字节流和字符流的基本操作后,已经大概地明白了操作流程的各个区别,那么在开发中是使用字节流好还是字符流好呢?
回答:使用字节流更好。
在回答之前,先为读者讲解这样的一个概念,所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。
字节流与字符流主要的区别是他们的的处理方式
流分类: 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等

时间: 2024-08-31 17:32:13

java-IO-字节流与和字符流的相关文章

JAVA输入输出(IO)之字符流

上一篇<JAVA输入输出(IO)之字节流>介绍了JAVA字节输入输出流的一些用法,字节流一般是用于读写二进制数据的,当我们要读些字符数据的时候,如文本文件,就显得有些麻烦.所以JAVA还提供了专门用于读写字符数据的字符流. 字符输入流 java.io.Reader用于读取字符流的抽象类.子类必须实现的方法只有 read(char[], int, int) 和 close().但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能. 方法摘要 返回值 方法名 说明 abstrac

Java编程中字节流与字符流IO操作示例_java

 IO流基本概念IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都是在IO包上 流按操作数据分为两种:字节流和字符流 流按流向分为:输入流,输出流. 字节流的抽象基类:InputStream,OutputStream 字符流的抽象基类:Reader,Writer 注:由这4个类派生出来的子类名称都是以其父类名作为子类名的后缀. 如:InputStream的子类:FileInputStream 如:Reader的子类FileReader 如创建一个Fi

Java基础-21总结字符流,IO流编码问题,实用案例必做一遍

你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:字符流(掌握)  // 字节流读取中文可能出现的小问题(所以用字符流输入输出中文) package cn.itcast_01; import java.io.FileInputStream; import ja

java 字节流和字符流的区别

字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图12-6所示. <iframe id="iframe_0.4142593172691813" style="margin: 0px; padding: 0px; border-width: initial; border-style: none; width:

Java字符流与字节流区别与用法分析_java

本文实例讲述了Java字符流与字节流区别与用法.分享给大家供大家参考,具体如下: 字节流与字符流主要的区别是他们的的处理方式 流分类: 1.Java的字节流 InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先. 2.Java的字符流 Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先. InputStream,OutputStream,Reader,writer都是抽象类.所以不能直接new 字节流是最基本的,所有的Inpu

java IO之 编码 (码表 编码 解码 转换流)

编码 什么是编码? 计算机中存储的都是二进制,但是要显示的时候,就是我们看到的却可以有中国 ,a  1 等字符 计算机中是没有存储字符的,但是我们却看到了.计算机在存储这些信息的时候,根据一个有规 则的编号,当用户输入a 有a对映的编号,就将这个编号存进计算机中这就是编码.   计算机只能识别二进制数据. 为了方便应用计算机,让它可以识别各个国家的文字.就将各个国家的文字用数字来表示, 并一一对应,形成一张表,这就是编码表. 例如: 汉字 中  有一种编码: 中字在utf 8中对映的编码   

Java IO教程

Java IO 是一套Java用来读写数据(输入和输出)的API.大部分程序都要处理一些输入,并由输入产生一些输出.Java为此提供了java.io包. 如果你浏览下java.io包,会对其中各样的类选择感到迷惑.这些类的作用都是什么?对于某个任务该选择哪个类?怎样创建你自己的类做插件?这个手册的目的就是给你介绍这些类是如何组织的,以及怎样使用他们,因此你就不会疑惑需要时怎样选取合适的类,或者是否有一个满足你需求的类已经存在了. Java.io 包的范围 java.io 包并没有涵盖所有输入输出

Java IO

一.java io 概述 1.1 相关概念 Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒介进行IO(文件.控制台.网络),我们还要考虑具体和它们的通信方式(顺序.随机.二进制.按字符.按字.按行等等).Java类库的设计者通过设计大量的类来攻克这些难题,这些类就位于java.io包中. 在JDK1.4之后,为了提高Java IO的效率,Java

JAVA IO系列----ObjectInputStream和ObjectOutputStream类

·ObjectInputStream和ObjectOutputStream这两个包装类,用于从底层输入流中读取对象类型的数据和对象类型的数据写入到底层输出流.将对象中所有成员变量的取值保存起来就等于保存了对象,将对象中所有成员变量的取值还原就相等于读取了对象. ·ObjectInputStream和ObjectOutputStream类所读写的对象必须实现了Serializable接口.对象中的transient(一种标记,表示变量是临时的)和static类型的成员变量不会被读取和写入.这两个类