标准输入流和标准输出流
标准输入流:源数据源是标准输入设备(键盘、鼠标、触摸屏、画板)等输入设备;以前外设比较少,基本就是键盘鼠标。通过标准输入设备输入到内存中的数据流
标准输出流:数据目的地是标准输出设备(一般来说是显示器,电脑啊手机啊手表啊,只要能显示东西的)等输出设备。简单来说,就是经过验算之后,把东西显示出来
System:
不能实例化,不能实例化等于方法都是静态方法,同时没有提供构造方法。不能new。在system类提供的设施中,有标准输入、标准输出流,对外部定义的属性和环境变量的访问,加载文件和库的方法,还有快速复制数组的一部分实用方法。
标准输入流:in
在java中用system.in得到一个字节输入流inputstream字节输入流。
从键盘输入一个字符的例子:
InputStream in = System.in;
int c = in.read();
System.out.println((char)c);
从键盘输入一句话的例子:
InputStream in = System.in;
byte[] buf = new byte[1024];
int len;
len = in.read(buf);
String ste = new String (buf,0,len);
System.out.println(str);
System.out.println();
标准输出流:out
在java中使用system.out得到一个printstream字节输出流(字节打印流)。提供了更强大的
println
打印方法用于打印各种数据类型。
Serializable:
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化,并抛出异常
Serializable接口没有方法或字段,仅用于标识可序列化的语义
序列化对象:
ObjectOutputStream 继承于OutputStream,专门用于把对象序列化到本地。提供了
writeXXX
writeObject() 用于写入一个对象
反序列化对象:
ObjectInputStream 继承于InputStream ,专门用于把本地持久化内容反序列化到内存,提供了
readXXX
readObject() 用于读取一个序列化内容并返回一个对象。
序列化版本:
当序列化完成后,后期升级程序中的类(Student),此时再反序列化时会出现异常。
异常原因:序列化流的serialVersionUID和升级后类的版本不匹配。
解决方案:给Student类加序列化版本号,有两种方式
default serial version ID 生成默认的serial version ID 一般值都是1L。
generated serial version ID 根据当前类的属性、方法生成一个唯一ID。
开发过程中,如果想忽略某些字段不让其序列化时,可以使用transient修饰。
DataInputStream/DataOutputStream:
DataOutputStream 继承OutputStream,专门用于把基本java数据类型写入输出流。提供了writeXXX 写入基本java数据类型。
DataInputStream 继承于InputStream,允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
DataInputStream/DataOutputStream 特别适合读取/写入在网络传输过程中的数据流。
以什么顺序写入基本java数据类型,就以什么顺序读取基本java数据类型。
多线程的概念:
程序和进程:
程序就是一堆静态的代码,存储在硬盘上。程序如果不运行,本质就是一个文件。
程序一次运行产生进程,进程一直向前运行,直到进程结束。
之前是单任务操作系统:一段时间只能运行一个程序或者任务,CPU利用率非常低
然后引进进程的概念:把程序中一次运行产生的进程(内存空间、资源、程序的执行堆栈)
进程作为操作系统分配资源的基本单位。
多任务操作系统:一台电脑就一个CPU,多个任务轮流使用CPU,从宏观上看,一段时间多个任务正在运行,从微观看,一个时间点只有一个任务在运行,就你用一下,马上转到下一个,然后马上再转下下一个,再下下下一个,很快的
CPU时间片:
多个进程通过CPU时间篇轮转实现多任务(进程)、把这种现象叫做并发操作
并行:多个CPU运行各自的进程
线程的引入是解决实时性问题
多线程实现:
Thread 类位于java.lang中,表示进程中的执行线程。实现多线程有两种方式
[1] 继承Thread
main线程和t1线程抢占CPU 执行。多线程在提高CPU利用率的同时,增加程序的复杂度。
[2]实现Runnable接口