图:Java io概览图

流的概念和作用

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

IO流的分类

                    字节流                         字符流
输入流       
InputStream              
Reader

输出流       
OutputStream           
Writer

字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:

(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。

结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。

输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

JAVA字节流

  • FileInputStreamFileOutputStream
    这两个类属于结点流,第一个类的源端和第二个类的目的端都是磁盘文件,它们的构造方法允许通过文件的路径名来构造相应的流。如: 
    FileInputStream infile = new FileInputStream("myfile.dat");
    FileOutputStream outfile = new FileOutputStream("results.dat");

要注意的是,构造FileInputStream, 对应的文件必须存在并且是可读的,而构造FileOutputStream时,如输出文件已存在,则必须是可覆盖的。

  • BufferedInputStream和BufferedOutputStream
    它们是过滤器流,其作用是提高输入输出的效率。
  • DataInputStream和DataOutputStream
    这两个类创建的对象分别被称为数据输入流和数据输出流。这是很有用的两个流,它们允许程序按与机器无关的风格读写Java数据。所以比较适合于网络上的数据传输。这两个流也是过滤器流,常以其它流如InputStream或OutputStream作为它们的输入或输出。

Java的字符流

字符流主要是用来处理字符的。Java采用16位的Unicode来表示字符串和字符,对应的字符流按输入和输出分别称为readers和writers。

    • InputStreamReader和OutputStreamWriter
      在构造这两个类对应的流时,它们会自动进行转换,将平台缺省的编码集编码的字节转换为Unicode字符。对英语环境,其缺省的编码集一般为ISO8859-1。
    • BufferedReader和BufferedWriter
      这两个类对应的流使用了缓冲,能大大提高输入输出的效率。这两个也是过滤器流,常用来对InputStreamReader和OutputStreamWriter进行处理。
    • public class readFile {
      public static void main(String [] args) {
      BufferedInputStream bs = null;
      BufferedOutputStream bo = null;
      String fileName = "d:" + File.separator + "file" + File.separator + "file.txt";
      String fileNameOut = "d:" + File.separator + "file" + File.separator + "file1.txt";
      try {
      File file = new File(fileName);
      bs = new BufferedInputStream(new FileInputStream(file));
      bo = new BufferedOutputStream(new FileOutputStream(fileNameOut));
      byte[] buf = new byte[1024];
      int len = 0;
      while((len = bs.read(buf))!= -1) {
      System.out.println(new String(buf,0,len));
      bo.write(buf,0,len);
      }
      bo.flush();//如果OutputStream 的实现使用了缓存,这个方法用于清空缓存里的数据,并通知底层去进行实际的写操作
      } catch (FileNotFoundException e) {
      e.printStackTrace();
      } catch (IOException e) {
      e.printStackTrace();
      }finally {
      try {
      bs.close();
      bo.close();
      } catch (IOException e) {
      e.printStackTrace();
      }
      }
      }
      }
    • DataOutputStream、DataInputStream的常见用法

      包装类DataOutputStream、DataInputStream为我们提供了多种对文件的写入和读取方法,

      如writeBoolean(),writeUTF(),writeChar,writeByte(),writeDouble()等和对应的read方法,

      这些方法极大的方便了我们的写入和读取操作,下面结合一个程序来探讨一下这些方法的使用。

      import java.io.*;
      public class TestDataStream {

      public
      static void main(String[] args) throws Exception {
        
        FileOutputStream fos=new
      FileOutputStream("data.txt");
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        DataOutputStream dos=new DataOutputStream(bos);
        
        FileInputStream fis=new
      FileInputStream("data.txt");
        BufferedInputStream bis=new BufferedInputStream(fis);
        DataInputStream dis=new DataInputStream(bis);
        
        String str="你好hi";
        dos.writeUTF(str);   //按UTF-8格式写入
        dos.writeChars(str); //按字符写入
        //按字节写入有两种方法,第一种方法只能适应无汉字的情况;
        //因为方法1在写入时会把所有的字符都按1个字节写入,而汉字的表示需要2个字节,
        //这就造成了数据的丢失,读入时就会出现乱码。
        //而方法2在将字符串转换为字节数组时就把汉字字符变为了2个字节,
        //写入文件的时候也会按2个字节的文字写入,这样读取的时候就不会出现问题
        dos.writeBytes(str);//方法1:将整个字符串按字节写入
        byte[] b=str.getBytes();
        dos.write(b);  //方法2:将字符串转换为字节数组后再逐一写入
        dos.close();
        //按UTF-8格式读取

      System.out.println(dis.readUTF());
        //字符读取
        char [] c=new char[4];
        for(int i=0;i<4;i++){     
         c[i]=dis.readChar();   //读取4个字符
        }
        System.out.print(new String(c,0,4));
        System.out.println();
        //字节读取

      byte
      [] b1=new byte[4];
        dis.read(b1); //读取4个字节
        System.out.print(new String(b1,0,4));//输出时会出现乱码
        System.out.println();
        
        byte [] b2=new byte[1024];
        int len=dis.read(b2); //按字节读取剩余的内容
        System.out.println(new String(b2,0,len));
       }

      }

      输出结果为:

      你好hi
      你好hi
      `}hi
      你好hi

      注意1:一般情况下在读入时尽量按照写入时的格式进行读取,

      否则有可能会出现显示乱码或程序出现异常。

      如首先写入文件用的是writeUTF(),在读取的时候如果不是用readUTF()就会出现乱码,

      如果readUTF()读取的内容不是UTF-8格式的,程序就会抛出异常。

      注意2:如程序中注释所说,对于出现汉字字符的情况不能用writeBytes(),这会在写入文件时丢弃汉字字符的第一个字节从而在读取时出现错误。

      注意3:所有的读取方法都是共享一个位置指示器的,即在前面的read方法执行后,后面再执行其他read方法都是从上一个read方法读取到的位置开始向后读取的。如开始执行了1次readByte()后面的readChar是从第2个字节开始读的。

Java io使用简介的更多相关文章

  1. Java IO流简介

    Java中的流是什么? java中的流是一个抽象的概念,在java的程序中需要把文件从一个设备传输到另一个设备上,这个设备可以是内存,程序,文件,网络.把在这些之间传输的叫做流.官方的解释:流是一组有 ...

  2. JDK源码阅读(1)_简介+ java.io

    1.简介 针对这一个版块,主要做一个java8的源码阅读笔记.会对一些在javaWeb中应用比较广泛的java包进行精读,附上注释.对于容易混淆的知识点给出相应的对比分析. 精读的源码顺序主要如下: ...

  3. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)

    我们以ByteArrayInputStream,拉开对字节类型的“输入流”的学习序幕.本章,我们会先对ByteArrayInputStream进行介绍,然后深入了解一下它的源码,最后通过示例来掌握它的 ...

  4. java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括OutputStream)

    前面学习ByteArrayInputStream,了解了“输入流”.接下来,我们学习与ByteArrayInputStream相对应的输出流,即ByteArrayOutputStream.本章,我们会 ...

  5. java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例

    本章,我们对java 管道进行学习. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_04.html java 管道介绍 在java中,PipedOu ...

  6. Java IO简介

    -------------siwuxie095                 Java IO简介:     IO 也写作"I/O",可理解为 In 和 Out,即 输入 与 输出 ...

  7. Java IO流字符流简介及基本使用

    Java IO流字符流简介及常用字符流的基本使用 字符流分为输入字符流(Writer)和输出字符流(Reader),这两种字符流及其子类字符流都有自己专门的功能.在编码中我们常用的输出字符流有File ...

  8. java IO流 Zip文件操作

    一.简介 压缩流操作主要的三个类 ZipOutputStream.ZipFile.ZipInputStream ,经常可以看到各种压缩文件:zip.jar.GZ格式的压缩文件 二.ZipEntry   ...

  9. Java IO设计模式彻底分析 (转载)

    一.引子(概括地介绍Java的IO) 无论是哪种编程语言,输入跟输出都是重要的一部分,Java也不例外,而且Java将输入/输出的功能和使用范畴做了很大的扩充.它采用了流的 机制来实现输入/输出,所谓 ...

随机推荐

  1. (NO.00003)iOS游戏简单的机器人投射游戏成形记(九)

    现在按住手臂可以非常自然和舒服的旋转了,丝般顺滑:移动停止,旋转立即停止,没有什么惯性影响了. 以上一共介绍了2中旋转方式,到底采用哪种方式呢?其实看实际游戏的需求和个人的喜好了.本猫在Level中添 ...

  2. Html.java 存储页面信息类

    Html.java 存储页面信息类 package com.iteye.injavawetrust.miner; /** * 存储页面信息类 * @author InJavaWeTrust * */ ...

  3. 如何设计一个web容器

    开发一个web容器涉及很多不同方面不同层面的技术,例如通信层的知识,程序语言层面的知识等等,且一个可用的web容器是一个比较庞大的系统,要说清楚需要很长的篇幅,本文旨在介绍如何设计一个web容器,只探 ...

  4. 【翻译】EXTJS 编码风格指南与实例

    原文:EXTJS Code Style Guide with examples Ext JS风格指南: 熟知的且易于学习 快速开发,易于调试,轻松部署 组织良好.可扩展和可维护 Ext JS应用程序的 ...

  5. 【面试笔试算法】牛客网一站通Offer编程题2016.4.19

    牛客网一站通offer (一)字符串变形 1. 题目: 对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形.首先这个字符串中包含着一些空格,就像"Hello Wor ...

  6. Android SDK工具(谷歌提供的16个工具)简介

    Android SDK包含了许多可以帮助你开发Android平台应用的工具.这些工具分为两类:一是SDK工具:而是平台工具.SDK工具独立于平台,任何开发Android应用的平台都需要配置.平台工具是 ...

  7. Vim/Vi常用操作(第二版)

    周围同事不是用vim就是Emacs,你要是用一ultraedit,你都不好意思跟人家打招呼;什么插件呀,语法高亮呀,拼写检查呀,能给它开的都给它开着,就是一个字儿:酷. 你说这么牛B一东西,怎么着学会 ...

  8. iOS课程表

    最近在做课程表,刚开始的时候完全不知道那个周课表的网格是怎么实现的有木有,各种查资料,寻思路,只找到一个安卓版的.没事,咱要的是思路而已.可能思路不是最优的,但还是总结一下,也希望能给其他人一点思路. ...

  9. Cloud Carousel

    <div class="carousel1" id="carousel1" > <a href="#"><im ...

  10. MySQL MEB常见用法

    1. 备份成镜像 备份: ./mysqlbackup --socket=/usr/local/mysql-advanced--linux-glibc2.-x86_64/data/mysql.sock ...