Java高级部分

本文详细介绍了Java IO操作的基础知识,包括File类的使用方法、RandomAccessFile的读写技巧,以及处理BMP文件的方法。此外,还深入探讨了多线程的基本概念、线程同步机制和线程安全问题。
摘要由CSDN通过智能技术生成
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值