Java高级
Java高级
集合框架和泛型
- 1. 定义
集合框架用于存储一组长度不定的元素。//解决java中数组长度为固定不能改变的不足。
- 2. 常用的接口和类
接口:Collection、List、Set、Map、Iterator
类:ArrayList、LinkedList、HashSet、HashMap
与数组对比的记忆,都需要实现 新增加一个对象,修改指定对象的值,删除一个指定对象的值,查询对象的值以及遍历整个数组。
- 3. 使用特点
List:存储的元素不唯一、有序。
Set:存储的元素唯一、无序。
Map:元素以键值对的方式进行存储。//存在映射索引的关系,其中key是set型,value是collection型。
- 4. ArrayList和LinkedList的区别
ArrayList:查找元素速度快,性能高;但是不适合频繁的对集合元素进行插入、修改、删除。
LinkedList:在频繁对集合元素进行插入、修改、删除时效率高,速度快;但是查找速度不如ArrayList。
//因为ArrarList里面是一排排的数据存放,删除一个后需要有一个重新排序的计算,而LinkedList 是链表,内部之间彼此连接,其删除后不需要重新排序,所以效率更高。
- 5. 集合常用方法:
² List:
add(Object obj)、remove(Object obj)、remove(int index)、size()、get(int index)、iterator()、clear()
//注意里面add,remove等方法的重写,使用的场合不一样。
² Set:
add(Object obj)、remove(Object obj)、size()、iterator()、clear()
² Map:
put(Object key, Object value)、get(Object key)、keySet()、values()、size()、remove(Object key) 、clear()
//Collections类中有个compareTo() 以及fill()方法。
泛型:定义什么类型,就使用的什么类型。先定义类型,再进行输入,输出操作。相当于实现了数组中的存放一组固定类型的目的,将之前的object转化为自己想要的类型。
实用类
- 1. 枚举
定义
一组固定的常量。
语法
访问修饰符 enum 枚举名{ 常量一, 常量二, … … } |
用法
声明枚举变量并赋值:Season season = Season.Spring;
switch:
switch(枚举变量){ // 枚举变量:枚举名 变量名 常量一: … … Break; 常量二: … … Break; } |
- 2. 包装类
值类型(基本数据类型)都存在一个对应的包装类。
int->Integer、double->Double、boolean->Boolean、char->Charactor、… …
值类型和包装类的相互转换
基本数据类型转换为包装类 |
包装类转换为基本数据类型 |
Double doub = new Double(); 包装类名 包装类对像名 = new包装类名(参数值); 参数可以是数值型,也可以是字符串型“”。即实现数据类型的转化,将“5.5”转换为double类型的方法。 所有类型转化为String都有.toString()方法。 |
Double Shu33 =new Double("50.5"); double a = Shu33.doubleValue(); 可以通过数值类型Value()将包装类转换为基本数值类型。 对于不同类型的返回一个数值类型的值,需要使用 parseDouble("66.5") 基本数据类型 变量名称 = 包装对象.parse(包装名)(字符串); |
拆箱和装箱
拆箱:将包装类转换为基本数值类型;
装箱:将数值类型转化为包装类。
- 3. Math类
Math类的作用
提供一系列与科学计算相关的方法。
常用方法:random()、floor()、ceil()、max()、min()、round()
//详细的使用方法可以参考javaAPI文档。记住需要实现数学运算的时候,用 Math.调用方法(其都为静态方法)。
Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
ceil(double a) 返回最小的(最接近负无穷大) |
floor(double a) 返回最大的(最接近正无穷大) |
random() 返回 |
- 4. String类
常用的方法:substring()、indexOf()、lastIndexOf()、replace、split、length()、trim()
//String 类是操作最多的类,其方法很多,需要参考javaAPI文档
|
concat(String str) 将指定字符串连接到此字符串的结尾。其与“+”用法类似。 |
contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true。判断是否包含 |
getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
split(String regex) 根据给定正则表达式的匹配拆分此字符串。其中“*,?,|,^”等需要转义\\ |
substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。截取字符串 |
trim() 返回字符串的副本,忽略前导空白和尾部空白。 |
|
indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 //其有几种重写的方法。 |
length() 返回此字符串的长度。 |
replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 //进行修改,也有一些重写的方法,可以加一些参数。 |
//当然还有一些方法,实际使用的时候需要查看API去,遇到问题先思考,再查找资料,做不出来就百度,然后就是请教其他人。
- 5. Random类
作用:生成随机数。 只要知道
常用方法:nextInt()、nextInt(int)、nextDouble()、nextXXX()
|
|
|
|
|
- 6. 日期时间类
² Date
在类 Date 所有可以接受或返回年、月、日期、小时、分钟和秒值的方法中,将使用下面的表示形式: 年份 y 由整数 y - 1900 表示,月份使用M由0~11的整数,日期使用d由1~31的整数,小时使用H由0~23的整数表示,分钟使用m由0~59的整数表示,秒使用s,由0~61的整数表示。
在所有情形中,针对这些目的赋予方法的参数不需要在指定的范围内;例如,可以把日期指定为 1 月 32 日,并把它解释为 2 月 1 日的相同含义。
语法:Date date = new Data();获取当前的时间。
|
compareTo(Date anotherDate) 比较两个日期的顺序。 |
² Calendar 为抽象类,通过静态方法getInstance
()
获得一个对象。
Calendar calendar = Calendar. getInstance
()
;
|
|
// |
|
² SimpleDateFormat
需要按照指定的格式输出的日期,才能让人看得懂,也能符合人们日常的生活习惯。
字母 |
日期或时间元素 |
表示 |
示例 |
G |
Era 标志符 |
AD |
|
y |
年 |
1996; 96 |
|
M |
年中的月份 |
July; Jul; 07 |
|
w |
年中的周数 |
27 |
|
W |
月份中的周数 |
2 |
|
D |
年中的天数 |
189 |
|
d |
月份中的天数 |
10 |
|
F |
月份中的星期 |
2 |
|
E |
星期中的天数 |
Tuesday; Tue |
|
a |
Am/pm 标记 |
PM |
|
H |
一天中的小时数(0-23) |
0 |
|
k |
一天中的小时数(1-24) |
24 |
|
K |
am/pm 中的小时数(0-11) |
0 |
|
h |
am/pm 中的小时数(1-12) |
12 |
|
m |
小时中的分钟数 |
30 |
|
s |
分钟中的秒数 |
55 |
|
S |
毫秒数 |
978 |
|
z |
时区 |
Pacific Standard Time; PST; GMT-08:00 |
|
Z |
时区 |
-0800 |
你需要输出不同的格式,就在建立的时候,输入不同的参数,一般就是yyyy-MM-dd HH:mm:ss
SimpleDateFormat formater = new SimpleDateFormat(“设置的时间输出格式”);
formater.format(“Date对象”);
format(Date date, StringBuffer toAppendTo, FieldPosition pos)
将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer。
输出输出
包:java.io
File类
功能:除了读写之外的其他对文件/文件夹的操作。
常用的方法:
构造方法:File(File parent, String child)/ File(String pathname) 通过路径创建对象 |
createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 |
|
createTempFile(String prefix, String suffix) 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 |
delete() 删除此抽象路径名表示的文件或目录。 |
exits() 测试此抽象路径名表示的文件或目录是否存在。 |
|
|
|
|
|
|
//还有一些其他的设置只读,隐藏等熟悉的方法,参考API。
- 1. 流的分类
² 根据方向分类:
输入:InputStream、Reader
输出:OutputStream、Writer
² 根据内容分类:
字节流:InputStream、OutputStream
字符流:Reader、Writer
实现类
(抽)InputStream |
(抽)OutputStream |
(抽)Reader |
(抽)Writer |
FileInputStream |
FileOutputStream |
InputStreamReader |
OutputStreamWriter |
DataInputStream |
DataOutputStream |
FileReader |
FileWriter |
ObjectInputStream |
ObjectOutputStream |
BufferedReader |
BufferedWriter |
序列化和反序列化
文件读写的一般操作思路:
1. 先通过File找到需要读写的对象,通过创建,或者指定的路径,创建一个File对象,路径指向需要读写的文件
2. 如果是读,就需要看文件是文本文件还是二进制文件
文本文件:先记住字节型,字符型的基础也是字节型。
InputStream input = new FileInputStream(file);
byte[] text = new byte[input. available ()];//创建读取接受的字节数组
input.read(text); //读取操作
input.close(); //然后关闭即可。
二进制文件:
InputStream input = new FileInputStream(file);
DataInputStream dinput =new DataInputStream(input);
/* 对于文件比较小的时候,可以使用此种方法
byte[] text = new byte[input. available ()]; //创建读取接受的字节数组
dinput.read(text); //读取操作
*/
byte[] text = new byte[1024]; //一般读取大的文件,需要分多次读取,就通过循环实现读取。
int count = dinput.read(text);
while( count != -1){
count = dinput.read(text,0,count);
}
input.close();
dinput.close(); //然后关闭即可。
序列化文件:
就是将DataInputStream 更换成ObjectDataInputStream,方法换成readObject()即可。
3. 如果是写,就需要看文件是文本文件还是二进制文件
文本文件:先记住字节型,字符型的基础也是字节型。
先得到一个byte的数组,一般有String里面getBytes()的方法。
OUTputStream output = new FileOutputStream(file);
String str=“********”;
byte[] text = Str.getBytes();//创建读取接受的字节数组
input.write (text); //读取操作
input.close(); //然后关闭即可。
二进制文件:
OutputStream outnput = new File OutputStream(file);
DataOutputStream doutput =new DataOutputStream (input);
//无论如何一定要先得到一个字节的数组,放到内存中 可以是边读边写,例如拷贝。
byte[] text =******;
doutput.write(text);
/* 对于文件比较小的时候,可以使用此种方法
byte[] text = new byte[input. available ()]; //创建读取接受的字节数组
dinput.read(text); //读取操作
*/
output.close();
doutput.close(); //然后关闭即可。
序列化文件:
就是将DataOutputStream 更换成ObjectDataOutputStream,方法换成writeObject()即可。
序列化和反序列化的对象必须使用Serializable 接口,否则读写的过程就报错。
4. 小结
读写操作是软件的基本功能之一,是后续XML技术的基础,对需要找到需要更改的对象,然后通过read或write的方法对文件进行修改,修改后再保存到本机磁盘。是实现动态存储信息持续化的基础。只要知道如何实现何种功能即可,具体的情况需要查看不同的帮助文件,实现最优。
多线程
- 1. 进程和线程的区别
进程:一个独立的运算程序;
线程:CPU计算的最小单元,就是一个独立计算的片段,其属于进程的一部分。
- 2. Java中使用线程的步骤
a.定义线程;b.启动线程;c.执行线程;d.关闭线程。
- 3. Java中定义线程的2中方式
(1)继承Thread类,实现其run方法 //extends Thread
(2)使用Runnable接口 // implements Runnable
在类中定义run的方法,也就是要执行的一些代码,通过类的对象,调用start()方法,就开始线程的执行,以及Thread.sleep()可以定义当前类主进行main()方法 休眠的时间。
系统默认会运行java中的mian()方法,mian方法里面就可以启动其他的线程,提高程序的运行效率。
- 4. 线程的优先级
通过setPriority(int grade);设置一个线程的优先级别,其值为1~10之间,10表示优先级别最高。
优先级别高,优先被执行的概率高。
- 5. 线程的生命周期
- 新生,被创建的时候;
- 可运行,start启动后;
- 阻塞,没有得到时间片的休眠状态
- 死亡,就是运行完毕,也或者是stop()方法被执行。一般自动运行完了就死亡了,不用刻意的管理。
- 6. 线程的同步
哪里需要争夺资源,就在哪个方法前面加上synchronized的关键字。为了防止同时修改一个内存地址的数据,出现意想不到的问题。
- 7. 线程常用方法
线程越多,程序运行的越快,但是主程序是由运行最慢的那个程序所花费的时间决定的,因此对于大的运算的数据或计算,为了提高效率,尽量将其拆分为多个线程同步运算,这样就提高程序等待的时间。
从客户体验的角度,程序开发做到以下三点,客户自然就会增加:
别让我等;别让我想;别让我烦。
所以多线程技术对于程序开发十分的重要,能够减少客户等待的时间,从而提高效率。
网络编程
- 1. IP地址
设计与查看 dos里面的ping & ipconfig/all command
IP的三类,A类1~126,B类128~191,C类192~223
地址是4个8位的二进制。值为0~255之间的数据。
- 2. C/S 的信息传输
先有服务器 Server :
通过SocketSrever 创建一个服务器对象,在构造方法的时候,加入端口值。
调用accept();实现监听。
再有客户Customer:
通过Socket创建一个客户对象,在构造方法的时候,输入服务器的ip地址,以及端口值。
传输文件同第三章的I/O操作一样,都是创建流,
然后通过 getInputStream()/getOutputStream() 实现输入与输出
- 3. UDP
UDP传输不可靠,但是比较适合一些广播,UDP的里面先打包,再通过send()/receive()方法传输数据。
XML操作
- 1. XML的基础信息
1.1定义以及作用:
用于数据存储以及数据交换或显示的一种可扩展标记语言(EXtensible Markup Language)。广泛用于数据库和程序之间数据的交换。XML 标签没有被预定义。您需要自行定义标签。
1.2 xml文档的组成
a.申明标记<?xml version=”1.0” encoding=”UTF-8”?>
b.标签元素
c.嵌套关系需要正确,不能越级必须一一对应。
d.元素的名称与之前类的名称的要求类似
e.特殊字符需要处理
1.3 DTD
为了规范xml文档,使其标准化,方便协调用以及后续数据数据为维护。
- 2. DOM对XML文件的操作
2.1 主要步骤
//得到document
建立解析器工程: DocumentBuilderFactory 静态方法: .newInstance();
建立解析器:DocumentBuilder 解析器工厂对象的方法: .newDocumentBuilder
解析得到document: 解析器对象的方法: .parse(“文件路径”);
调用document中的一些方法,就可以得到你所需要的内容。
//
2.2 主要方法
//获得根目录 getDocumentElement();
//获得标签的列表对象 getElementsByTagName(String name) 输入标签的值,区分大小写
//获得父对象 getParentNode();
//获得子对象 getChildNodes();
//获得兄弟对象 getgetNextSibling();/getPreviousSibling();
//获得文本内容 getTextContent();
//获得属性内容 getAttribute(String name)
//删除一个节点 Node remove()removeAttributeNode(Attr oldAttr); removeChild(Node oldChild)
//增加一个节点 appendChild(Node newChild)
//修改一个节点的属性 setAttribute(String name,String value)
removeAttribute(String name)
setAttributeNS(String namespaceURI, String qualifiedName, String value)
//记得保存 包括关闭其中的流。
DOM4J对XML文件的操作
DOM4J相当于java中DOM的外挂,第三方插件。步骤一样,但是方法简单很多,特别是Xpath的技术支持,极大的提高的索引效率。
//创建document文件
SAXReader reader = new SAXReader();
Document document = reader.read(url);
//使用Xpath技术筛选需要的元素对象,返回一个List列表
List list = document.selectNodes( "//foo/bar" );
遍历列表可以继续筛选
//创建添加对象
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );
Element author1 = root.addElement( "author" )
.addAttribute( "name", "James" )
.addAttribute( "location", "UK" )
.addText( "James Strachan" );
Element author2 = root.addElement( "author" )
.addAttribute( "name", "Bob" )
.addAttribute( "location", "US" )
.addText( "Bob McWhirter" );
//保存到本地文件中
FileWriter out = new FileWriter( "foo.xml" );
document.write( out );
//需要设定格式的时候,可以参考下面的代码
OutputFormat format = OutputFormat.createPrettyPrint();//构造方法的重写
writer = new XMLWriter( System.out, format );
writer.write( document );
Java高级
集合框架和泛型
- 1. 定义
集合框架用于存储一组长度不定的元素。//解决java中数组长度为固定不能改变的不足。
- 2. 常用的接口和类
接口:Collection、List、Set、Map、Iterator
类:ArrayList、LinkedList、HashSet、HashMap
与数组对比的记忆,都需要实现 新增加一个对象,修改指定对象的值,删除一个指定对象的值,查询对象的值以及遍历整个数组。
- 3. 使用特点
List:存储的元素不唯一、有序。
Set:存储的元素唯一、无序。
Map:元素以键值对的方式进行存储。//存在映射索引的关系,其中key是set型,value是collection型。
- 4. ArrayList和LinkedList的区别
ArrayList:查找元素速度快,性能高;但是不适合频繁的对集合元素进行插入、修改、删除。
LinkedList:在频繁对集合元素进行插入、修改、删除时效率高,速度快;但是查找速度不如ArrayList。
//因为ArrarList里面是一排排的数据存放,删除一个后需要有一个重新排序的计算,而LinkedList 是链表,内部之间彼此连接,其删除后不需要重新排序,所以效率更高。
- 5. 集合常用方法:
² List:
add(Object obj)、remove(Object obj)、remove(int index)、size()、get(int index)、iterator()、clear()
//注意里面add,remove等方法的重写,使用的场合不一样。
² Set:
add(Object obj)、remove(Object obj)、size()、iterator()、clear()
² Map:
put(Object key, Object value)、get(Object key)、keySet()、values()、size()、remove(Object key) 、clear()
//Collections类中有个compareTo() 以及fill()方法。
泛型:定义什么类型,就使用的什么类型。先定义类型,再进行输入,输出操作。相当于实现了数组中的存放一组固定类型的目的,将之前的object转化为自己想要的类型。
实用类
- 1. 枚举
定义
一组固定的常量。
语法
访问修饰符 enum 枚举名{ 常量一, 常量二, … … } |
用法
声明枚举变量并赋值:Season season = Season.Spring;
switch:
switch(枚举变量){ // 枚举变量:枚举名 变量名 常量一: … … Break; 常量二: … … Break; } |
- 2. 包装类
值类型(基本数据类型)都存在一个对应的包装类。
int->Integer、double->Double、boolean->Boolean、char->Charactor、… …
值类型和包装类的相互转换
基本数据类型转换为包装类 |
包装类转换为基本数据类型 |
Double doub = new Double(); 包装类名 包装类对像名 = new包装类名(参数值); 参数可以是数值型,也可以是字符串型“”。即实现数据类型的转化,将“5.5”转换为double类型的方法。 所有类型转化为String都有.toString()方法。 |
Double Shu33 =new Double("50.5"); double a = Shu33.doubleValue(); 可以通过数值类型Value()将包装类转换为基本数值类型。 对于不同类型的返回一个数值类型的值,需要使用 parseDouble("66.5") 基本数据类型 变量名称 = 包装对象.parse(包装名)(字符串); |
拆箱和装箱
拆箱:将包装类转换为基本数值类型;
装箱:将数值类型转化为包装类。
- 3. Math类
Math类的作用
提供一系列与科学计算相关的方法。
常用方法:random()、floor()、ceil()、max()、min()、round()
//详细的使用方法可以参考javaAPI文档。记住需要实现数学运算的时候,用 Math.调用方法(其都为静态方法)。
Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
ceil(double a) 返回最小的(最接近负无穷大) |
floor(double a) 返回最大的(最接近正无穷大) |
random() 返回 |
- 4. String类
常用的方法:substring()、indexOf()、lastIndexOf()、replace、split、length()、trim()
//String 类是操作最多的类,其方法很多,需要参考javaAPI文档
|
concat(String str) 将指定字符串连接到此字符串的结尾。其与“+”用法类似。 |
contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true。判断是否包含 |
getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
split(String regex) 根据给定正则表达式的匹配拆分此字符串。其中“*,?,|,^”等需要转义\\ |
substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。截取字符串 |
trim() 返回字符串的副本,忽略前导空白和尾部空白。 |
|
indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 //其有几种重写的方法。 |
length() 返回此字符串的长度。 |
replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 //进行修改,也有一些重写的方法,可以加一些参数。 |
//当然还有一些方法,实际使用的时候需要查看API去,遇到问题先思考,再查找资料,做不出来就百度,然后就是请教其他人。
- 5. Random类
作用:生成随机数。 只要知道
常用方法:nextInt()、nextInt(int)、nextDouble()、nextXXX()
|
|
|
|
|
- 6. 日期时间类
² Date
在类 Date 所有可以接受或返回年、月、日期、小时、分钟和秒值的方法中,将使用下面的表示形式: 年份 y 由整数 y - 1900 表示,月份使用M由0~11的整数,日期使用d由1~31的整数,小时使用H由0~23的整数表示,分钟使用m由0~59的整数表示,秒使用s,由0~61的整数表示。
在所有情形中,针对这些目的赋予方法的参数不需要在指定的范围内;例如,可以把日期指定为 1 月 32 日,并把它解释为 2 月 1 日的相同含义。
语法:Date date = new Data();获取当前的时间。
|
compareTo(Date anotherDate) 比较两个日期的顺序。 |
² Calendar 为抽象类,通过静态方法getInstance
()
获得一个对象。
Calendar calendar = Calendar. getInstance
()
;
|
|
// |
|
² SimpleDateFormat
需要按照指定的格式输出的日期,才能让人看得懂,也能符合人们日常的生活习惯。
字母 |
日期或时间元素 |
表示 |
示例 |
G |
Era 标志符 |
AD |
|
y |
年 |
1996; 96 |
|
M |
年中的月份 |
July; Jul; 07 |
|
w |
年中的周数 |
27 |
|
W |
月份中的周数 |
2 |
|
D |
年中的天数 |
189 |
|
d |
月份中的天数 |
10 |
|
F |
月份中的星期 |
2 |
|
E |
星期中的天数 |
Tuesday; Tue |
|
a |
Am/pm 标记 |
PM |
|
H |
一天中的小时数(0-23) |
0 |
|
k |
一天中的小时数(1-24) |
24 |
|
K |
am/pm 中的小时数(0-11) |
0 |
|
h |
am/pm 中的小时数(1-12) |
12 |
|
m |
小时中的分钟数 |
30 |
|
s |
分钟中的秒数 |
55 |
|
S |
毫秒数 |
978 |
|
z |
时区 |
Pacific Standard Time; PST; GMT-08:00 |
|
Z |
时区 |
-0800 |
你需要输出不同的格式,就在建立的时候,输入不同的参数,一般就是yyyy-MM-dd HH:mm:ss
SimpleDateFormat formater = new SimpleDateFormat(“设置的时间输出格式”);
formater.format(“Date对象”);
format(Date date, StringBuffer toAppendTo, FieldPosition pos)
将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer。
输出输出
包:java.io
File类
功能:除了读写之外的其他对文件/文件夹的操作。
常用的方法:
构造方法:File(File parent, String child)/ File(String pathname) 通过路径创建对象 |
createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 |
|
createTempFile(String prefix, String suffix) 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 |
delete() 删除此抽象路径名表示的文件或目录。 |
exits() 测试此抽象路径名表示的文件或目录是否存在。 |
|
|
|
|
|
|
//还有一些其他的设置只读,隐藏等熟悉的方法,参考API。
- 1. 流的分类
² 根据方向分类:
输入:InputStream、Reader
输出:OutputStream、Writer
² 根据内容分类:
字节流:InputStream、OutputStream
字符流:Reader、Writer
实现类
(抽)InputStream |
(抽)OutputStream |
(抽)Reader |
(抽)Writer |
FileInputStream |
FileOutputStream |
InputStreamReader |
OutputStreamWriter |
DataInputStream |
DataOutputStream |
FileReader |
FileWriter |
ObjectInputStream |
ObjectOutputStream |
BufferedReader |
BufferedWriter |
序列化和反序列化
文件读写的一般操作思路:
1. 先通过File找到需要读写的对象,通过创建,或者指定的路径,创建一个File对象,路径指向需要读写的文件
2. 如果是读,就需要看文件是文本文件还是二进制文件
文本文件:先记住字节型,字符型的基础也是字节型。
InputStream input = new FileInputStream(file);
byte[] text = new byte[input. available ()];//创建读取接受的字节数组
input.read(text); //读取操作
input.close(); //然后关闭即可。
二进制文件:
InputStream input = new FileInputStream(file);
DataInputStream dinput =new DataInputStream(input);
/* 对于文件比较小的时候,可以使用此种方法
byte[] text = new byte[input. available ()]; //创建读取接受的字节数组
dinput.read(text); //读取操作
*/
byte[] text = new byte[1024]; //一般读取大的文件,需要分多次读取,就通过循环实现读取。
int count = dinput.read(text);
while( count != -1){
count = dinput.read(text,0,count);
}
input.close();
dinput.close(); //然后关闭即可。
序列化文件:
就是将DataInputStream 更换成ObjectDataInputStream,方法换成readObject()即可。
3. 如果是写,就需要看文件是文本文件还是二进制文件
文本文件:先记住字节型,字符型的基础也是字节型。
先得到一个byte的数组,一般有String里面getBytes()的方法。
OUTputStream output = new FileOutputStream(file);
String str=“********”;
byte[] text = Str.getBytes();//创建读取接受的字节数组
input.write (text); //读取操作
input.close(); //然后关闭即可。
二进制文件:
OutputStream outnput = new File OutputStream(file);
DataOutputStream doutput =new DataOutputStream (input);
//无论如何一定要先得到一个字节的数组,放到内存中 可以是边读边写,例如拷贝。
byte[] text =******;
doutput.write(text);
/* 对于文件比较小的时候,可以使用此种方法
byte[] text = new byte[input. available ()]; //创建读取接受的字节数组
dinput.read(text); //读取操作
*/
output.close();
doutput.close(); //然后关闭即可。
序列化文件:
就是将DataOutputStream 更换成ObjectDataOutputStream,方法换成writeObject()即可。
序列化和反序列化的对象必须使用Serializable 接口,否则读写的过程就报错。
4. 小结
读写操作是软件的基本功能之一,是后续XML技术的基础,对需要找到需要更改的对象,然后通过read或write的方法对文件进行修改,修改后再保存到本机磁盘。是实现动态存储信息持续化的基础。只要知道如何实现何种功能即可,具体的情况需要查看不同的帮助文件,实现最优。
多线程
- 1. 进程和线程的区别
进程:一个独立的运算程序;
线程:CPU计算的最小单元,就是一个独立计算的片段,其属于进程的一部分。
- 2. Java中使用线程的步骤
a.定义线程;b.启动线程;c.执行线程;d.关闭线程。
- 3. Java中定义线程的2中方式
(1)继承Thread类,实现其run方法 //extends Thread
(2)使用Runnable接口 // implements Runnable
在类中定义run的方法,也就是要执行的一些代码,通过类的对象,调用start()方法,就开始线程的执行,以及Thread.sleep()可以定义当前类主进行main()方法 休眠的时间。
系统默认会运行java中的mian()方法,mian方法里面就可以启动其他的线程,提高程序的运行效率。
- 4. 线程的优先级
通过setPriority(int grade);设置一个线程的优先级别,其值为1~10之间,10表示优先级别最高。
优先级别高,优先被执行的概率高。
- 5. 线程的生命周期
- 新生,被创建的时候;
- 可运行,start启动后;
- 阻塞,没有得到时间片的休眠状态
- 死亡,就是运行完毕,也或者是stop()方法被执行。一般自动运行完了就死亡了,不用刻意的管理。
- 6. 线程的同步
哪里需要争夺资源,就在哪个方法前面加上synchronized的关键字。为了防止同时修改一个内存地址的数据,出现意想不到的问题。
- 7. 线程常用方法
线程越多,程序运行的越快,但是主程序是由运行最慢的那个程序所花费的时间决定的,因此对于大的运算的数据或计算,为了提高效率,尽量将其拆分为多个线程同步运算,这样就提高程序等待的时间。
从客户体验的角度,程序开发做到以下三点,客户自然就会增加:
别让我等;别让我想;别让我烦。
所以多线程技术对于程序开发十分的重要,能够减少客户等待的时间,从而提高效率。
网络编程
- 1. IP地址
设计与查看 dos里面的ping & ipconfig/all command
IP的三类,A类1~126,B类128~191,C类192~223
地址是4个8位的二进制。值为0~255之间的数据。
- 2. C/S 的信息传输
先有服务器 Server :
通过SocketSrever 创建一个服务器对象,在构造方法的时候,加入端口值。
调用accept();实现监听。
再有客户Customer:
通过Socket创建一个客户对象,在构造方法的时候,输入服务器的ip地址,以及端口值。
传输文件同第三章的I/O操作一样,都是创建流,
然后通过 getInputStream()/getOutputStream() 实现输入与输出
- 3. UDP
UDP传输不可靠,但是比较适合一些广播,UDP的里面先打包,再通过send()/receive()方法传输数据。
XML操作
- 1. XML的基础信息
1.1定义以及作用:
用于数据存储以及数据交换或显示的一种可扩展标记语言(EXtensible Markup Language)。广泛用于数据库和程序之间数据的交换。XML 标签没有被预定义。您需要自行定义标签。
1.2 xml文档的组成
a.申明标记<?xml version=”1.0” encoding=”UTF-8”?>
b.标签元素
c.嵌套关系需要正确,不能越级必须一一对应。
d.元素的名称与之前类的名称的要求类似
e.特殊字符需要处理
1.3 DTD
为了规范xml文档,使其标准化,方便协调用以及后续数据数据为维护。
- 2. DOM对XML文件的操作
2.1 主要步骤
//得到document
建立解析器工程: DocumentBuilderFactory 静态方法: .newInstance();
建立解析器:DocumentBuilder 解析器工厂对象的方法: .newDocumentBuilder
解析得到document: 解析器对象的方法: .parse(“文件路径”);
调用document中的一些方法,就可以得到你所需要的内容。
//
2.2 主要方法
//获得根目录 getDocumentElement();
//获得标签的列表对象 getElementsByTagName(String name) 输入标签的值,区分大小写
//获得父对象 getParentNode();
//获得子对象 getChildNodes();
//获得兄弟对象 getgetNextSibling();/getPreviousSibling();
//获得文本内容 getTextContent();
//获得属性内容 getAttribute(String name)
//删除一个节点 Node remove()removeAttributeNode(Attr oldAttr); removeChild(Node oldChild)
//增加一个节点 appendChild(Node newChild)
//修改一个节点的属性 setAttribute(String name,String value)
removeAttribute(String name)
setAttributeNS(String namespaceURI, String qualifiedName, String value)
//记得保存 包括关闭其中的流。
DOM4J对XML文件的操作
DOM4J相当于java中DOM的外挂,第三方插件。步骤一样,但是方法简单很多,特别是Xpath的技术支持,极大的提高的索引效率。
//创建document文件
SAXReader reader = new SAXReader();
Document document = reader.read(url);
//使用Xpath技术筛选需要的元素对象,返回一个List列表
List list = document.selectNodes( "//foo/bar" );
遍历列表可以继续筛选
//创建添加对象
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );
Element author1 = root.addElement( "author" )
.addAttribute( "name", "James" )
.addAttribute( "location", "UK" )
.addText( "James Strachan" );
Element author2 = root.addElement( "author" )
.addAttribute( "name", "Bob" )
.addAttribute( "location", "US" )
.addText( "Bob McWhirter" );
//保存到本地文件中
FileWriter out = new FileWriter( "foo.xml" );
document.write( out );
//需要设定格式的时候,可以参考下面的代码
OutputFormat format = OutputFormat.createPrettyPrint();//构造方法的重写
writer = new XMLWriter( System.out, format );
writer.write( document );