Java基础之I/O流

时间:2021-10-08 11:32:51

  一.什么是流?

  1. I/O的定义 :  Input/Out   入/出

   Java通过来执行I/O

  2.什么是流?

     流,是一种抽象的东西,咱们先抛开I/O不说,单说计算机中,如果想要让软件来改变硬件(比如在硬盘上添加一些txt等),就得依靠流来让硬件发生变化;

   Java中讲的I/O就是这样的一种,I/O是一门自带流属性的技术,我理解为它就是一种具有偏向性的流;

   I/O流简称,他的中文学名叫做 "I/O 基于流", 完成数据的 入 / 出 操作,建立在流的基础上.

 

 

二.字符流和字节流的特点和区别

  • 字节是一种单位,也就是Byte, 表示数据量的多少,它计算机中存储容量的一种计量单位;

 

  • 字符是指计算机啊中使用的文字符号,比如"1,2,3,4,A,V,C,a,e,r,@,$,%"…等

 

  字节和字符,它们完全不是一个概念,一个是计量单位,一个是纯粹的名词. 并且在不同的字节编码里,字符和字节的对应关系不同,指的是字符的字节单位大小不同;

    •   Ascll码中,一个引文字母(不分大小写)占用一个字节空格键,一个汉字占用两个字节空间,一个二进制数字占用一个字节空间
    •        UTF-8编码中,一个英文字符等于一个字节,一个中文等于两字节
    •        Unicode编码中, 所有字符占两个字节
    •      UTF-16编码中,一个英文占用两个字节,一个中文占用两个字节(有一些UNICODE补充的中文汉字要占用4个字节)
    •   UTF-32编码中,任何字符存储都要占用四个字节

        (来自百度,了解个大概,个人不清楚各种编码详细情况)

        具体可以借鉴:一个讲关于编码很详细的介绍 斟酌观看

            Java基础之I/O流

 

    个人理解..

     根据上面的理解,因为一开始的字符都是一个字节,慢慢的全球化开启因为各地的语言使用出现了字符,一个字符占用两个字节单位,字节是根本,一切的一切都是按照字节来的;

    字符是字节的一种替代,各有所用,但是字节是基本的东西,字符是一种根据编码集翻译出来的产物;

 

    

三. 字符流和字节流的区别

  1.字节流:顾名思义,在以字节为基本操作基础的情况下对流进行定义;

 

   2.字符流:是以字符为操作基础,它使用的编码表是Unicode,所以可以国际化,并且在某些情况下,字符流比字节流更高效,

     但是底层上,字符流也是基于字节流的; (就好像,Java用操作符可以完成数组排序,但实际上用一些工具类的方

        法可以快速完成数组排序;)

 

 

  3. 在Java的概念中,实现I/O流的方法

 

 

Java基础之I/O流

 

 

     本质上,底层里,字符流是基于字节留的,底层运行的时候最基本的还是字节流; 

 

四.预定义流

  Java程序一定会先倒入lang包,该包包含一个System类,它封装了运行时环境的几个要素,其中有三个预定义流变量,

  分别是,in out err; 在System中分别被定义为public,final,static;

  • System.out是标准输出流,默认情况下是控制台,是InputStream类型的对象;
  • System.in是标准输入流,默认情况下是键盘,是PrintStream类型的对象;
  • System.err是标准错误流,默认情况下是控制台,也是PrintStream类型的对象;

  尽管他们通常用于对控制台的输入和读写,但这些都是字节流,因为预定义流没有包含字符流的java原始规范,

  所以他们不是字符流而是字节流

 

 

五.

  1.读取控制台输入

   对于商业代码而言,读取控制台输入的首选项是使用字符流,因为这样做可以使程序更易国际化,更易维护,而且直接操作字符要比在字符字节之间来回切换转换方便的多;

    

 public static void main(String[] args) throws IOException {
        byte[] date = new byte[10];
        System.out.println("输入一些数");
      /*  System.in 返回从控制台输入字符  read
        从输入流读取数据的下一个字节。 值字节返回为int ,范围为0至255 。
         如果没有字节可用,因为已经到达流的末尾,则返回值-1 。
         该方法阻塞直到输入数据可用,检测到流的结尾,或抛出异常。*/
        System.in.read(date);
        //System.in.rean输入不存在什么输多了,read方法把输入的字符存储好到内存中,然后再
        //向date数组中存放,从内存中的第一个开始往里面灌,灌满为止,剩下多余的被回收

        for (byte b : date) {
            //如果直接输入b,那就相当与把输入的字节的底层ascll码给转为String了
             // 就会直接输出输入字符所代表的ascll码
          //System.out.println(b);
            System.out.println((char)b);//将ascll转换为字符形式,输出的是ascll代表的字符

        }
    }
    

 

 

  2.写入,控制台输出

  

public static void main(String[] args) {
    int b=12;
    //向屏幕写入一个字节 ,他不会将十进制Ascll码转换为字符串,而是直接转换为字符
    //或者说  字符类型(char)  会隐式转换为int类型
    System.out.write(b); //write()的写入目标是控制台
    System.out.write('\n');

}

 

  而System.in.read(); 是输入;流

  将一些东西读取 到程序中;

 

 

 

 网太慢,明天更