一.什么是流?
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编码中,任何字符存储都要占用四个字节
(来自百度,了解个大概,个人不清楚各种编码详细情况)
具体可以借鉴:一个讲关于编码很详细的介绍 斟酌观看
个人理解..
根据上面的理解,因为一开始的字符都是一个字节,慢慢的全球化开启因为各地的语言使用出现了字符,一个字符占用两个字节单位,字节是根本,一切的一切都是按照字节来的;
字符是字节的一种替代,各有所用,但是字节是基本的东西,字符是一种根据编码集翻译出来的产物;
三. 字符流和字节流的区别
1.字节流:顾名思义,在以字节为基本操作基础的情况下对流进行定义;
2.字符流:是以字符为操作基础,它使用的编码表是Unicode,所以可以国际化,并且在某些情况下,字符流比字节流更高效,
但是底层上,字符流也是基于字节流的; (就好像,Java用操作符可以完成数组排序,但实际上用一些工具类的方
法可以快速完成数组排序;)
3. 在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(); 是输入;流
将一些东西读取 到程序中;
网太慢,明天更