异常处理
try {
可能出现问题的代码;
} catch ( 异常类名 变量名) {
针对问题的处理;
} finally {
释放资源;
}
try {
可能出现问题的代码;
} catch ( 异常类名1 | 异常类名2 | . . . 变量名) {
针对问题的处理;
}
异常分为编译期间异常和运行期间异常,所有属于RuntimeException的子类都是运行期间异常,其余一场都是编译期间异常。而需要通过try…catch语句处理的异常通常都是编译期间异常。 另外一种处理异常的方式是抛出异常
在方法的括号后面加上throws 异常类名1, 异常类名2… 在方法的内部通过throw后面跟上new出来的异常对象来主动抛异常 finally语句体中的语句一定会执行,即便try或者catch中存在return,它们会在return前一刻执行完成,然后再回到return语句。 自定义异常需要继承Exception类,带参构造方法中的参数表示错误提示信息。
public class MyException extends Exception {
public MyException ( ) {
}
public MyException ( String message) {
super ( message) ;
}
}
异常注意事项:
子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。 如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常。 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws。
File类
File file = new File ( "E:\\demo\\a.txt" ) ;
File file2 = new File ( "E:\\demo" , "a.txt" ) ;
File file3 = new File ( "e:\\demo" ) ;
File file4 = new File ( file3, "a.txt" ) ;
public boolean canRead ( )
public boolean createNewFile ( ) throws IOException
public boolean mkdir ( )
public boolean mkdirs ( )
public boolean delete ( )
public String getAbsolutePath ( )
public String getName ( )
public boolean isDirectory ( )
public boolean isFile ( )
public long length ( )
public boolean renameTo ( File dest)
public String[ ] list ( )
public File[ ] listFiles ( )
高级方法:
public String[] list(FilenameFilter filter)
:返回所有满足条件的文件或文件夹名称数组。FilenameFilter是一个接口,所以传入的参数必须是其子类对象,并且需要重写其中的accept方法,用来逐个判断文件或者文件夹是否满足要求。当然,传入的filter参数可以不另外创建类,而是直接用匿名内部类的方式创建子类对象。
IO流
分类
按照流向可以分为输入流和输出流。 按照数据类型可以分为字节流可字符流。 所以组合起来总共有四种流:字节输入流、字节输出流、字符输入流、字符输出流。 分别对应的抽象基类时:InputStream, OutputStream, Reader, Writer。 使用IO流读写数据,最后一定要调用close()方法,这样就能让流对象变成垃圾,可以被垃圾回收器回收;第二点就是通知系统去释放跟该文件有关的资源。 使用FileInputStream和FileOutputStream读写数据的方式如下:
import java. io. FileInputStream;
import java. io. FileOutputStream;
import java. io. IOException;
public class TestDemo {
public static void main ( String[ ] args) throws IOException {
FileInputStream fis = new FileInputStream ( "e:\\movie.avi" ) ;
FileOutputStream fos = new FileOutputStream ( "movie.avi" ) ;
byte [ ] b = new byte [ 1024 ] ;
int len = 0 ;
while ( ( len = fis. read ( b) ) != - 1 ) {
fos. write ( b, 0 , len) ;
}
fis. close ( ) ;
fos. close ( ) ;
}
}
BufferedOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以将字节写入基础输出流,而不必为写入的每个字节调用底层系统。提高了读写效率。使用时只需要用该类对输出流进行包装即可。使用BufferedOutputStream和BufferedInputStream的协数据的方式如下:
import java. io. *;
public class TestDemo {
public static void main ( String[ ] args) throws IOException {
BufferedOutputStream bos = new BufferedOutputStream ( new FileOutputStream ( "movie.avi" ) ) ;
BufferedInputStream bis = new BufferedInputStream ( new FileInputStream ( "e:\\movie.avi" ) ) ;
byte [ ] b = new byte [ 1024 ] ;
int len = 0 ;
while ( ( len = bis. read ( b) ) != - 1 ) {
bos. write ( b, 0 , len) ;
}
bis. close ( ) ;
bos. close ( ) ;
}
}
前面讲到的四个类都属于字节流,而读写文本文件还有一类流叫做字符流:Reader, Writer 使用方法与字节流大致相同:
import java. io. *;
public class TestDemo {
public static void main ( String[ ] args) throws IOException {
InputStreamReader isr = new InputStreamReader ( new FileInputStream ( "a.txt" ) ) ;
OutputStreamWriter osw = new OutputStreamWriter ( new FileOutputStream ( "b.txt" ) ) ;
char [ ] ch = new char [ 1024 ] ;
int len = 0 ;
while ( ( len = isr. read ( ch) ) != - 1 ) {
osw. write ( ch, 0 , len) ;
osw. flush ( ) ;
}
isr. close ( ) ;
osw. close ( ) ;
}
}
下面利用缓冲流的特殊方法来完成文件内容的复制: public String readLine()throws IOException
通过下列字符之一即可认为某行已终止:换行 (’\n’)、回车 (’\r’) 或回车后直接跟着换行。返回包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null。
import java. io. *;
public class TestDemo {
public static void main ( String[ ] args) throws IOException {
BufferedReader br = new BufferedReader ( new FileReader ( "a.txt" ) ) ;
BufferedWriter bw = new BufferedWriter ( new FileWriter ( "b.txt" ) ) ;
String line = null;
while ( ( line = br. readLine ( ) ) != null) {
bw. write ( line) ;
bw. newLine ( ) ;
bw. flush ( ) ;
}
br. close ( ) ;
bw. close ( ) ;
}
}
DataInputStream和DataOutputStream是读写基本数据类型的输入输出流,它们的读写方法中除了能够是字节数组,还可以是Java中的任意基本数据类型。保存在文件中的数据类型不是字符串形式,所以不可读;但他们保存了原有的数据类型,使用输入流读入时依然是原来的数据类型。 PrintWriter是打印输出流,能够将任意数据类型打印在文本文件中。调用的方法不再是write()而是print()或println()。打印流将其他数据类型以字符串的形式保存下来,已经不再是以前的数据类型,这一点需要与前面两个流进行区分。 随机访问流RandomAccessFile可以同时具备读和写的功能,且支持各种数据类型;还能够获取文件指针和设置文件指针来从中间任意位置进行读写。 合并流SequenceInputStream能够将多个InputStream合并为一个,按照顺序挨个文件读取。 ObjectOutputStream和ObjectInputStream称为序列化流和反序列化流。能够实现对象的序列化和反序列化,对象要具备被序列化的能力,必须实现Serializable接口。在成员变量前面加上transient关键字就能够防止其被序列化。
Properties类
该类是Hashtable类的子类,它也实现了Map接口,具有基本的与Map类相同的功能,但是它限制了键和值的类型必须为字符串形式。 该类有一些特殊的方法:
public String getProperty ( String key)
public Object setProperty ( String key, String value)
public Set< String> stringPropertyNames ( )
public synchronized void load ( Reader reader) throws IOException
public void store ( Writer writer, String comments) throws IOException