io
==========
java.io.File 重点
==================
表示文件或者文件夹
1, 创建
File f1 = new File("c:/a.txt");
File f2 = new File("c:/windows");
File f3 = new File(f2, "notepad.exe");
2, 方法
文件或目录属性
-------------------
length() - 文件字节数,目录字节数返回0
isFile() - 判断是否表示文件
isDirectory() - 判断是否表示目录
lastModified() - 最后修改时间
getName() - 文件名
getPath() - 文件路径
getParent() - 父目录File对象
exists() - 文件或目录是否存在
canRead() canWrite() canExecute() - 是否具有读写执行权限
文件或目录操作
--------------------
createNewFile() - 创建文件, 返回是否成创建文件
mkdir() - 创建单层目录,返回是否成创建文件
mkdirs() - 创建多层目录,返回是否成创建文件
delete() - 删除文件,删除空目录,返回是否成删除
renameTo(File) - 改名
目录列表
--------------------
list()
listFiles() - 子目录和子文件的列表, 返回File[]
list(FileNameFilter) - 使用给定过滤器过滤文件
listFiles(FileNameFilter)
listFiles(FileFilter)
回调模式 - 其他方法的代码中反过来调用自己的代码
java.io.FileFilter 接口
java.io.FileNameFilter 接口
-----------------------
文件过滤器
accept(File) - 参数文件是否符合过滤条件
java.io.RandomAccessFile 次重点
============================
read() - 返回指针指向的字节,指针后移一位
返回int类型,范围0-255或-1
返回-1表示没有数据
readInt() - 从指针位置读4个字节作为int返回,
如果不足4个字节会出现异常 EOFException
readByte() readChar() readShort() readLong() readFloat() readDouble() readBoolean()
readUTF() - 读出字符串
write(int) - 将一个字节写入到当前指针位置,指针后移一位
writeInt(int) - int的四个字节写出去
writeUTF(String) - 字符串编码为UTF-8编码写出
seek(位置) - 将指针移动到给定位置
getFilePointer()
用处
----------------
1, 处理固定格式的文件
2, 处理大型文件
处理 BMP 文件
----------------
1,前54字节是BMP头,包含文件大小
2,宽度从18字节开始到21字节
高度从22字节开始到25字节
3,54字节之后是像素颜色数据 RGB
每个像素3字节
4,像素从左到有从上倒下排列
5,每个扫描行字节量必须是4的倍数
6,宽度、高度、RGB色是低字节序排列
io
================
InputStream
FileInputStream
ByteArrayInputStream
BufferedInputStream
DataInputStream
PrintStream
OutputStream
...
========================
InputStream
OutputStream
========================
1, 抽象类
2, 读写方法
---------------
read() - 读取一个字节,返回int类型
如果返回-1,表示读取结束
read(byte[]) - 一次读取多个字节放入数组
返回int类型,表示读取的字节数量
如果返回-1,表示读取结束
write(int) - 写一个字节
write(byte[])
write(byte[],起始位置,字节数)
FileInputStream
FileOutputStream
======================
文件读写
ByteArrayInputStream
ByteArrayOuputStream
======================
内存字节数组的读写
BufferedInputStream
BufferedOutputStream
======================
为其它流提供内存缓冲以提高读写效率
当io效率差时,可考虑接入BufferedIO
默认缓冲区大小是8k字节
可通过构造方法指定缓冲区大小
flush() - 手动刷出输出流中缓冲的数据
DataInputStream
DataOutputStream
======================
以字节方式读写基本数据
如果读写的数据具有固定的字节格式,可选用DataIO
readInt() - 读4个字节
readUTF() - 读字符串
writeInt(888888) - 写4个字节
writeUTF("abc") - 写字符串
PrintStream
=======================
打印流
将任何数据变成字符数据输出
输出文本数据可选用 PrintStream
print()
println()
io
==================
字符集
======================
Reader
Writer
======================
read() - 返回int类型,表示一个char
返回-1表示没有数据
read(char[]) - 读出多个字符放入数组,返回int表示字符个数
返回-1表示没有数据
write(int) - 将后两个字节按字符集编码后写出
write(char[])
write(char[],起始位置,字符个数)
write(String)
InputStreamReader
OutputStreamWriter
======================
转换流
将从字节流中读取的字节按指定编码或默认编码转换为字符
FileReader
FileWriter
======================
内部是InputStreamReader接FileInputStream
OutputStreamWriter接FileOutputStream
使用默认编码
BufferedReader
BufferedWriter
======================
BufferedReader 的 readLine()
读取正行数据,不包含末尾换行符
PrintWriter
======================
任何类型数据转为字符输出
print()
println()
对象序列化
ObjectOutputStream
ObjectInputStream
======================
1,序列化的对象必须实现Serializable接口
2,writeObject(Object) 序列化对象
3,readObject() 反序列化对象
4,static 和 transient 成员不序列化
5,对象中成员类型也必须是可序列化的
线程
========================
1, 实现线程两种方式
a,继承Thread
b,实现Runnable接口
2, 线程的静态方法
---------------------
Thread.sleep(毫秒值) - 当前线程暂停给定毫秒
Thread.currentThread() - 获得当前线程对象
Thread.yield() - 暂停执行,切换到其他线程执行
3, 线程的非静态方法
---------------------
setId()
getId()
setName()
getName()
setPriority(int) - 优先级设置,1-10,默认5
getPriority()
setDaemon(boolean) - 后台线程
isDaemon()
java虚拟机等待所有的前台线程消亡,自动退出
即使还有后台线程没有执行完,虚拟机也会自动退出
join() - 将一个线程加入到当前线程中
4, 什么时候使用线程
-------------------------
1,多个并行子任务提高程序效率
2,阻塞的操作,必须在一个线程内执行
3,后台执行的重复任务
线程
==================
多线程共享数据,线程的同步
synchronized (重点)
----------------------------------
1,同步锁
每个对象上都有一个同步锁
一个线程执行 synchronized 块时,
需要获得同步锁才能执行
等执行完会归还锁
2,synchronized 非静态方法
要获得当前实例的同步锁
3,synchronized 静态方法
要获得类对象的同步锁
4,synchronized 块
synchronized(对象) {
......
}
要获得小括号中对象的同步锁
可以选择以下对象:
a, this
b, 类对象
c, 非静态成员 Object lock = new Object()
d, 静态成员 static Object lock = new Object()
e, 正在修改或访问的对象
5,线程安全效率很差
线程不安全 - 线程安全
jdk1.2 - jdk1.0
ArrayList - Vector
HashMap - HashTable
StringBuilder - StringBuffer
6,获得线程安全的集合
syncList = Collections.synchronizedList(List);
syncMap = Collections.synchronizedMap(Map);
syncSet = Collections.synchronizedSet(Set);
等待通知机制 (非重点)
==================
1,wait 和 notifyAll 必须在synchronized代码块内调用
2,wait 会释放锁 (sleep不会释放锁)
3,wait 总应该在一个循环检查内调用(旋锁)
4,notify 方法只通知一个等待的线程
notifyAll 方法通知所有等待的线程
多数情况下应该使用notifyAll方法
5,等待通知机制可以看作是线程之间通信的机制
一个线程运算产生结果后通知另一个线程使用该数据
Timer
TimerTask
----------------------------------
1,执行重复任务
2,TimerTask - 执行的任务
3,Timer - 计时重复调用任务
schedule(TimerTask, Date)
在给定时间点执行一次指定任务
schedule(TimerTask, Date, long)
在给定时间点第一次执行, 间隔一定毫秒后重复执行
schedule(TimerTask, long, long)
间隔一定毫秒后执行第一次, 间隔一定毫秒后重复执行
scheduleAtFixedRate(TimerTask, Date, long)
固定频率执行
ThreadLocal
----------------------------------
线程安全的数据传递方式
在线程上绑定数据,
在线程执行到其他方法是从线程绑定取出数据
set(Object)
get()
remove()
Executors - 用于创建线程池
----------------------------------
执行大量任务时使用线程池避免创建过多线程
newCachedThreadPool()
创建一个可根据需要创建新线程的线程池
newFixedThreadPool()
创建一个可重用固定线程数的线程池
ExecutorService - 线程池
----------------------------------
execute(Runnable)
使用线程池中的线程执行任务
反射
=============
java.lang.Class
------------------------
0,获取类对象
实例.getClass()
类.class
Class.forName(类名字符串)
1,
包含类的信息(类名、属性、方法、构造方法)
2,
以下三个方法获取的是有访问权限的成员
包含继承的成员
c.getConstructors() - 获取构造方法
c.getFields() - 获取属性
c.getMethods() - 获取方法
3,
以下三个方法获取的是该类中定义的所有成员
不包含继承的成员
getDeclaredConstructors()
getDeclaredFields()
getDeclaredMethods()
通过反射创建实例
---------------------------------
Class.newInstance()
无参构造方法创建实例
Constructor.newInstance(Object[])
有参构造方法创建实例
通过反射调用成员
---------------------------------
返回值 = Method.invoke(对象, 参数数组)
Field.set(对象,值) - 给对象的成员变量赋值
Field.get(对象) - 获取对象的变量值
反射调用私有成员
setAccessable(true) - 将私有成员设为可访问
反射的作用:动态编程
---------------------------------
java.lang.reflect.Field
java.lang.reflect.Method
java.lang.reflect.Constructor
注解
=============
为其他工具、程序提供关于类、方法、属性的更多信息
自定义注解
-------------------------
@interface 关键字声明标注
@Target标注规定自定义标注的标注范围(类、方法、属性)
@Retention标注规定自定义标注的保留范围(源文件、字节码文件、内存)
@Target(ElementType.METHOD) //该标注只能应用于方法
@Retention(RetentionPolicy.RUNTIME) //在运行期保留
public @interface Test {
int id(); // 标注的属性
String description();
}
使用标注
---------------------------
class A {
@Test(id=12, description="测试12")
public void a() {......}
}
反射提取标注
---------------------------
T t = Method.getAnnotation(Test.class);
int id = t.id();
String desc = t.description();
java.net
======================
Socket 网络套接字
---------------------------------
ip地址 + 端口
java.net.ServerSocket
---------------------------------
构造方法指定端口号
accept() - 接受客户端连接请求并建立一个Socket通道
java.net.Socket
---------------------------------
Socket s = new Socket(ip,端口);
s.getInputStream()
s.getOutputStream()
java.net.URL
java.net.URLEncoder
java.net.URLDecoder
==========
java.io.File 重点
==================
表示文件或者文件夹
1, 创建
File f1 = new File("c:/a.txt");
File f2 = new File("c:/windows");
File f3 = new File(f2, "notepad.exe");
2, 方法
文件或目录属性
-------------------
length() - 文件字节数,目录字节数返回0
isFile() - 判断是否表示文件
isDirectory() - 判断是否表示目录
lastModified() - 最后修改时间
getName() - 文件名
getPath() - 文件路径
getParent() - 父目录File对象
exists() - 文件或目录是否存在
canRead() canWrite() canExecute() - 是否具有读写执行权限
文件或目录操作
--------------------
createNewFile() - 创建文件, 返回是否成创建文件
mkdir() - 创建单层目录,返回是否成创建文件
mkdirs() - 创建多层目录,返回是否成创建文件
delete() - 删除文件,删除空目录,返回是否成删除
renameTo(File) - 改名
目录列表
--------------------
list()
listFiles() - 子目录和子文件的列表, 返回File[]
list(FileNameFilter) - 使用给定过滤器过滤文件
listFiles(FileNameFilter)
listFiles(FileFilter)
回调模式 - 其他方法的代码中反过来调用自己的代码
java.io.FileFilter 接口
java.io.FileNameFilter 接口
-----------------------
文件过滤器
accept(File) - 参数文件是否符合过滤条件
java.io.RandomAccessFile 次重点
============================
read() - 返回指针指向的字节,指针后移一位
返回int类型,范围0-255或-1
返回-1表示没有数据
readInt() - 从指针位置读4个字节作为int返回,
如果不足4个字节会出现异常 EOFException
readByte() readChar() readShort() readLong() readFloat() readDouble() readBoolean()
readUTF() - 读出字符串
write(int) - 将一个字节写入到当前指针位置,指针后移一位
writeInt(int) - int的四个字节写出去
writeUTF(String) - 字符串编码为UTF-8编码写出
seek(位置) - 将指针移动到给定位置
getFilePointer()
用处
----------------
1, 处理固定格式的文件
2, 处理大型文件
处理 BMP 文件
----------------
1,前54字节是BMP头,包含文件大小
2,宽度从18字节开始到21字节
高度从22字节开始到25字节
3,54字节之后是像素颜色数据 RGB
每个像素3字节
4,像素从左到有从上倒下排列
5,每个扫描行字节量必须是4的倍数
6,宽度、高度、RGB色是低字节序排列
io
================
InputStream
FileInputStream
ByteArrayInputStream
BufferedInputStream
DataInputStream
PrintStream
OutputStream
...
========================
InputStream
OutputStream
========================
1, 抽象类
2, 读写方法
---------------
read() - 读取一个字节,返回int类型
如果返回-1,表示读取结束
read(byte[]) - 一次读取多个字节放入数组
返回int类型,表示读取的字节数量
如果返回-1,表示读取结束
write(int) - 写一个字节
write(byte[])
write(byte[],起始位置,字节数)
FileInputStream
FileOutputStream
======================
文件读写
ByteArrayInputStream
ByteArrayOuputStream
======================
内存字节数组的读写
BufferedInputStream
BufferedOutputStream
======================
为其它流提供内存缓冲以提高读写效率
当io效率差时,可考虑接入BufferedIO
默认缓冲区大小是8k字节
可通过构造方法指定缓冲区大小
flush() - 手动刷出输出流中缓冲的数据
DataInputStream
DataOutputStream
======================
以字节方式读写基本数据
如果读写的数据具有固定的字节格式,可选用DataIO
readInt() - 读4个字节
readUTF() - 读字符串
writeInt(888888) - 写4个字节
writeUTF("abc") - 写字符串
PrintStream
=======================
打印流
将任何数据变成字符数据输出
输出文本数据可选用 PrintStream
print()
println()
io
==================
字符集
======================
Reader
Writer
======================
read() - 返回int类型,表示一个char
返回-1表示没有数据
read(char[]) - 读出多个字符放入数组,返回int表示字符个数
返回-1表示没有数据
write(int) - 将后两个字节按字符集编码后写出
write(char[])
write(char[],起始位置,字符个数)
write(String)
InputStreamReader
OutputStreamWriter
======================
转换流
将从字节流中读取的字节按指定编码或默认编码转换为字符
FileReader
FileWriter
======================
内部是InputStreamReader接FileInputStream
OutputStreamWriter接FileOutputStream
使用默认编码
BufferedReader
BufferedWriter
======================
BufferedReader 的 readLine()
读取正行数据,不包含末尾换行符
PrintWriter
======================
任何类型数据转为字符输出
print()
println()
对象序列化
ObjectOutputStream
ObjectInputStream
======================
1,序列化的对象必须实现Serializable接口
2,writeObject(Object) 序列化对象
3,readObject() 反序列化对象
4,static 和 transient 成员不序列化
5,对象中成员类型也必须是可序列化的
线程
========================
1, 实现线程两种方式
a,继承Thread
b,实现Runnable接口
2, 线程的静态方法
---------------------
Thread.sleep(毫秒值) - 当前线程暂停给定毫秒
Thread.currentThread() - 获得当前线程对象
Thread.yield() - 暂停执行,切换到其他线程执行
3, 线程的非静态方法
---------------------
setId()
getId()
setName()
getName()
setPriority(int) - 优先级设置,1-10,默认5
getPriority()
setDaemon(boolean) - 后台线程
isDaemon()
java虚拟机等待所有的前台线程消亡,自动退出
即使还有后台线程没有执行完,虚拟机也会自动退出
join() - 将一个线程加入到当前线程中
4, 什么时候使用线程
-------------------------
1,多个并行子任务提高程序效率
2,阻塞的操作,必须在一个线程内执行
3,后台执行的重复任务
线程
==================
多线程共享数据,线程的同步
synchronized (重点)
----------------------------------
1,同步锁
每个对象上都有一个同步锁
一个线程执行 synchronized 块时,
需要获得同步锁才能执行
等执行完会归还锁
2,synchronized 非静态方法
要获得当前实例的同步锁
3,synchronized 静态方法
要获得类对象的同步锁
4,synchronized 块
synchronized(对象) {
......
}
要获得小括号中对象的同步锁
可以选择以下对象:
a, this
b, 类对象
c, 非静态成员 Object lock = new Object()
d, 静态成员 static Object lock = new Object()
e, 正在修改或访问的对象
5,线程安全效率很差
线程不安全 - 线程安全
jdk1.2 - jdk1.0
ArrayList - Vector
HashMap - HashTable
StringBuilder - StringBuffer
6,获得线程安全的集合
syncList = Collections.synchronizedList(List);
syncMap = Collections.synchronizedMap(Map);
syncSet = Collections.synchronizedSet(Set);
等待通知机制 (非重点)
==================
1,wait 和 notifyAll 必须在synchronized代码块内调用
2,wait 会释放锁 (sleep不会释放锁)
3,wait 总应该在一个循环检查内调用(旋锁)
4,notify 方法只通知一个等待的线程
notifyAll 方法通知所有等待的线程
多数情况下应该使用notifyAll方法
5,等待通知机制可以看作是线程之间通信的机制
一个线程运算产生结果后通知另一个线程使用该数据
Timer
TimerTask
----------------------------------
1,执行重复任务
2,TimerTask - 执行的任务
3,Timer - 计时重复调用任务
schedule(TimerTask, Date)
在给定时间点执行一次指定任务
schedule(TimerTask, Date, long)
在给定时间点第一次执行, 间隔一定毫秒后重复执行
schedule(TimerTask, long, long)
间隔一定毫秒后执行第一次, 间隔一定毫秒后重复执行
scheduleAtFixedRate(TimerTask, Date, long)
固定频率执行
ThreadLocal
----------------------------------
线程安全的数据传递方式
在线程上绑定数据,
在线程执行到其他方法是从线程绑定取出数据
set(Object)
get()
remove()
Executors - 用于创建线程池
----------------------------------
执行大量任务时使用线程池避免创建过多线程
newCachedThreadPool()
创建一个可根据需要创建新线程的线程池
newFixedThreadPool()
创建一个可重用固定线程数的线程池
ExecutorService - 线程池
----------------------------------
execute(Runnable)
使用线程池中的线程执行任务
反射
=============
java.lang.Class
------------------------
0,获取类对象
实例.getClass()
类.class
Class.forName(类名字符串)
1,
包含类的信息(类名、属性、方法、构造方法)
2,
以下三个方法获取的是有访问权限的成员
包含继承的成员
c.getConstructors() - 获取构造方法
c.getFields() - 获取属性
c.getMethods() - 获取方法
3,
以下三个方法获取的是该类中定义的所有成员
不包含继承的成员
getDeclaredConstructors()
getDeclaredFields()
getDeclaredMethods()
通过反射创建实例
---------------------------------
Class.newInstance()
无参构造方法创建实例
Constructor.newInstance(Object[])
有参构造方法创建实例
通过反射调用成员
---------------------------------
返回值 = Method.invoke(对象, 参数数组)
Field.set(对象,值) - 给对象的成员变量赋值
Field.get(对象) - 获取对象的变量值
反射调用私有成员
setAccessable(true) - 将私有成员设为可访问
反射的作用:动态编程
---------------------------------
java.lang.reflect.Field
java.lang.reflect.Method
java.lang.reflect.Constructor
注解
=============
为其他工具、程序提供关于类、方法、属性的更多信息
自定义注解
-------------------------
@interface 关键字声明标注
@Target标注规定自定义标注的标注范围(类、方法、属性)
@Retention标注规定自定义标注的保留范围(源文件、字节码文件、内存)
@Target(ElementType.METHOD) //该标注只能应用于方法
@Retention(RetentionPolicy.RUNTIME) //在运行期保留
public @interface Test {
int id(); // 标注的属性
String description();
}
使用标注
---------------------------
class A {
@Test(id=12, description="测试12")
public void a() {......}
}
反射提取标注
---------------------------
T t = Method.getAnnotation(Test.class);
int id = t.id();
String desc = t.description();
java.net
======================
Socket 网络套接字
---------------------------------
ip地址 + 端口
java.net.ServerSocket
---------------------------------
构造方法指定端口号
accept() - 接受客户端连接请求并建立一个Socket通道
java.net.Socket
---------------------------------
Socket s = new Socket(ip,端口);
s.getInputStream()
s.getOutputStream()
java.net.URL
java.net.URLEncoder
java.net.URLDecoder