Java核心类库(二)

1.异常机制

Throwble类:用于描述Java语言中的错误(error):JVM挂掉,无法编码解决和异常(Exception):编码编程错误

异常的分类:

RuntimeException:非检测性异常:算术异常,数组下标越界异常,空指针异常,类型转换异常(强转时发生的异常),数字格式异常(尝试将格式不正确的字符串转换为数值)。

IOException:检测性异常:编译阶段被编译器检测出的异常

异常的捕获:

try{

        可能发生异常的代码

}catch(异常类型 变量名(可编写多个且小类型在大类型前面)){

        编写该异常处理代码

}finally{

        无论是否发生异常最终执行的代码

}

异常的抛出:

异常不能处理时,异常交由调用者处理,底层生成一个异常类对象抛出

public void show() throws IOException{方法体}

异常的抛出和捕获的处理原则:

当父类的重写方法没有异常抛出则子类的重写方法只能进行异常的捕获处理;当一个方法的调用引用了其他的方法,则可以使用异常的抛出将异常抛到最后一层进行捕获处理

自定义异常

自定义异常类继承自Exception类,提供无参构造和有参构造(字符串作为参数)

2.File类

用于描述文件或者目录,并获取文件或目录的特征信息

常用方法

File(String pathname):根据参数路径名来构造File对象

exists():该文件或者目录是否存在

getName():获取文件或目录的名字

length():该文件的长度

lastModified():该文件最后一次修改的时间(msc单位的long类型数据)

getAbsolutedPath():获取绝对路径

delete():删除文件或者目录

createNewFile():创建新文件

mkdir():创建目录

File[] listFiles():获取该目录下所有内容

isFile():是否是文件

isDirectory():是否是目录

File[] listFiles(FileFilter filter):获取目录下满足筛选器的所有内容

eg:匿名内部类

Filefilter f1 = new Filefilter(){

        @Override

        public boolean accept(File pathname){

                return pathname.getName().endwiths(".avi”);

        }

}

File[] file_list = file.listFiles(f1);再用for each循环遍历

3.IO流

IO就是input和output

按照读写数据的不同分为字节流(读写任意文件)和字符流(两个字节,读写文本文件)

3.1FileReader用于读取文本内容

FileReader(String fileName(参数为指定的路径名))构造对象

read()读取单个字符

read(char[] buf,int offset, int length)读取length个字符到字符数组中,若读到末尾则返回-1

read(char[] buf)读取buf.length个字符到数组中,若读到末尾则返回-1

close()关闭流对象释放资源

3.2FileWriter用于写入文本内容

FileWriter(String filename)构造输出流对象

write(int c)写入单个字符

write(char[] buf, int off, int length)将字符数组buf的内容从 off位置开始写入length个字符到输出流

write(char[] buf)将字符数组buf所有字符写入到输出流中

flush()刷新流

close()关闭流对象释放资源

3.3FileOutputStream类用于写入图像类字节流到输出流

FileOutputStream(String filename)

write(int c)输出单个字节

write(byte[] buf, int offset, int length)

write(byte[] buf)

flush ()刷新流并强制写出缓冲字节

close()

3.4FileInputStream用于读取图像类数据到输入流

FileInputStream(String filename)

read()

read(byte[] buf, int off, int length)

read(byte[] buf)

close()

available()获取输入流所关联文件大小

3.5BufferedOutputStream:缓冲输出流,将读取的buffer数据写出,减少交互次数

BufferedOutputStream(String filename)

write(int c)输出单个字节

write(byte[] buf, int offset, int length)

write(byte[] buf)

flush ()刷新流并强制写出缓冲字节

close()

3.6BufferedInputStream:缓冲输入流,将读取的数据写入buffer

BufferedInputStream(String filename)

read()

read(byte[] buf, int off, int length)

read(byte[] buf)

close()

available()获取输入流所关联文件大小

3.7BufferReader用于读取单个字符,字符数组和字符串

BufferedReader(String fileName(参数为指定的路径名))构造对象

read()读取单个字符

read(char[] buf,int offset, int length)读取length个字符到字符数组中,若读到末尾则返回-1

read(char[] buf)读取buf.length个字符到数组中,若读到末尾则返回-1

Sring readline()读取一行字符串返回null表示读到末尾

close()关闭流对象释放资源

3.8BufferWriter用于写入单个字符,字符数组和字符串到输出流

BufferedWriter(String filename)构造输出流对象

write(int c)写入单个字符

write(char[] buf, int off, int length)将字符数组buf的内容从 off位置开始写入length个字符到输出流

write(char[] buf)将字符数组buf所有字符写入到输出流中

write(String str)

write(String str,int off, int len)

newLine()写入行分隔符

flush()刷新流

close()关闭流对象释放资源

3.9PrintStream

3.9和3.10都是打印流写入文件3.9针对于字节流3.10针对于字符流功能一致

PrintStream(FileOutputStream out)

print(String s)打印字符串

println(String s)打印字符串并换行

flush()

close()

3.10PrintWriter

PrintWriter(Writer类 out)

print(String s)打印字符串

println(String s)打印字符串并换行

flush()

close()

3.11OutputStreamWriter字符流转为字节流

OutputStreamWriter(OutputStream out)

3.12InputStreamReader字节流转为字符流

InputStreamReader(InputStream in)

3.13ObjectOutputStream

将对象的内容写入输出流

对象对应的类实现java.io.Serializable接口实现序列化(将对象信息转化为字节序列)

不想串行化的数据用transient关键字修饰

ObjectOutputStream(outputstream out)

writeObject(Object obj)将对象整体写到输出流中

close()

3.14ObjectInputStream

从输入流中读取对象整体

反序列化:将字节序列转为对象整体

ObjectInputStream(Inputstream out)

readObject(Object obj)将对象整体读取到输入流中

close()

3.15RandomAccessFile类

对随机访问文件的读写操作,用于操作文件,文件的位置也可知

RandomAccessFile(String name, string mode)

mode:r(只读),rw(读写),rwd(读写并更新),rws(读写并同步更新和元数据的更新)

read()

seek(long pos)设置文件的偏移量

write(int b )

close()

4.多线程

程序和进程的概念:

程序:硬盘上的可执行程序

进程:内存上的可执行程序

为了支持系统的多进程,也就是一个系统同时执行多个进程提出了多线程的概念(因为线程是轻量级的,进程是重量级的),线程是进程的程序流,进程支持多线程,可保证线程所在的进程资源可以共享。多线程采用时间片轮转法保证多个线程并发执行,但实际上也是串行的机制。

4.1线程的创建与启动

方式一:自定义类继承Thread类并重写run方法,生成自定义类对象Thread t1 = new 自定义类();并启动该线程 t1.start();

方式二:(推荐)自定义类实现runnable接口并重写run方法,生成该自定义类对象并将该自定义类对象放入Thread类的对象中生成线程并执行start方法; 自定义类 r1 = new 自定义类();

Thread t1 = new Thread(r1); t1.start();

为什么推荐方式二:因为方式一由继承Thread类来创建线程,当一个自定义类继承了该类后便不能继承其他的类。而如果是方式二,实现了该接口之后该自定义类仍然可以实现其他的接口,补回受影响。

方式三:自定义类实现Callable接口,并重写call方法(返回值支持泛型),创建自定义类对象tct,将该对象的引用放入新创建的FutureTask()类的引用ft1中,再将新创建的FutureTask类的引用再放入Thread类的引用对象t1中。t1.start(),使用ft.get()方法获得call方法的计算结果

方式四(线程池):

创建线程池

ExcutorService e1 = Executors.newFixedThreadPool(10);

向线程池布置任务

e1.submit(Callable task);eg:new ThreadCallableTest()实现了callable接口的类

e1.execute(Runnable command)实现了Runnable接口的自定义类

关闭线程池

e1.shutdown();

线程池的概念原理:

每一个客户端建立连接就需要创建一个线程,当线程结束时就会销毁线程,线程的创建和销毁会消费大量的资源。创建线程池,在线程池中预创建了一定量的线程,当有新的连接时,从线程池中拿出空闲的线程去执行,当线程结束时不销毁线程而是将线程返还给线程池,一个线程只能执行一个任务。

4.12进程创建的优化(匿名内部类)当需要继承某个类或者实现某个接口来实现对象的创建时便可以用匿名内部类的方法来实现!!!!!!!!!

方式一:new Thread(){

        @Override

        public void run(){}

}.start();

方式二:

new Thread(new Runnable(){

        @Override

        public void run(){}

}).start();

4.2线程的启动顺序:在实现了上述线程的创建之后,执行顺序为,执行main方法的主线程方法,当执行到子线程的创建时run方法时,新开一个线程,此时有两个线程同步运行,互不干扰,当子线程执行完毕时,子线程结束。当main方式执行完毕时,主线程结束,两个线程没有明确的先后执行顺序,由操作系统的算法调度决定。

4.3线程的生命周期

新建状态:new创建该进程

就绪状态:调用start方法但线程调度器还没调用该进程

运行状态:线程调度器调用该线程,当时间片执行完毕后但该线程还未执行完成就回到就绪状态

消亡状态:该进程执行完毕

阻塞状态:进程执行过程中被阻塞:sleep()等

4.4线程的编号和名称

getId()获得该线程的Id

getName()获得该线程的名称

setName(String name)修改该线程的名称

static currentThread()静态方法获取当前执行线程的引用

4.5线程的常用方法

静态方法:

yield():使得当前执行的线程进入就绪状态

sleep(msc):使得当前执行的线程进入阻塞状态阻塞msc毫秒,当其他线程打断该线程的阻塞会发生interruptedException状态

成员方法:

getPriority()获得该线程的优先级

setPriority(int newpriority)设置该线程的优先级,优先级越高获得时间片的机会越多

join()等待该线程结束

join(msc)等待该线程多少毫秒

isDaemon()判断该线程是否为守护线程

setDaemon()设置该线程为守护线程

设置守护线程必须在子线程启动之前设置,当该线程为守护线程时,子线程随着主线程的结束而结束,若不是,当主线程结束后,子线程仍然会继续执行。

4.6线程同步机制

当两个线程同时访问一个临界资源时,可能会发生线程并发安全问题,其实需要线程之间进行同步和通讯以实现线程同步机制

异步操作:多线程并发执行,各自独立运行

同步操作:多线程串行操作,有先后执行顺序

实现方法:

4.6.1synchronized来实现同步/对象锁来保证线程的原子性

同步代码块:

synchronized(类类型引用){

        需要锁定的代码;

}该类类型引用保证多个线程共用的是同一个类类型的引用

同步方法:

synchronized(this){

        需要锁定的代码;    

}或者用synchronized修改某个方法

静态方法锁:

用synchronized修饰某个静态方法:该方法锁的对象时类对象,而每个类都有唯一的类对象。

4.6.2使用lock同步锁对象来实现

创建ReentrantLock对象 ReentrantLock r1 = new ReentrantLock();

在需要上锁的代码前面加 r1.lock()

上锁代码结束后在后面加 r1.unlock()

两者之间的区别:

lock为显性锁需要手动开启和关闭,synchronized为隐形锁代码执行完毕后自动解锁

lock只有同步代码块的锁而synchronized有同步代码块锁和同步方法锁

lock上锁时,JVM花费的时间较少来调度线程,性能更好。

4.7死锁:

当两个线程同步运行时,线程A持有对象锁a等待对象锁b的接触而线程B持有对象锁b等待对象锁a的接触

4.8Object常用方法(利用该方法可实现线程间的通信)

wait( ):使得线程进入等待(阻塞)状态直到其他线程调用notify/notifyAll()方法

wait(msc):使得线程进入等待状态直到其他线程调用notify/notifyAll()方法或者等待指定毫秒数

notify():唤醒单个线程

notify(msc):唤醒所有线程

该线程的阻塞和唤醒必须在锁的范围内使用,不然无法控制进程的同步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值