Java高级部分编程学习

io
==========java

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() - 是否具备读写执行权限windows

文件或目录操做
--------------------
createNewFile() - 建立文件, 返回是否成建立文件
mkdir() - 建立单层目录,返回是否成建立文件
mkdirs() - 建立多层目录,返回是否成建立文件数组

delete() - 删除文件,删除空目录,返回是否成删除
renameTo(File) - 更名安全

目录列表
--------------------
list()
listFiles() - 子目录和子文件的列表, 返回File[]网络

list(FileNameFilter) - 使用给定过滤器过滤文件
listFiles(FileNameFilter)
listFiles(FileFilter)多线程

回调模式 - 其余方法的代码中反过来调用本身的代码
java.io.FileFilter 接口
java.io.FileNameFilter 接口
-----------------------
文件过滤器
accept(File) - 参数文件是否符合过滤条件dom

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

相关文章
相关标签/搜索