Java的输入输出

一、Java中的流的概念

1.0 数据流的概念

 数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。
 “流是磁盘或其它外围设备中存储的数据的源点或终点。”
在电脑上的数据有三种存储方式,一种是外存,一种是内存,一种是缓存。比如电脑上的硬盘,磁盘,U盘等都是外存,在电脑上有内存条,缓存是在CPU里面的。外存的存储量最大,其次是内存,最后是缓存,但是外存的数据的读取最慢,其次是内存,缓存最快。这里总结从外存读取数据到内存以及将数据从内存写到外存中。对于内存和外存的理解,我们可以简单的理解为容器,即外存是一个容器,内存又是另外一个容器。那又怎样把放在外存这个容器内的数据读取到内存这个容器以及怎么把内存这个容器里的数据存到外存中呢?
 在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:
标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。
流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。

  以上总结的基本概念如下:
🌸数据流:一组有序,有起点和终点的字节的数据序列。包括输入流和输出流; 🌸输入流(Input Stream):程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道; 🌸输出流:程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。采用数据流的目的就是使得输出输入独立于设备。 Input Stream不关心数据源来自何种设备(键盘,文件,网络) Output Stream不关心数据的目的是何种设备(键盘,文件,网络) 🌸数据流分类:流序列中的数据既可以是未经加工的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。因此Java中的流分为两种: 1) 字节流:数据流中最小的数据单元是字节; 2) 字符流:数据流中最小的数据单元是字符,Java中的字符是Unicode编码,一个字符占用两个字节。 🌸具体的字节流和字符流区分请看文章《Java:字节流和字符流(输入流和输出流)》和[《Java 字节流与字符流的区别》](https://blog.csdn.net/qq_25184739/article/details/51203733)、[《理解Java中字符流与字节流的区别》](https://www.cnblogs.com/absfree/p/5415092.html)、[《Java:字节流和字符流(输入流和输出流)》](https://www.cnblogs.com/progor/p/9357676.html).

 

二、System、in、out说明

Java系统自带的标准数据流:java.lang.System:

1
2
3
4
5
6
java.lang.System     
public final class System extends Object{
static PrintStream err;//标准错误流(输出)、err是对象;
static InputStream in;//标准输入(键盘输入流)、in是对象;
static PrintStream out;//标准输出流(显示器输出流)、out是对象.
}
🌼 System类不能创建对象,只能直接使用它的三个静态成员; 🌼 每当main方法被执行时,就自动生成上述三个对象; 🌼 System是java.lang包里面的一个类; 🌼 in是java.io.InputStream类的对象,也是System里面的一个数据成员(也称为字段); 🌼 read()是java.io.InputStream类里的方法,也就是in对象的方法; 🌼 out是java.io.PrintStream类的对象,也是System里面的一个数据成员(也称为字段); 🌼 print()、println()是java.io.PrintStream类里的方法,也就是out对象的方法;

 

三、System.in.read()使用

🌼 System.in.read()方法的作用是按每次读取一个字节(就是ASCII码),然后返回它的ASCII码十进制; 🌼 从第一次打开System.in输入流开始,以后输入的字节都存放起来,下次从这个里面依次按顺序读取; 🌼 用System.in.read()时,我们在键盘上按下的任何一个键都会被当做是输入值,包括Enter键也会被当做是一个值!当我们按下Enter的时候,实际上发送两个键值:一个回车\t(13),一个是换行\n(10); 🌼 从键盘输入一个a,char是两个字节存储的,read()一个字节一个字节读取时,暂时把a看作是一个字节,后续深入学习了再来解释😫😂(哈,貌似想通了,当字节流读到字节为0的数据流时会舍去,相当于跳过该字节继续读下一个非0的字节.....后续更新中)----12.27与老师探讨后得知:在流中输入的字符是一个ASCII(即一个字节=8比特),这个时候就是一个字节,而char存储的时候是按2个字节存储的,注意的是在流中并不是存储,存储一个字符是Unicode码共16位,而流中的ASCII是8位。 建议去读[《java总结输入流输出流》](https://blog.csdn.net/liuxiaogangqq/article/details/25892667)!!! 可参考[Scanner使用方法](https://www.cnblogs.com/ioveNature/p/6797024.html)

注意事项:

1、由于在控制台输入时,按下回车键才代表输入完成,输入的内容才会提交到read()方法,所以按下回车之前,程序是不知道你输入了什么的; 2、输入"a"后按下回车,这时候read()方法读到了数据,此时buffer中的数据应该是97 13 10,也就是字符'a','\r','\n',并且read()方法每次只能从缓冲区中读出一个字符,三次read()就刚好读出这3个字符,之后程序就结束了; 3、只按下回车,此时从流中只读到了"\r"和"\n",由于没有足够的输入,那么第三次调用read()时阻塞. 参考:[《System.in.read()使用》](https://uule.iteye.com/blog/1128243);[《System.in输入流深入理解》](https://blog.csdn.net/fengzijinliang/article/details/40741565?utm_source=blogxgwz0) 推荐阅读:[《深入理解JAVA中的IO》](https://www.cnblogs.com/ylspace/p/8128112.html)

 

四、System.out.print()/println()

🌼 System.out.print()输出不换行,System.out.print()输出后换行. 参考[《深入理解System.out.print》](https://blog.csdn.net/idealemail/article/details/47318813).

 

五、Java中System.out.print()函数与Python中print()函数的详解

python中的print()函数和java中的System.out.print()函数都有着打印字符串的功能。 (1). python中: print("hello,world!") 输出为:hello,world! Java中: System.out.print("hello,world!"); 输出为:hello,world! 说明这两个函数的用法是一样的. (2). python中: print("1+1=",1+1) 输出结果为:1+1= 2 Java中: System.out.print("1+1="+(1+1)); 输出结果为:1+1=2 说明在使用print()函数的时候,我们用了一个“,”将“1+1=”和1+1的结果连接起来了,这个“,”起着连接的作用。同时,在使用System.out.print()函数的时候,我们用了一个“+”将“1+1=”和1+1的结果连接起来了,这个“+”也是起着连接作用; 我们再来看他们的输出结果,print()输出的是1+1= 2,“=”与“2”之间有一个空格,而System.out.print()输出的是1+1=2,“=”与“2”之间没有空格。这里我们发现python中的print()函数中的“,”不仅起着连接字符串的作用,而且还表示一个空格.

结论:
🌼 python中的print()函数的作用和java中的System.out.print()函数的作用是一样的;
🌼 print()函数中“,”和System.out.print()函数中“+”都有着连接字符串的作用;
🌼 print()函数中“,”还表示一个空格;
🌼 不同的语言都有着很多的相似点,不同的语言又有着不同的新特性.

参考:《python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解》.