Java高级

Java高级

集合框架和泛型

  1. 1.  定义

集合框架用于存储一组长度不定的元素。//解决java中数组长度为固定不能改变的不足。

  1. 2.  常用的接口和类

接口:Collection、List、Set、Map、Iterator

类:ArrayList、LinkedList、HashSet、HashMap

与数组对比的记忆,都需要实现 新增加一个对象,修改指定对象的值,删除一个指定对象的值,查询对象的值以及遍历整个数组。

  1. 3.  使用特点

List:存储的元素不唯一、有序。

Set:存储的元素唯一、无序。

Map:元素以键值对的方式进行存储。//存在映射索引的关系,其中key是set型,value是collection型。

  1. 4.  ArrayListLinkedList的区别

ArrayList:查找元素速度快,性能高;但是不适合频繁的对集合元素进行插入、修改、删除。

LinkedList:在频繁对集合元素进行插入、修改、删除时效率高,速度快;但是查找速度不如ArrayList。

//因为ArrarList里面是一排排的数据存放,删除一个后需要有一个重新排序的计算,而LinkedList 是链表,内部之间彼此连接,其删除后不需要重新排序,所以效率更高。

  1. 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. 1.  枚举

定义

一组固定的常量。

语法

访问修饰符   enum      枚举名{

      常量一,

      常量二,

      … …

}

用法

声明枚举变量并赋值:Season  season  =  Season.Spring;

switch:

switch(枚举变量){                               //   枚举变量:枚举名  变量名

常量一:

    … …

    Break;

常量二:

    … …

    Break;

}

 

  1. 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(包装名)(字符串);

拆箱和装箱

拆箱:将包装类转换为基本数值类型;

装箱:将数值类型转化为包装类。

  1. 3.  Math

Math类的作用

提供一系列与科学计算相关的方法。

常用方法:random()、floor()、ceil()、max()、min()、round()

//详细的使用方法可以参考javaAPI文档。记住需要实现数学运算的时候,用 Math.调用方法(其都为静态方法)。

Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

 ceil(double   a)       返回最小的(最接近负无穷大)double 值,该值大于等于参数,并等于某个整数。

floor(double a)       返回最大的(最接近正无穷大)double 值,该值小于等于参数,并等于某个整数。

random()         返回double 值,该值大于等于   0.0 且小于 1.0一般获取随机值使用Random类。

 

  1. 4.  String

常用的方法:substring()、indexOf()、lastIndexOf()、replace、split、length()、trim() 

//String 类是操作最多的类,其方法很多,需要参考javaAPI文档  

构造方法:String(byte[] bytes)          可以通过字节的数组生产字符串,其他的可以参考API。

concat(String   str)    将指定字符串连接到此字符串的结尾。其与“+”用法类似。

contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回   true。判断是否包含

getBytes()    使用平台的默认字符集将此   String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

split(String   regex)     根据给定正则表达式的匹配拆分此字符串。其中“*,?,|,^”等需要转义\\

substring(int   beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。截取字符串

trim()      返回字符串的副本,忽略前导空白和尾部空白。

lastIndexOf(int ch)       返回指定字符在此字符串中最后一次出现处的索引。 //其有几种重写的方法。

indexOf(int   ch)        返回指定字符在此字符串中第一次出现处的索引。  //其有几种重写的方法。

length()       返回此字符串的长度。

replace(char   oldChar, char newChar)      返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。       //进行修改,也有一些重写的方法,可以加一些参数。

//当然还有一些方法,实际使用的时候需要查看API去,遇到问题先思考,再查找资料,做不出来就百度,然后就是请教其他人。

  1. 5.  Random

作用:生成随机数。  只要知道

常用方法:nextInt()、nextInt(int)、nextDouble()、nextXXX()

next(int bits)           生成下一个伪随机数。 这个方法的修饰符是protected   外部不能使用。

nextInt(int n) 返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。

nextDouble()    返回下一个伪随机数,它是取自此随机数生成器序列的、在   0.0 和 1.0 之间均匀分布的 double 值。

nextLong()   返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的   long 值。

setSeed(long seed)    使用单个   long 种子设置此随机数生成器的种子。

 

  1. 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();获取当前的时间。

after(Date when)/before(Date when) 测试此日期是否在指定日期之后/之前。// 实现定时控制操作

compareTo(Date   anotherDate)           比较两个日期的顺序。

 

²  Calendar   为抽象类,通过静态方法getInstance() 获得一个对象。

Calendar calendar = Calendar. getInstance()

set(int field,   int value)             将给定的日历字段设置为给定值。

set(int year,   int month, int date)             设置日历字段 YEARMONTHDAY_OF_MONTH 的值。 // Set的方法重写,可以修改日期的年,月,日,小时,分钟,秒,时区等等操作

getTime()   返回一个表示此   Calendar 时间值(从历元至现在的毫秒偏移量)的   Date 对象

//可以创建一个Data对象

get(int field)           返回给定日历字段的值。

 

²  SimpleDateFormat

需要按照指定的格式输出的日期,才能让人看得懂,也能符合人们日常的生活习惯。

     

字母

日期或时间元素

表示

示例

G

Era 标志符

Text

AD

y

Year

1996; 96

M

年中的月份

Month

July; Jul; 07

w

年中的周数

Number

27

W

月份中的周数

Number

2

D

年中的天数

Number

189

d

月份中的天数

Number

10

F

月份中的星期

Number

2

E

星期中的天数

Text

Tuesday; Tue

a

Am/pm 标记

Text

PM

H

一天中的小时数(0-23)

Number

0

k

一天中的小时数(1-24)

Number

24

K

am/pm 中的小时数(0-11)

Number

0

h

am/pm 中的小时数(1-12)

Number

12

m

小时中的分钟数

Number

30

s

分钟中的秒数

Number

55

S

毫秒数

Number

978

z

时区

General   time zone

Pacific Standard Time; PST; GMT-08:00

Z

时区

RFC   822 time zone

-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()      当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。

mkdir()           创建此抽象路径名指定的目录。

createTempFile(String   prefix, String suffix)    在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。

delete()        删除此抽象路径名表示的文件或目录。

exits()           测试此抽象路径名表示的文件或目录是否存在。

getName()           返回由此抽象路径名表示的文件或目录的名称。

getParent()           返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null

isFile()           测试此抽象路径名表示的文件是否是一个标准文件。

isDirectory()           测试此抽象路径名表示的文件是否是一个目录。

list()          返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

length()           返回由此抽象路径名表示的文件的长度。

//还有一些其他的设置只读,隐藏等熟悉的方法,参考API。

  1. 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 FileInputStreamfile;

byte[] text = new byte[input. available ()];//创建读取接受的字节数组

input.read(text);    //读取操作

input.close();   //然后关闭即可。

二进制文件:

InputStream  input = new FileInputStreamfile;

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 FileOutputStreamfile;

String str=********;

byte[] text = Str.getBytes();//创建读取接受的字节数组

input.write (text);    //读取操作

input.close();   //然后关闭即可。

二进制文件:

OutputStream  outnput = new File OutputStreamfile;

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. 1.  进程和线程的区别

进程:一个独立的运算程序;

线程:CPU计算的最小单元,就是一个独立计算的片段,其属于进程的一部分。

  1. 2.  Java中使用线程的步骤

a.定义线程;b.启动线程;c.执行线程;d.关闭线程。

  1. 3.  Java中定义线程的2中方式

(1)继承Thread类,实现其run方法  //extends Thread

(2)使用Runnable接口     // implements Runnable

 在类中定义run的方法,也就是要执行的一些代码,通过类的对象,调用start()方法,就开始线程的执行,以及Thread.sleep()可以定义当前类主进行main()方法 休眠的时间。

  系统默认会运行java中的mian()方法,mian方法里面就可以启动其他的线程,提高程序的运行效率。

  1. 4.  线程的优先级

通过setPriority(int grade);设置一个线程的优先级别,其值为1~10之间,10表示优先级别最高。

优先级别高,优先被执行的概率高。

  1. 5.  线程的生命周期
    1. 新生,被创建的时候;
    2. 可运行,start启动后;
    3. 阻塞,没有得到时间片的休眠状态
    4. 死亡,就是运行完毕,也或者是stop()方法被执行。一般自动运行完了就死亡了,不用刻意的管理。
  2. 6.  线程的同步

哪里需要争夺资源,就在哪个方法前面加上synchronized的关键字。为了防止同时修改一个内存地址的数据,出现意想不到的问题。

  1. 7.  线程常用方法

线程越多,程序运行的越快,但是主程序是由运行最慢的那个程序所花费的时间决定的,因此对于大的运算的数据或计算,为了提高效率,尽量将其拆分为多个线程同步运算,这样就提高程序等待的时间。

从客户体验的角度,程序开发做到以下三点,客户自然就会增加:

别让我等;别让我想;别让我烦。

所以多线程技术对于程序开发十分的重要,能够减少客户等待的时间,从而提高效率。

网络编程

  1. 1.  IP地址

 设计与查看 dos里面的ping & ipconfig/all     command

IP的三类,A类1~126,B类128~191,C类192~223

地址是4个8位的二进制。值为0~255之间的数据。

  1. 2.  C/S 的信息传输

先有服务器 Server :

 通过SocketSrever  创建一个服务器对象,在构造方法的时候,加入端口值。

调用accept();实现监听。

再有客户Customer:

  通过Socket创建一个客户对象,在构造方法的时候,输入服务器的ip地址,以及端口值。

传输文件同第三章的I/O操作一样,都是创建流,

然后通过 getInputStream()/getOutputStream()  实现输入与输出

  1. 3.  UDP

UDP传输不可靠,但是比较适合一些广播,UDP的里面先打包,再通过send()/receive()方法传输数据。

XML操作

  1. 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文档,使其标准化,方便协调用以及后续数据数据为维护。

  1. 2.  DOMXML文件的操作

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)

//记得保存  包括关闭其中的流。

                DOM4JXML文件的操作

DOM4J相当于javaDOM的外挂,第三方插件。步骤一样,但是方法简单很多,特别是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. 1.  定义

集合框架用于存储一组长度不定的元素。//解决java中数组长度为固定不能改变的不足。

  1. 2.  常用的接口和类

接口:Collection、List、Set、Map、Iterator

类:ArrayList、LinkedList、HashSet、HashMap

与数组对比的记忆,都需要实现 新增加一个对象,修改指定对象的值,删除一个指定对象的值,查询对象的值以及遍历整个数组。

  1. 3.  使用特点

List:存储的元素不唯一、有序。

Set:存储的元素唯一、无序。

Map:元素以键值对的方式进行存储。//存在映射索引的关系,其中key是set型,value是collection型。

  1. 4.  ArrayListLinkedList的区别

ArrayList:查找元素速度快,性能高;但是不适合频繁的对集合元素进行插入、修改、删除。

LinkedList:在频繁对集合元素进行插入、修改、删除时效率高,速度快;但是查找速度不如ArrayList。

//因为ArrarList里面是一排排的数据存放,删除一个后需要有一个重新排序的计算,而LinkedList 是链表,内部之间彼此连接,其删除后不需要重新排序,所以效率更高。

  1. 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. 1.  枚举

定义

一组固定的常量。

语法

访问修饰符   enum      枚举名{

      常量一,

      常量二,

      … …

}

用法

声明枚举变量并赋值:Season  season  =  Season.Spring;

switch:

switch(枚举变量){                               //   枚举变量:枚举名  变量名

常量一:

    … …

    Break;

常量二:

    … …

    Break;

}

 

  1. 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(包装名)(字符串);

拆箱和装箱

拆箱:将包装类转换为基本数值类型;

装箱:将数值类型转化为包装类。

  1. 3.  Math

Math类的作用

提供一系列与科学计算相关的方法。

常用方法:random()、floor()、ceil()、max()、min()、round()

//详细的使用方法可以参考javaAPI文档。记住需要实现数学运算的时候,用 Math.调用方法(其都为静态方法)。

Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

 ceil(double   a)       返回最小的(最接近负无穷大)double 值,该值大于等于参数,并等于某个整数。

floor(double a)       返回最大的(最接近正无穷大)double 值,该值小于等于参数,并等于某个整数。

random()         返回double 值,该值大于等于   0.0 且小于 1.0一般获取随机值使用Random类。

 

  1. 4.  String

常用的方法:substring()、indexOf()、lastIndexOf()、replace、split、length()、trim() 

//String 类是操作最多的类,其方法很多,需要参考javaAPI文档  

构造方法:String(byte[] bytes)          可以通过字节的数组生产字符串,其他的可以参考API。

concat(String   str)    将指定字符串连接到此字符串的结尾。其与“+”用法类似。

contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回   true。判断是否包含

getBytes()    使用平台的默认字符集将此   String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

split(String   regex)     根据给定正则表达式的匹配拆分此字符串。其中“*,?,|,^”等需要转义\\

substring(int   beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。截取字符串

trim()      返回字符串的副本,忽略前导空白和尾部空白。

lastIndexOf(int ch)       返回指定字符在此字符串中最后一次出现处的索引。 //其有几种重写的方法。

indexOf(int   ch)        返回指定字符在此字符串中第一次出现处的索引。  //其有几种重写的方法。

length()       返回此字符串的长度。

replace(char   oldChar, char newChar)      返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。       //进行修改,也有一些重写的方法,可以加一些参数。

//当然还有一些方法,实际使用的时候需要查看API去,遇到问题先思考,再查找资料,做不出来就百度,然后就是请教其他人。

  1. 5.  Random

作用:生成随机数。  只要知道

常用方法:nextInt()、nextInt(int)、nextDouble()、nextXXX()

next(int bits)           生成下一个伪随机数。 这个方法的修饰符是protected   外部不能使用。

nextInt(int n) 返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。

nextDouble()    返回下一个伪随机数,它是取自此随机数生成器序列的、在   0.0 和 1.0 之间均匀分布的 double 值。

nextLong()   返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的   long 值。

setSeed(long seed)    使用单个   long 种子设置此随机数生成器的种子。

 

  1. 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();获取当前的时间。

after(Date when)/before(Date when) 测试此日期是否在指定日期之后/之前。// 实现定时控制操作

compareTo(Date   anotherDate)           比较两个日期的顺序。

 

²  Calendar   为抽象类,通过静态方法getInstance() 获得一个对象。

Calendar calendar = Calendar. getInstance()

set(int field,   int value)             将给定的日历字段设置为给定值。

set(int year,   int month, int date)             设置日历字段 YEARMONTHDAY_OF_MONTH 的值。 // Set的方法重写,可以修改日期的年,月,日,小时,分钟,秒,时区等等操作

getTime()   返回一个表示此   Calendar 时间值(从历元至现在的毫秒偏移量)的   Date 对象

//可以创建一个Data对象

get(int field)           返回给定日历字段的值。

 

²  SimpleDateFormat

需要按照指定的格式输出的日期,才能让人看得懂,也能符合人们日常的生活习惯。

     

字母

日期或时间元素

表示

示例

G

Era 标志符

Text

AD

y

Year

1996; 96

M

年中的月份

Month

July; Jul; 07

w

年中的周数

Number

27

W

月份中的周数

Number

2

D

年中的天数

Number

189

d

月份中的天数

Number

10

F

月份中的星期

Number

2

E

星期中的天数

Text

Tuesday; Tue

a

Am/pm 标记

Text

PM

H

一天中的小时数(0-23)

Number

0

k

一天中的小时数(1-24)

Number

24

K

am/pm 中的小时数(0-11)

Number

0

h

am/pm 中的小时数(1-12)

Number

12

m

小时中的分钟数

Number

30

s

分钟中的秒数

Number

55

S

毫秒数

Number

978

z

时区

General   time zone

Pacific Standard Time; PST; GMT-08:00

Z

时区

RFC   822 time zone

-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()      当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。

mkdir()           创建此抽象路径名指定的目录。

createTempFile(String   prefix, String suffix)    在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。

delete()        删除此抽象路径名表示的文件或目录。

exits()           测试此抽象路径名表示的文件或目录是否存在。

getName()           返回由此抽象路径名表示的文件或目录的名称。

getParent()           返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null

isFile()           测试此抽象路径名表示的文件是否是一个标准文件。

isDirectory()           测试此抽象路径名表示的文件是否是一个目录。

list()          返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

length()           返回由此抽象路径名表示的文件的长度。

//还有一些其他的设置只读,隐藏等熟悉的方法,参考API。

  1. 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 FileInputStreamfile;

byte[] text = new byte[input. available ()];//创建读取接受的字节数组

input.read(text);    //读取操作

input.close();   //然后关闭即可。

二进制文件:

InputStream  input = new FileInputStreamfile;

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 FileOutputStreamfile;

String str=********;

byte[] text = Str.getBytes();//创建读取接受的字节数组

input.write (text);    //读取操作

input.close();   //然后关闭即可。

二进制文件:

OutputStream  outnput = new File OutputStreamfile;

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. 1.  进程和线程的区别

进程:一个独立的运算程序;

线程:CPU计算的最小单元,就是一个独立计算的片段,其属于进程的一部分。

  1. 2.  Java中使用线程的步骤

a.定义线程;b.启动线程;c.执行线程;d.关闭线程。

  1. 3.  Java中定义线程的2中方式

(1)继承Thread类,实现其run方法  //extends Thread

(2)使用Runnable接口     // implements Runnable

 在类中定义run的方法,也就是要执行的一些代码,通过类的对象,调用start()方法,就开始线程的执行,以及Thread.sleep()可以定义当前类主进行main()方法 休眠的时间。

  系统默认会运行java中的mian()方法,mian方法里面就可以启动其他的线程,提高程序的运行效率。

  1. 4.  线程的优先级

通过setPriority(int grade);设置一个线程的优先级别,其值为1~10之间,10表示优先级别最高。

优先级别高,优先被执行的概率高。

  1. 5.  线程的生命周期
    1. 新生,被创建的时候;
    2. 可运行,start启动后;
    3. 阻塞,没有得到时间片的休眠状态
    4. 死亡,就是运行完毕,也或者是stop()方法被执行。一般自动运行完了就死亡了,不用刻意的管理。
  2. 6.  线程的同步

哪里需要争夺资源,就在哪个方法前面加上synchronized的关键字。为了防止同时修改一个内存地址的数据,出现意想不到的问题。

  1. 7.  线程常用方法

线程越多,程序运行的越快,但是主程序是由运行最慢的那个程序所花费的时间决定的,因此对于大的运算的数据或计算,为了提高效率,尽量将其拆分为多个线程同步运算,这样就提高程序等待的时间。

从客户体验的角度,程序开发做到以下三点,客户自然就会增加:

别让我等;别让我想;别让我烦。

所以多线程技术对于程序开发十分的重要,能够减少客户等待的时间,从而提高效率。

网络编程

  1. 1.  IP地址

 设计与查看 dos里面的ping & ipconfig/all     command

IP的三类,A类1~126,B类128~191,C类192~223

地址是4个8位的二进制。值为0~255之间的数据。

  1. 2.  C/S 的信息传输

先有服务器 Server :

 通过SocketSrever  创建一个服务器对象,在构造方法的时候,加入端口值。

调用accept();实现监听。

再有客户Customer:

  通过Socket创建一个客户对象,在构造方法的时候,输入服务器的ip地址,以及端口值。

传输文件同第三章的I/O操作一样,都是创建流,

然后通过 getInputStream()/getOutputStream()  实现输入与输出

  1. 3.  UDP

UDP传输不可靠,但是比较适合一些广播,UDP的里面先打包,再通过send()/receive()方法传输数据。

XML操作

  1. 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文档,使其标准化,方便协调用以及后续数据数据为维护。

  1. 2.  DOMXML文件的操作

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)

//记得保存  包括关闭其中的流。

                DOM4JXML文件的操作

DOM4J相当于javaDOM的外挂,第三方插件。步骤一样,但是方法简单很多,特别是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 );

 

posted @ 2015-12-11 23:26  胡洋  阅读(362)  评论(0编辑  收藏  举报