如果主方法main()想结束阻塞中的线程(比如sleep或wait) 那么我们可以从其他进程对线程对象调用interrupt()。用于对阻塞(或锁池)会抛出例外Interrupted Exception。
这个例外会使线程中断并执行catch中代码。
多线程中的重点:实现多线程的两种方式,Synchronized,以及生产者和消费者问题(ProducerConsumer.java文件)。
练习:
① 存车位的停开车的次序输出问题;
② 写两个线程,一个线程打印1-52,另一个线程答应字母A-Z。打印顺序为12A34B56C??5152Z。通
过使用线程之间的通信协调关系。
注:分别给两个对象构造一个对象o,数字每打印两个或字母每打印一个就执行o.wait()。在o.wait()之前不要忘了写o.notify()。
补充说明:通过Synchronized,可知Vector较ArrayList方法的区别就是Vector所有的方法都有Synchronized。所以Vector更为安全。 同样:Hashtable较HashMap也是如此。
12.08
Module 10:I/O流(java如何实现与外界数据的交流)
Input/Output:指跨越出了JVM的边界,与外界数据的源头或者目标数据源进行数据交换。 输出 数据源 JMV
输入 注意:输入/输出是针对JVM而言。
File类(java.io.*)可表示一个文件,也有可能是一个目录(在JAVA中文件和目录都属于这个类中,而且区分不是非常的明显)。
Java.io下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文件的内容。
注意:创建一个文件对象和创建一个文件在JAVA中是两个不同的概念。前者是在虚拟机中创建了一个文件,但却并没有将它真正地创建到OS的文件系统中,随着虚拟机的关闭,这个创建的对象也就消失了。而创建一个文件才是在系统中真正地建立一个文件。
例如:File f=new File(“11.txt”);//创建一个名为11.txt的文件对象
f.CreateNewFile(); //真正地创建文件
f.CreateMkdir():创建目录 f.delete();删除文件
f.deleteOnExit();在进程退出的时候删除文件,这样的操作通常用在临时文件的删除。
对于命令:File f2=new file(“d:\\\\abc\\\\789\\\\1.txt”)
这个命令不具备跨平台性,因为不同的OS的文件系统很不相同。
如果想要跨平台,在file类下有separtor(),返回锁出平台的文件分隔符。 File.fdir=new File(File.separator);
String str=”abc”+File.separator+”789”;
使用文件下的方法的时候一定注意是否具备跨平台性。
List():显示文件的名(相对路径)
ListFiles():返回Files类型数组,可以用getName()来访问到文件名。
达内java学习笔记
26
使用isDirectory()和isFile()来判断究竟是文件还是目录。
练习:
写一个javaTest程序,列出所有目录下的*.java文件,把子目录下的JAVA文件也打印出来。
使用I/O流访问file中的内容。
JVM与外界通过数据通道进行数据交换。 分类:
按流分为输入流和输出流;
按传输单位分为字节流和字符流; 还可以分为节点流和过滤流。
节点流:负责数据源和程序之间建立连接; 过滤流:用于给节点增加功能。
过滤流的构造方式是以其他流位参数构造(这样的设计模式称为装饰模式)。
字节输入流:io包中的InputStream为所有字节输入流的父类。 Int read();读入一个字节(每次一个);
可先使用new byte[]=数组,调用read(byte[] b)
read (byte[])返回值可以表示有效数;read (byte[])返回值为-1表示结束。
字节输出流:io包中的OutputStream位所有字节输入流的父类。 Write和输入流中的read相对应。
在流中close()方法由程序员控制。因为输入输出流已经超越了VM的边界,所以有时可能无法回收资源。 原则:凡是跨出虚拟机边界的资源都要求程序员自己关闭,不要指望垃圾回收。 以Stream结尾的类都是字节流。
如果构造FileOutputStream的同时磁盘会建立一个文件。如果创建的文件与磁盘上已有的文件名重名,就会发生覆盖。
用FileOutputStream中的boolean,则视,添加情况,将数据覆盖重名文件还是将输入内容放在文件的后面。(编写程序验证)
DataOutputStream:输入数据的类型。
因为每中数据类型的不同,所以可能会输出错误。 所有对于:DataOutputStream DataInputStream
两者的输入顺序必须一致。 过滤流:
bufferedOutputStream bufferedInputStream
用于给节点流增加一个缓冲的功能。
在VM的内部建立一个缓冲区,数据先写入缓冲区,等到缓冲区的数据满了之后再一次性写出,效率很高。
使用带缓冲区的输入输出流的速度会大幅提高,缓冲区越大,效率越高。(这是典型的牺牲空间换时间) 切记:使用带缓冲区的流,如果数据数据输入完毕,使用flush方法将缓冲区中的内容一次性写入到外部数据源。用close()也可以达到相同的效果,因为每次close都会使用flush。一定要注意关闭外部的过滤流。
(非重点)管道流:也是一种节点流,用于给两个线程交换数据。 PipedOutputStream PipedInputStream
达内java学习笔记
27
输出流:connect(输入流)
RondomAccessFile类允许随机访问文件
GetFilepoint()可以知道文件中的指针位置,使用seek()定位。 Mode(“r”:随机读;”w”:随机写;”rw”:随机读写) 练习:写一个类A,JAVA A file1 file2
file1要求是系统中已经存在的文件。File2是还没有存在的文件。 执行完这个命令,那么file2就是file1中的内容。
字符流:reader\\write只能输纯文本文件。 FileReader类:字符文件的输出
字节流与字符流的区别: 字节流的字符编码:
字符编码把字符转换成数字存储到计算机中,按ASCii将字母映射为整数。 把数字从计算机转换成相应的字符的过程称为解码。 编码方式的分类:
ASCII(数字、英文):1个字符占一个字节(所有的编码集都兼容ASCII) ISO8859-1(欧洲):1个字符占一个字节 GB-2312/GBK:1个字符占两个字节
Unicode: 1个字符占两个字节(网络传输速度慢)
UTF-8:变长字节,对于英文一个字节,对于汉字两个或三个字节。
原则:保证编解码方式的统一,才能不至于出现错误。
Io包的InputStreamread称为从字节流到字符流的桥转换类。这个类可以设定字符转换方式。 OutputStreamred:字符到字节
Bufferread有readline()使得字符输入更加方便。 在I/O流中,所有输入方法都是阻塞方法。
Bufferwrite给输出字符加缓冲,因为它的方法很少,所以使用父类printwrite,它可以使用字节流对象,而且方法很多。
练习:做一个记事本
swing/JfileChoose: getSelect file()
InputStreeamReader:把字节变为字符
JAVA中对字符串长无限制 bufferedReader(ir)
12.09
class ObjectOutputStream也是过滤流,使节点流直接获得输出对象。 最有用的方法:WriteObject(Object b)
用流传输对象称为对象的序列化,但并不使所有的对象都可以进行序列化的。只有在实现类时必须实现一个接口:IO包下的Serializable(可序列化的)。此接口没有任何的方法,这样的接口称为标记接口。 Class Student implements Serializable
达内java学习笔记
28
把对象通过流序列化到某一个持久性介质称为对象的可持久化。 Hibernate就是研究对象的可持久化。
ObuectInputStream in =new ObjectInputStream; Object o1=in.readObuect(); Student s1=(Student)o1;
注意:因为o1是一个对象,因为需要对其进行保存。
Transient用来修饰属性。 Transient int num;
表示当我们对属性序列化时忽略这个属性(即忽略不使之持久化)。
所有属性必须都是可序列化的,特别是当有些属性本身也是对象的时候,要尤其注意这一点。 判断是否一个属性或对象可序列化:Serialver。 Serialver TestObject(TestObject必须为已经编译)
执行结果:如果不可序列化;则出现不可序列化的提示。如果可以序列化,那么就会出现序列化的ID:UID。
java.until.*有
StringTokenizer(参数1,参数2)按某种符号隔开文件 StringTokenizer(s,”:”) 用“:”隔开字符,s为对象。
练习:将一个类序列化到文件,然后读出。下午: 1、 网络基础知识 2、 JAVA网络编程
网络与分布式集群系统的区别:每个节点都是一台计算机,而不是各种计算机内部的功能设备。 Ip:具有全球唯一性,相对于internet,IP为逻辑地址。
端口(port):一台PC中可以有65536个端口,进程通过端口交换数据。连线的时候需要输入IP也需要输入端口信息。
计算机通信实际上的主机之间的进程通信,进程的通信就需要在端口进行联系。 192.168.0.23:21
协议:为了进行网络中的数据交换(通信)而建立的规则、标准或约定。 不同层的协议是不同的。
网络层:寻址、路由(指如何到达地址的过程) 传输层:端口连接
TCP模型:应用层/传输层/网络层/网络接口
端口是一种抽象的软件结构,与协议相关:TCP23端口和UDT23端口为两个不同的概念。 端口应该用1024以上的端口,以下的端口都已经设定功能。 套接字(socket)的引入:
Ip+Port=Socket(这是个对象的概念。)
Socket为传输层概念,而JSP是对应用层编程。例: java.net.*;
(Server端定义顺序) ServerSocket(intport)
Socket.accept();//阻塞方法,当客户端发出请求是就恢复 如果客户端收到请求: 则Socket SI=ss.accept();
注意客户端和服务器的Socket为两个不同的socket。 Socket的两个方法:
getInputStream():客户端用
达内java学习笔记
29
getOutputStream() 服务器端用
使用完毕后切记Socket.close(),两个Socket都关,而且不用关内部的流。 在client端,Socket s=new Socket(“127.0.0.1”,8000); 127.0.0.1为一个默认本机的地址。 练习:
1、 客户端向服务器发出一个字符串,服务器转换成大写传回客户端。 大写的函数:String.toUpperCase() 2、 服务器告诉客户端:“自开机以来你是第n 个用户”。
12.12
UDP编程:
DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流。 DatagramPacket(信件):数据包,是UDP下进行传输数据的单位,数据存放在字节数组中。 UDP也需要现有Server端,然后再有Client端。 两端都是DatagramPacket(相当于电话的概念),需要NEW两个DatagramPacket。 InetAddress:网址
这种信息传输方式相当于传真,信息打包,在接受端准备纸。 模式:
发送端:Server: DatagramPacket inDataPacket=new DatagramPacket ((msg,msg.length); InetAdress.getByName(ip),port); 接收端:
clientAddress=inDataPack.getAddress();//取得地址 clientPort=inDataPack.getPort();//取得端口号 datagramSocket.send; //Server datagramSocket.accept; //Client URL:在应用层的编程 注意比较:
http://Localhost:8080/directory //查找网络服务器的目录 file://directory //查找本地的文件系统 java的开发主要以http为基础。 反射:主要用于工具和框架的开发。
反射是对于类的再抽象;通过字符串来抽象类。 JAVA类的运行:classLoader:加载到虚拟机(vm) Vm中只能存储对象(动态运行时的概念),.class文件加载到VM上就成为一个对象,同时初始静态成员及静态代码(只执行一次)。
Lang包下有一个类为Class:在反射中使用。此类中的每个对象为VM中的类对象,每个类都对应类类的一个对象(class.class)。
例:对于一个Object类,用getClass()得到其类的对象,获得类的对象就相当于获得类的信息,可以调用其下的所有方法,包括类的私有方法。
注意:在反射中没有简单数据类型,所有的编译时类型都是对象。 反射把编译时应该解决的问题留到了运行时。
达内java学习笔记 30