11.20:io流
——io流
1.按流向划分:输入流、输出流
2.按读写方式划分:字节流(InputStream或OutputStream)、字符流(Reader或Writer)
注意io流对象不会被自动回收,所以在使用完后需要调用close方法去关闭资源。
——(1)文件流
文件字节流:FileInputStream、FileOutputStream底层是byte型数组,用于文件的读写,但是读写效率慢
文件字符流:FileWriter、FileReader,底层是char型数组,用于文件的读写,效率比字节流更快
——(2)缓冲流:
缓冲字符流:BufferedWriter和BufferedReader,写入和读取的效率更高。
缓冲字节流:BufferedInputSteam和BufferedoutputStream
——(3)内存流:当输出流的目的,和输入流的源是内存时,这样的流称之为内存流。
内存字节流:ByteArrayOutputStream和ByteArrayInputStream,其中ByteArrayInputStream它是唯一一种能够直接从网络上获取二进制数据的流。
内存字符流:ByteArrayReader和ByteArrayWriter
——(4)转换流:转换流只有字节转字符,没有字符转字节。
字节流 - > 字符流:InputStreamReader和OutputStreamWriter——(5)打印流:用于输出信息的类
PrintStream和PrintWriter都属于输出流,分别针对输出字节和字符。
PrintStream和PrintWriter提供了重载的print()、println()方法用于多种数据类型的输出。
PrintStream和PrintWriter不会抛出异常,用户通过检测错误状态获取错误信息。
PrintStream和PrintWriter有自动flush 功能。
——(对象流):对象流没有字符输入和输出流
ObjectInputStream: 字节流 (对象信息持久化) -> 程序中 -> java对象信息 ,称为反序列化
ObjectOutputStream: 对象信息 -> 字节流 (对象信息持久化) ,称为序列化
11.21网络编程:
网络通信协议:计算机之间的链接需要对数据的传输速率、代码结构、传输代码、传输控制步骤、出错控制等制定一组统一的标准。
-七层模型:OSI(Open System Interconnection),其中接触比较多的是物理层和应用层,物理层中其实就是设备, 比如说我们的电脑和鼠标键盘路由器等等东西都是物理层的,而应用层则是手机或者电脑上的一些应用,某些功能
-数据链路层:如何去调取数据
-网络层:通过网络传输数据
-运输层:数据的传输,TCP或者UDP
-java网络编程:
客户端 -> 服务器
-TCP
-UDP
-URL
-url.getPath获取端口,端口值若为-1,则说明为默认的端口号80
-InetArray:IP地址
原始地址其实是byte的数组,而不是我们看到的192.168.31.166
-TCP编程:传输控制协议
特点:有序可靠的,面向连接,主要是以字节流的方式传输!
客户端和服务器要建立起联系则需要提供IP地址和端口号
用于客户端的通信类叫Socke类,作用于服务器的通信类:ServerSocket
-UDP编程:
UDP用户数据报协议
特点:面向无连接,不可靠无序的,以数据报的形式发送(DatePacket),高效率
服务器和客户端的通信类:DatagramSocket
数据报包类:DatagramPacket
11.22进程和线程
*进程和线程
每个独立执行的程序称为进程。
线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源,
多个线程共享内存,从而极大地提高了程序的运行效率。
进程与线程的关系
> 进程的产生,肯定会产生至少一个以上的线程;
>
> 进程关闭,该进程内的线程会全部销毁;
>
> 线程销毁,进程未必会关闭
多线程,指的是一个进程内的多个任务并发执行。
多线程的好处:可以更高效地利用CPU资源,同时,让固定流程的程序更加灵活;
注意:多个线程之间,谁先抢占到资源,谁就先执行。
多线程的实现方式:
-1.继承Thread类
重写run方法
***run方法与start方法区别:
——run方法是按顺序去执行,不存在资源的竞争。而start方法则是线程之间存在竞争关系
-2.实现Ruannable接口
Runnable接口是一个接口但是他只有一个run方法并没有构造方法,所以需要通过Thread去构造一个Runnable的对象
——代码示例: RunThread runThread = new RunThread();
Thread th1 = new Thread(runThread);
其优点是:可以使多个线程共享资源,共享RunThread类里面的成员变量和成员方法
-3.实现Callable接口
Callable(重写call方法)可以抛出异常且有返回值,而Runnable(重写run方法)不能抛出异常且无返回值
无资源共享, 如果要像Runnable接口那样则需要创建多个Callable接口对象
——代码示例: Callable callable = new CallThread();
FutureTask futureTask = new FutureTask(callable);
new Thread(futureTask,"FF").start();
11.23
——(1)死锁问题
死锁产生的必要条件:
1> 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
2> 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
3> 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占用。
4> 循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路
在我们的项目中,我们不希望看到死锁的发生,为了避免,以上四个条件,破坏其中任意一个,死锁就结束了
注意:过多的同步会导致死锁
——(2)生产者和消费者
生产者与消费者模式就是一个多线程并发协作的模式,在这个模式中呢,一部分线程被用于去生产数据,另一部分线程去处理数据,