1、异常
基本格式try{可能发生异常的代码;}catch(异常类名 变量名){异常的处理代码;}finally{释放资源的代码;}变形格式try..catchtry..catch..catchtry..catch..catch..finallytry..finally注意:不能写成 try{}单独存在JDK1.7针对多个catch做了优化try{可能发生的异常代码;}catch(异常1 | 异常2 | 异常3){//注意,这些异常必须是平级关系
}finally{
}
内部类要访问局部变量,局部变量必须定义成final类型
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证 此方法总被调用
static int test() {
int x = 1;
try
{
return x;
}
finally
{
++x;
}
}
---------执行结果 ---------
运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。
3、File类
4、File类-成员方法
File(String pathName)
根据指定的路径创建File对象
File(String parent, String child)
根据指定的父文件夹和子文件或者文件夹创建File对象
File(File parent, String child)
根据指定的父文件夹对象和子文件或文件夹创建File对象
以上三个方法,创建当前文件或文件夹的时候都是先看是否存在,如果存在就不创建,否则就创建
创建功能
boolean createNewFile()
创建文件
boolean mkdir()
创建文件夹
boolean mkdirs()
创建多级文件夹
删除功能
public boolean delete()
删除文件或文件夹
A:如果删除的目录下还有内容,则必须先把该目录下的的内容清空
B:JAVA语言的删除不走回收站
判断功能
public boolean exists()
判断 file 对象是否存在
public boolean isFile()
判断 file对象是否是文件
public boolean isDirectory()
判断 file对象是否是文件夹
public boolean isAbsolute()
判断 file对象是否是绝对路径
public boolean canRead()
判断 file对象是否可读
public boolean canWrite()
判断 file对象是否可写
public boolean isHidden()
判断 file对象是否隐藏
获取功能
public File getAbsoluteFile()
获取文件的绝对路径
public String getName()
获取文件名称
public String getPath()
获取相对路径
public long length()
获取文件的大小,单位是字节
public long lastModified()
获取上次修改时间的毫秒值
public static File[] listRoots()
列出可用的系统文件根目录
public String[] list()
返回的是指定目录下所有文件或者文件夹的名称数组
public String[] list(FilenameFilter filter)
public File[] listFiles()
返回的是指定目录下所有文件或者文件夹对象数组
public File[] listFiles(FilenameFilter filter)
5、File类-案例
importjava.io.File;
importjava.io.FilenameFilter;
/*
* 获取指定目录下指定后缀的文件名称:
* A:先获取指定目录下所有文件或者文件夹的File数组,然后再遍历的时候进行判断。满足条件的就输出该File的名称。
* B:直接获取指定目录下满足条件的String(File)数组。然后遍历数组即可。
*
* 文件名称过滤器:FilenameFilter
* public String[] list(FilenameFilter filter)
*/
public classFileDemo {
public static voidmain(String[] args) {
// 封装目录
File file = new File("d:\\");
// 获取满足条件的数组
String[] strArray = file.list(new FilenameFilter() {
@Override
public booleanaccept(File dir, String name) {
// 判断是否是文件,是否是以.mp4结尾
// System.out.println(dir + "---" + name);
File file = new File(dir, name); // d:\我的文档
boolean flag = file.isFile();
boolean flag2 = name.endsWith(".mp4");
return flag && flag2;
}
});
// 遍历字符串数组
for(String str : strArray) {
System.out.println(str);
}
}
}
6、递归
if(n ==1){return 1;elsereturn n* jc(n -1);}
7、IO体系
8、FileWriter
/**
* FileWriter类的使用
* 该类是写入字符文件的快捷类
*/
public classFileWriterDemo {
public static voidmain(String[] args)throws Exception {
//第一步:创建字符流输出对象
FileWriter fw = new FileWriter("readme.txt");
//第二步:调用写入数据方法
fw.write("注意事项"+System.getProperty("line.separator"));
fw.write("1、上课不能玩手机"+System.getProperty("line.separator"));
fw.write("2、不能迟到早退"+System.getProperty("line.separator"));
//第三步:调用刷新缓冲区功能,该功能会将缓冲区的数据写入到文件,并且清空缓冲区中的内容
fw.flush();
//第四步:关闭流,释放资源
fw.close();
}
}
9、FileReader
importjava.io.FileReader;
public classFileReaderDemo {
public static voidmain(String[] args)throws Exception {
//第一步:创建字符流输入对象
FileReader fr = new FileReader("readme.txt");
//第二步:调用读取数据方法,并显示
/*
*方式1::一次读取一个字符,效率低 ,不推荐
*/
int ch = 0;
while((ch=fr.read()) != -1){
System.out.print((char)ch);
}
/*
* 方式2:一次读取一个字符数组,效率高推荐
*/
fr = newFileReader("readme.txt");//必须重新赋值,或者注释掉方式1中的代码,因为fr对象已经读取到末尾了,必须重新开始读取
char[] chs = new char[1024];
int len = 0;
while((len = fr.read(chs)) != -1){
System.out.println(newString(chs,0,len));
}
//第三步:关闭流,释放资源,该对象无法继续使用
fr.close();
}
}
10、例子
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFileDemo {
public static void main(String[] args) throws Exception {
boolean flag = copy(new FileReader("D://haha.txt"), new FileWriter("E://haha.txt"));
if(flag){
System.out.println("拷贝成功");
}else{
System.out.println("拷贝失败");
}
}
/**
* 拷贝文件
* 思路:读取文件内容的同时,将读取到的内容写入到输出流
*/
public static boolean copy(FileReader fileReader, FileWriter fileWriter) {
//标识符,拷贝成功变为true并返回,拷贝失败返回false
boolean flag = false;
//创建字符数组,将读取到的内容存进去
char[] chs = new char[1024];
int len = -1;
try {
//读取文件,将读取到的内容存到chs字符数组
while((len = fileReader.read(chs)) != -1){
//将字符数组中的内容写入到输出流
fileWriter.write(chs, 0, len);
fileWriter.flush();
}
//拷贝成功,修改标识符的值为true
flag = true;
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return flag;
}
}
11、字节流 与 字符流 比较
public static void main(String[] args) throwsException{
//字符缓冲输入流
BufferedReader bufferedReader = new BufferedReader(newFileReader("d://readme.txt"));
//字符缓冲输出流
BufferedWriter bufferedWriter = new BufferedWriter(newFileWriter("d://readme.txt.bak"));
String line = null;
//每次读取一行,如果读到null就停止读取文件内容
while((line=bufferedReader.readLine()) != null){
bufferedWriter.write(line);
bufferedWriter.flush();
}
//关闭流
bufferedReader.close();
bufferedWriter.close();
}
public static voidmain(String[] args) throws Exception {
// 定义字节缓冲输入流
BufferedInputStream bis = null;
// 定义字节缓冲输出流
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(newFileInputStream("d://readme.txt"));
bos = new BufferedOutputStream(newFileOutputStream("d://readme.txt.byte"));
byte[] bys = new byte[1024];
int len = -1;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
bos.flush();
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 关闭流
}
}
12、Properties
添加修改 public Object put(Object key, Object value) 添加修改 public Object setProperty(String key,String value) 调用的就是 put 方法 获取功能 public String get(String key) 获取 Public String getProperty(String key) 底层调用的是 get Public String getProperty(String, String defaultValue) 底层调用 get, 如果找不到,返回 defaultValue public Set<String> stringPropertyNames() 获取键集合 转换功能 public void list(PrintWriter out)将属性列表输出到指定的输出流 。 public void list(PrintStream out) public void load(InputStream inputStream) 从输入流中读取属性和列表 public void load(Reader reader) public void store(OutputStream out, String comment) 把集合中的数据保存到文本中 public void store(Writer writer, String comments) public Set keySet() 获取所有键的集合
注意:Properties类在以后Android中会有新的Properties替代,在EE中我们会重新封装一个Properties工具类,因为Properties的缺点很明显,不能直接操作File对象
13、System类
退出jvm,非0表示异常退出
public static long currentTimeMillis()
返回当前系统时间的毫秒值
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
从指定源数的指定位置开始复制,赋值到目标数组的指定位置
public static Properties getProperties();
获取当前系统的属性
public static String getProperty(String key)
获取指定键描述的系统属性
public static String getProperty(String key, String defaultValue)
获取指定键描述的系统属性,没有找到该键的话返回defaultValue
/**
* 遍历系统描述Properties
*/
public static voidmain(String[] args) throws Exception{
Properties properties = System.getProperties();
Set<Object> keySet = properties.keySet();
for(Object key:keySet){
System.out.println(key +"*****"+properties.get(key));
}
}
/**
* 获取当前系统中的换行符
*/
public static voidmain(String[] args) throws Exception{
String line = System.getProperty("line.separator");
System.out.println(line+"你好");
}
14、转换流
第一步:先new一个字符流,这是我们要直接调用的第二部:new一个转换流传给字符流,这是中间流第三部:把字节流传给转换流,这是要转换的流
/*输入转换流演示*/
//System.in 是个输入流,可以看成FileInputStream
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
System.out.println(line);
reader.close();
/*输出转换流演示*/
//System.out 是个字节输出流,这里看成 new FileOutputStream();就可以了
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
writer.write("你好");
writer.flush();
writer.close();
//System.in 是个输入流,可以看成FileInputStream
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in,"UTF-8"));
String line = reader.readLine();
System.out.println(line);
reader.close();
/*输出转换流演示*/
//System.out 是个字节输出流,这里看成 new FileOutputStream();就可以了
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out,"UTF-8"));
writer.write("你好");
writer.flush();
writer.close();
15、打印流
A、PrintWriter的使用方式1、通过构造方法创建对象并且启用自动刷新功能PrintWriter(OutputStrem out, boolean autoFlush);PrintWriter(Writer out, boolean autoFlush);2、调用println\printf\format方法,只有调用这三个个方法才会自动调用flush方法
PrintWriter printWriter = newPrintWriter(new FileWriter("d.txt"),true);
printWriter.printf("1");//仅仅写入数据并且刷新
printWriter.println("2");//写入数据并且增加换行符,刷新
printWriter.format("你好 %s", "张三");
PrintStream ps = newPrintStream(new FileOutputStream("a.txt"),true);//,true可有可无
ps.printf("你好");
16、序列化