- 读取键盘输入 System.in 是InputStream对象,查看这个类的方法比如read();clode();关一次就没了别关。
文件切割和合并
切割:
一、按SIZE读文件,写一个个.part小文件
二、最后写一个Properties配置文件,表明原文件名和小文件个数
合并
一、到当前目录下,用过滤器读取.properties配置文件,找到小文件个数和原文件名
二、过滤出.part文件,用序列化读取流合并读取到内存,再从内存写入到相应目录中。
对象序列化(将对象有序排列存到硬盘上)ObjectOuputStream
好处:延长生命周期。以后不用直接新建对象实例,而是从文件中读取
注意:被序列化的对象必须实现Serializable接口,static静态数据不会序列化,transient瞬态数据不会序列化。
1、Serializable接口为每个类设计一个专门的UID标识,用于判断类和对象是否是同一个版本。如果读取时,标识值不对,那就会报异常。
2、非静态的特有数据不想被序列化,就使用transient修饰。
尽量使用显式声明UID,因为这样改变类的细节,UID不会动,是自己设置的值。
对象的反序列化 ObjectInputStream
用来读取文件中的对象实例。
RandomAccessFile 支持对随机访问文件的读写。
跟C的文件指针挺像,区别于其他流只能从头开始单读单写
特点:
1、该对象既能读,又能写
2、该对象内部维护了一个byte数组,并通过指针可以操作数组中的元素
3、可以通过getFilePointer方法获取指针的位置,可以通过seek方法设置指针的位置。
4、其实该对象就是将字节输入流和输出流进行了封装
5、该对象的源和目的只能是File文件,还要指定打开文件的模式:只读、读写等。
6、多线程同时对同一个文件进行读写用这个,比如线程1在0-199之间读写,线程2在200-399之间读写
PipeInputStream 从管道读取流 PipeOutputStream 向管道输出流
管道输入流可以读取到其他线程向管道输出流写入的数据。
用处:用在指定读哪块传来的数据,用管道流,适合多线程协同使用
DataInputStream 数据输出流 DataoutputStream 数据输出流 操作基本数据类型方便
同上,数据输入流可以读取其他向数据输出流写入的的数据。
操作不需要对象序列化的基本数据类型用这个流,需要对象序列化用Object流
ByteArrayOutputStream 字节数组流,源目的都是内存数组,但不是同一个数组
使用变长byte数组,并且关闭流无效。
其他还有String流,CharArray流
常见的编码表:
1、ASCII:美国标准信息交换码
2、ISO8859-1:拉丁码表,欧洲码表
3、GB2312:中国的中文编码表
4、GBK:中国的GB2312升级版
5、Unicode:国际标准码,融合多种文字
UTF-8:最多用三个字节来表示一个字符
编码和解码
字符串 --> 字节数组:编码
字节数组 --> 字符串:解码
简单编解码
1、编码:"xxx".getBytes("GBK");
2、解码:new String(buff, "GBK")
注意:有时候编码编对了,可以解出来。但是编错了,比如无法识别字节数组,可能会用?字符代替,这样就改变了编码,无法解出来了。
用例1:去掉乱码方法是,根据编码表特点,最右侧如果出现不正常的负数个数的字节,就去掉这几个就ok。比如GBK负数个数余2后为1不正常,去掉最后一个,UTF-8负数个数余3后为1和2不正常,去掉1个或2个。
图形用户界面
awt包
- Frame窗体
默认局部是边界布局(全部居中并拉伸)设成流式布局会正常 - Button组件
- WindowAdapter(); 全是实现完成的空方法,方便选择实现某个方法。
事件监听机制组成
*事件源(组件)
*事件(Event)
*监听器(Listener)
*事件处理(引发事件后处理方式)
常用手法:System.exit(0);关闭窗体
按钮添加鼠标事件监听器button.addMouseListener()
文本框添加键盘监听器tf.addKeyListener(new KeyAdapter())
事件取消 e.consume();
网络编程
端口号
端口号分为物理端口和逻辑端口,逻辑端口0-1024号保留或系统使用。
传输协议TCP和UDP
TCP传输控制协议的特点是:
1、建立连接
2、适合传输大量数据
3、通过三次握手完成连接,是可靠协议
4、必须建立连接,效率较低
UDP用户数据包协议的特点是:
1、将数据及源和目的封装成数据包,不需要连接
2、每个数据包大小限制在64k内
3、不可靠
4、速度快
举例:手机和对讲机可以用来解释这两个协议。
DNS域名解析服务器
可以设为公共服务器,也可以设成某台主机,在主机的hosts文件里找映射的ip。
hosts文件可以把想要屏蔽的域名映射为本机127.0.0.1
Socket套接字,网络服务端点
指的是数据在两个Socket间IO传输,Socket为网络服务提供一种机制。
Java用DatagramSocket类(记得关闭此资源),DatagramPacket类(凡带有IP地址的构造函数都是用来发送的)
JAVA上使用UDP传输
建立UDP接收端的思路。
1,建立udp socket服务,因为是要接收数据,必须要明确一个端口号。
2,创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据.
3,使用socket服务的receive方法将接收的数据存储到数据包中。
4,通过数据包的方法解析数据包中的数据。
5,关闭资源
创建UDP传输的发送端。
思路:
1,建立udp的socket服务。
2,将要发送的数据封装到数据包中。
3,通过udp的socket服务将数据包发送出去。
4,关闭socket服务。
JAVA上使用TCP传输
创建TCP传输的客户端
Socket; s.getOutputStream();
创建TCP传输的服务器
ServeSocket
Socket s = ss.acept(); s.getInputStream();s.getOutputStream();
TCP有阻塞式方法,容易发生两端都在等待情况。
服务器端和客户端原理
常见服务器:Tomcat。常见客户端:IE
自定义一个服务器,使用现有的IE作为客户端来了解他们的原理。
URL对象解析HTML上的信息 URL对象.openStream()读取解析后的数据
原理是URL中有URLConnection连接器对象底层具有解析协议的能力,底层是sun.net.www.protocol.http 它先查看应答头,发现是HTTP协议,就用前面这个底层来解析。
网络结构:
1, C/S client/server
----特点:
--------该结构的软件,客户端和服务端都需要编写
--------开发成本较高,维护较为麻烦
----好处:
--------客户端在本地可以分担一部分运算
2, B/S browser/server
----特点:
--------该结构的软件,只开发服务器端,不开发客户端,因为客户端直接由浏览器取代。
----缺点:
--------所有运算都在服务器完成
反射
JAVA反射机制概念
概念是在运行状态中,对于任意一个类(class文件),都能知道这个类的所有属性和方法;
这种动态获取的信息以及动态掉用对象的方法的功能称为JAVA语言的反射机制。
简单说就是:动态获取并调用类中的信息
可以理解为对类的解剖
应用场景:
某一个完整的软件需要扩展,可以用定义过的接口,实现这个接口来用,当源代码不在自己手上时,需要扩展掉用扩展的信息时候,会用到反射。
再如果想要对制定名称的字节码文件进行加载并获取其中的内容兵调用。这里用到的就是反射技术。
类似于TOMCAT:TOMCAT提供了处理请求和应答的方法,因为具体的处理动作不同,所以对外提供了借口,由开发者来实现具体请求和应答处理。这个接口就是servlet。用配置文件 web.xml来让TOMCAT动态获取需要提交的信息。
应用方式就是:写配置文件 + 接口
Tomcat提供了处理请求和应答的方式。因为具体的处理动作不同,所以对外提供了接口,由开发者来实现具体的请求和应答处理。
Tomcat可以写好了,不能修改源码,没有源码。要放在一个web.xml文件里,写上配置信息
反射技术好处:
1、大大提高了程序的扩展性
2、用户只需面对接口+配置文件即可,不必面对程序。
反射的细节和原理
JAVA中对class信息定义了一个Class类来描述,描述字节码文件。如下:
class Class {
提供字节码文件的内容,比如:
名称,
字段,
构造函数,
一般函数
}
该类就可以获取字节码文件中的所有内容
反射就是依靠该类完成的,该字节码文件对象。
如何获取字节码文件
方式一:
.getclass();
想用这种类,必须明确具体的类,并创建对象,比较麻烦!
方式二:
数据 类名.class来获取对应的class对象
相对简单,但还是要明确类中的静态成员,还是不够扩展!
方式三:
只要通过给定的字符串名称,就获取,更好作扩展。
用Class类中的静态方式就可以完成,Class.forName(str)
这样就可以把类写配置文件里去。
早期新建对象的方法
cn.itcast.bean.Person p = new cn.itcast.bean.Person();
创建过程如下:
一、根据被new的类的名称找该类的字节码文件,并加载进内存。创建改字节码文件对象,并接着创建改字节文件对应的Person对象。
现在新建对象的方法
String name = "cn.itcast.bean.Person";
一、找该名称的类文件,并加载进内存,并产生Class对象
Class clazz = Class.forName(name);
二、产生对象
Object obj = new clazz.newInstance();//都是以空参数创建对象。
如何用非空参数初始化对象:
Class.getConstructor(String.class, int.class);
返回值是public Constructor
所以用如下代码来实现:
Constructorm constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("小明", 38);
拿字段
Field field = clazz.getDeclaredField("age"); //可以拿包含私有的字段
field.setAccessible(true); //设置成不检查访问权限
field.set(obj, 89);
Object o = field.get(obj); //得到在obj中的age值。
拿方法
clazz.getMethods(); //获取公有方法,包括父类中的公有方法
clazz.getDeclaredMethods(); //只获取本类中的所有方法
Method method = clazz.getMethod("show", null); //获取无参数的show方法
Constructorm constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("小明", 38);
method.invoke(obj, null); //调用obj对象中的此方法,无传参
示例
主板使用PCI接口
因为不能修改源代码,所以使用xml配置文件传递PCI接口子类,来usePCI();
正则表达式
String类中有.matches(Str);来匹配给定的正则表达式str
注意:
字符串中转义字符\需要多写一次,字符串中必须要出现\ d两个字符,而不是\d一个字符,所以\要用\来转移
[a-d[m-p]]表示这一位上必须要有的字符。这叫做字符类
. \\d \\D 在这一位上是任何字符 数字 非数字
() 分组
正则表达式对字符串的常见操作:
1、匹配。---其实使用的就是String类中的matches方法。
2、切割。---起始使用的就是String类中的split方法
3、替换
4、获取
匹配
str.matches(reg); //true or false
切割
str.split(" +"); 按空格切,连续空格只切一次
替换
str.replaceAll("(.)\1+", "#");方法
正则中使用$1来已经有正则的分组内容
比如 str.replaceAll("(.)\1+", "$1") 把出现3次以上的字符换成只出现一次
获取
java.util.regx包里有正则表达式对象
叫做类Pattern
可以用pattern.compile生成匹配器对象Mather来获取匹配成功的字符串