标签:异常、io、file
一:File
1.1
File:文件和目录(文件夹)路径名的抽象表示形式。
1.2
File的构造方法:
File(String pathname):把一个路径名称封装成File对象
File(String parent, String child):把一个父路径和一个子路径封装成一个File对象
File(File parent, String child):把一个父路径File对象和一个子路径封装成一个File对象
1.3
创建功能:
A:创建文件
public booleancreateNewFile():如果文件不存在,就创建。否则,不创建。
需求:D盘下造一个文件a.txt
B:创建目录
public boolean mkdir():如果目录不存在,就创建。否则,不创建。
需求:D盘下造一个文件夹test
public booleanmkdirs():如果目录不存在,就创建。否则,不创建。
即时父目录不存在,也可以连父目录一起创建。
需求:D盘下造一个文件夹(D:/aaa/bbb/ccc)
需求:D盘下造一个文件夹("D:\\ddd\\eee\\f.txt");
package com.edu_01;
import java.io.File;
import java.io.IOException;
/**
1.1
File:文件和目录(文件夹)路径名的抽象表示形式。
1.2
File的构造方法:
File(String pathname):把一个路径名称封装成File对象
File(String parent, String child):把一个父路径和一个子路径封装成一个File对象
File(File parent, String child):把一个父路径File对象和一个子路径封装成一个File对象
*
*/
public class FileDemo {
publicstatic void main(String[] args) throws IOException {
//File(Stringpathname):把一个路径名称封装成File对象
//Filefile = new File("D://a.txt");
//System.out.println(file.createNewFile());//当文件不存在的时候,创建文件,如果文件存在,不创建
System.out.println("------------");
//File(Stringparent, String child):把一个父路径和一个子路径封装成一个File对象
//Filefile = new File("D://test", "a.txt");
//java.io.IOException:系统找不到指定的路径,
//创建文件的时候一定要保证路径存在
//System.out.println(file.createNewFile());
System.out.println("-----------------");
//File(Fileparent, String child):把一个父路径File对象和一个子路径封装成一个File对象
Filefile = new File("D://test");
Filefile2 = new File(file, "a.txt");
System.out.println(file2.createNewFile());
}
}
注意事项:
A:你要造什么东西,就应该用对应的方法。
1.4
删除功能:
public boolean delete():既可以删除文件,又可以删除目录。
路径问题:
A:绝对路径 就是以盘符开始的路径(d:\\test\\aaa\\b.txt)
B:相对路径 就是不以盘符开始的路径(a.txt)
一般都是相对应当前的项目而言的。
注意事项:
A:Java程序的删除不走回收站。
B:如果目录内还有内容就不能删除。
1.5
判断功能
public boolean isDirectory():是否是目录
public boolean isFile():是否是文件
public boolean exists():是否存在
public boolean canRead():是否可读
public boolean canWrite():是否可写
public boolean isHidden():是否隐藏
package com.edu_02;
import java.io.File;
import java.io.IOException;
/**
* 1.5
判断功能
public boolean isDirectory():是否是目录
public boolean isFile():是否是文件
public boolean exists():是否存在
public boolean canRead():是否可读
public boolean canWrite():是否可写
public boolean isHidden():是否隐藏
*/
public class FileDemo3 {
publicstatic void main(String[] args) throws IOException {
//在D://a.txt
Filefile = new File("D://a.txt");
//System.out.println(file.createNewFile());
System.out.println("是否是目录:"+file.isDirectory());
System.out.println("是否是文件:"+file.isFile());
System.out.println("是否存在:"+file.exists());
System.out.println("是否可读:"+file.canRead());
System.out.println("是否可写:"+file.canWrite());
System.out.println("是否隐藏:"+file.isHidden());
}
}
1.6获取功能
public String getAbsolutePath():获取绝对路径
public String getPath():获取相对路径
public String getName():获取名称
二:字节流及字节高效流
2.1 I/O流的分类
* IO流分类:
* 流向:
* 输入流
* 输出流
* 数据类型:
* 字节流
* 字节输入流
* 字节输出流
* 字符流
* 字符输入流
* 字符输出流
*
* 注意:一般我们在讨论IO的分类时,默认是按照数据类型分的。
*
* 字节流:
* 字节输入流 InputStream(抽象类)
* 字节输出流 OutputStream(抽象类)
* 字符流:
* 字符输入流 Reader
* 字符输出流 Writer
*
* 学习习惯:
* 字节流
* 字符流
*
2.2
* 需求:请用字节流往一个文本文件中写一句话:"helloworld"。
* 分析:
* 首先要知道是字节流
* 写数据我们就应该知道是字节输出流
* 所以最终选择了OutputStream
* 而OutputStream是抽象类,所以我们应该找其子类
* 文件这个单词是File,所以我们就大胆的猜测下:FileOutputStream存在否。
*
* 我们如何往一个文件写数据呢?
* 或者说就是字节输出流的操作步骤是什么呢?
* A:创建字节输出流对象
* B:调用写数据的方法
* C:释放资源
package cokm.edu_01;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 2.2
* 需求:请用字节流往一个文本文件中写一句话:"helloworld"。
* 分析:
* 首先要知道是字节流
* 写数据我们就应该知道是字节输出流
* 所以最终选择了OutputStream
* 而OutputStream是抽象类,所以我们应该找其子类
* 文件这个单词是File,所以我们就大胆的猜测下:FileOutputStream存在否。
*
* 我们如何往一个文件写数据呢?
* 或者说就是字节输出流的操作步骤是什么呢?
* A:创建字节输出流对象
* B:调用写数据的方法
* C:释放资源
*
*/
public class OutputStreamDemo {
publicstatic void main(String[] args) throws IOException {
/**
* 怎么使用文件输出流往文件中途写数据?
* 1.创建文件输出流对象
* 2.调用输出流对象的方法给文件中写数据
* 3.释放资源
*/
//publicFileOutputStream(String name)
//publicFileOutputStream(File file)
//创建文件输出流对象
FileOutputStreamfos = new FileOutputStream("a.txt");
//publicFileOutputStream(File file)
//Filefile = new File("a.txt");
//FileOutputStreamfos = new FileOutputStream(file);
/**
* FileOutputStream fos = newFileOutputStream("a.txt");
* 做了那些事情?
* 1.创建fos对象指向文件a.txt
* 2.创建一个文件a.txt
*/
//调用输出流的写数据的方法给文件中写数据
//publicvoid write(byte[] b)
byte[]byf = "helloworld".getBytes();
fos.write(byf);
//释放资源,关流操作
fos.close();
//关流之后,我们还能继续往文件中写数据码
//这样是不行的。。
//fos.write("java".getBytes());//java.io.IOException:Stream Closed
}
}
做法:
A: 两个构造的区别?
FileOutputStream(File file)
FileOutputStream(Stringname)
FileOutputStreamfos = newFileOutputStream("fos.txt");
请问上面这个操作做了哪几件事情?
* 1.创建了一个文件输出流fos,指向文件a.txt
* 2.创建了a.txt这个文件
B: fos.write("helloworld".getBytes());
C: fos.close();关流
D: fos.write("java".getBytes());
2.3
FileOutputStream写数据的方法
write(byte[] b)
write(int b) :一次写一个字节
write(byte[] b, int off, int len) :一次写一个字节数组的一部分
2.4
字节输入流:
具体操作步骤:
* 字节输入流操作步骤:
* A:创建字节输入流对象
FileInputStream fis = new FileInputStream("a.txt");
* B:调用方法读取数据
一次读取一个字节:read()-- 测试读取不到内容的时候的返回值(并且用循环改进)
* C:释放资源
fis.close
* 练习:
* A:把a.txt的内容复制到b.txt中
* C:把d:\\复制视频文件
* 数据源:
* IODemo.java -- 读取数据 -- InputStream -- FileInputStream -- 一次读取一个字节
* 目的地:
* Copy.java -- 写出数据 -- OutputStream-- FileOutputStream -- 一次写一个字节
2.5
字节输入流:
具体操作步骤:
* 字节输入流操作步骤:
* A:创建字节输入流对象
FileInputStream fis = new FileInputStream("a.txt");
* B:调用方法读取数据(一次读取一个字节数组,提升效率)
一次读取一个字节数组:public int read(byte[] b):返回实际读取长度,数据被读取到数组中。
-- 测试方法返回长度?根据String类的构造方法构造字符串
* C:释放资源
fis.close
2.5
* 字节缓冲区流(也叫高效流):
* BufferedInputStream(read() 一次读取一个字节,public int read(byte[] b):返回实际读取长度,数据被读取到数组中。)
* BufferedOutputStream(write(byte[]b))
*
* 流
* 低级流: 基本的流,可以直接操作文件。
* 高级流:是操作基本流的流。
2.6
* 字节流复制文件:
* A:基本字节流一次读写一个字节
* B:基本字节流一次读写一个字节数组
* C:高效字节流一次读写一个字节
* D:高效字节流一次读写一个字节数组
获取时间的方法:
System.currentTimeMillis()
三:编码问题??
*String中的编码和解码问题。
*
* 编码:
* 把我们能够看懂的字符转换为看不懂的数据
* 解码:
* 把我们看不懂的数据转换为看得懂的字符
*
* 举例:
* 电报/潜伏(余则成 深海)
*
* 编码表:
* 小本子,这个本子上记录了很多的汉字和对应的数据值。
*
* 延安:
* 今晚兴庆公园见
*
* 发报员:
* 今晚兴庆公园见
* 转换成数据
* 发送数据
*
* 余则成:
* 接收数据
* 记录完毕后,就找出小本子,通过对应的数据值找到对应的字符
* 今晚兴庆公园见
public byte[] getBytes(StringcharsetName) 按照给定的编码方式,编码字节数组(gbk,utf-8)
String(byte[] bytes, String charsetName) 按照给定的编码方式解码字符数组
String s = "中国好";
byte[]bytes = s.getBytes("utf-8");
System.out.println(Arrays.toString(bytes));
//String(byte[]bytes, String charsetName)
System.out.println(newString(bytes,"gbk"));
结论:用什么编码,就必须用什么解码。。
异常:
1.1
异常:就是程序出现的不正常的情况。
* 异常:
* 错误:这是非常严重的问题,一般我们处理不了,一般在这里指的是硬件问题。
* 异常:
* 编译时期异常 开始就必须要处理的,如果不处理,后面就走不了。
* 运行时期异常 开始可以不用处理。这种问题一旦发生,就是我们的程序问题,需要我们修改程序。
*
* 体系结构:
*Throwable:
* Error:
* Exception:
* 非RuntimeException:编译时期异常
* RuntimeException:运行时期异常
* 异常演示:
* 除数不能为0
*
*java.lang.ArithmeticException: / by zero
*
* 针对异常,JVM默认的处理方案:
* 一旦遇到程序出现了问题,就会把问题的类名,错误原因,错误的位置等信息打印在控制台,以便我们观察。
* 并且,会自动从当前出问题的地方停止掉。
*
* 这种处理方案虽然可以,但是不够好。
* 哪里不好呢?
* 其实程序出问题,不应该直接停止,因为我们的程序可能是由多部分组成的,
* 其中一个部分出问题了,不应该影响其他部分的执行。
* 所以,我们应该想办法让其他的部分能够执行下去。
1.2
* 我们是如何处理异常,保证各个部分不影响的呢?
* 两种方案:
* A:try...catch...finally
* B:throws
*
*try...catch...finally:
* try{
* 可能出现异常的代码
* }catch(异常类名 变量名) {
* 针对异常的代码处理
* }finally {
* 释放资源的地方
* }
*
* 我们简化一下第一个:
*try{
* 可能出现异常的代码
* }catch(异常类名 变量名) {
* 针对异常的代码处理
* }
package com.edu_01;
/**
* * 我们是如何处理异常,保证各个部分不影响的呢?
* 两种方案:
* A:try...catch...finally
* B:throws
*
* try...catch...finally:
* try{
* 可能出现异常的代码
* }catch(异常类名变量名) {
* 针对异常的代码处理
* }finally{
* 释放资源的地方
* }
*
* 我们简化一下第一个:
* try{
* 可能出现异常的代码
* }catch(异常类名变量名) {
* 针对异常的代码处理
* }
*
*/
publicclass ExceptionDemo3 {
publicstaticvoid main(String[] args) {
System.out.println("start");
int a= 10;
int b = 0;
try{
//可能出现异常的代码
System.out.println(a/b);//当除数为0的时候会抛出ArithmeticException这个异常
//接着程序会拿着这个异常和catch里面的异常类已经对比
}catch(ArithmeticException e){
//当程序抛出ArithmeticException这个异常之后给出的具体的处理方法
System.out.println("你的除数不能为0");
}
System.out.println("end");
}
}
1.3
* 多个异常的处理(演示数组索引越界异常,除数为0异常)
* A:针对每一个出现问题的地方写一个try...catch语句
* B:针对多个异常,采用一个try,多个catch的情况。
* try...catch...catch...
*
* 遇到try里面的问题,就自动和catch里面进行匹配。
* 一旦匹配就执行catch里面的内容,执行完毕后,接着执行后面的代码。
*
* 注意:
* 如果异常间有子父关系,父必须在最后。
1.4
* 编译时期异常和运行时期异常的区别:
* 编译时期异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译
* FileNotFoundException(文件未找到异常)
* 运行时期异常:无需显示处理,也可以和编译时异常一样处理
* ArithmeticException
1.5
*Throwable中的方法:(演示除数为0异常)
*printStackTrace():打印异常信息,程序从出问题的地方开始就会打印创建一个该异常对应的对象,
该对象直接调用打印方法
1.6(演示编译器异常,运行期异常)
*try...catch 是直接进行了处理。
* 而throws则是把异常处理的事情交给了调用者。
*
*throws用在方法上,声明方法有异常,交给调用者处理。
* 但是呢,如果是编译时期异常,调用就必须处理。
* 如果是运行时期异常,调用者可以处理,也可以不处理。
1.7
*throws:(演示文件未找到异常,除数为0异常)
* 用在方法声明后面,跟的是异常类名
* 可以跟多个异常类名,用,号隔开
* 表示抛出异常,由该方法的调用者来处理
* throws表示出现异常的一种可能,并不一定会发生这些异常
1.8
* 异常处理:
*try...catch...finally
*
*finally:一般用于释放资源。在数据库操作或者IO流比较常见。
*
* 特点:
* 被finally控制的语句体一定会执行
*
* 特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
1.9
*finally相关的面试题:
*final,finally的区别?
* final:最终的意思。可以修饰类,方法,变量。
* 修饰类,类不能被继承
* 修饰方法,方法不能被重写
* 修饰变量,变量是常量
* finally:
* 异常处理的一部分。被finally控制的代码一定会执行。
* 特殊情况:在执行到finally之前,jvm退出了。
1.9.1
* 注意:
* A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
* B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
上述仅仅针对编译时期异常
与运行时期异常无关。
1.9.2
throw和throws的区别?
*throws:
* 用在方法声明后面,跟的是异常类名
* 可以跟多个异常类名,用逗号隔开
* 表示抛出异常,由该方法的调用者来处理
* throws表示出现异常的一种可能性,并不一定会发生这些异常
*
*throw:
* 用在方法体内,跟的是异常对象名
* 只能抛出一个异常对象名
* 表示抛出异常,由方法体内的语句处理
* throw则是抛出了异常,执行throw则一定抛出了某种异常?
案例演示:演示编译时期异常(文件未找到异常)和运行时期异常(除数为0异常)使用上的区别
*throw:
* 如果throw的是编译时期异常,在方法声明上必须用throws进行标记
* 如果throw的是运行时期异常,在方法声明上可以用throws进行标记,也可以不用。
package com.edu_03;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* throw和throws的区别?
*throws:
* 用在方法声明后面,跟的是异常类名
* 可以跟多个异常类名,用逗号隔开
* 表示抛出异常,由该方法的调用者来处理
* throws表示出现异常的一种可能性,并不一定会发生这些异常
*
*throw:
* 用在方法体内,跟的是异常对象名
* 只能抛出一个异常对象名
* 表示抛出异常,由方法体内的语句处理
* throw则是抛出了异常,执行throw则一定抛出了某种异常?
*
*/
public class ThrowDemo {
publicstatic void main(String[] args) {
method();
try{
method2();
}catch (FileNotFoundException e) {
e.printStackTrace();
}
}
privatestatic void method2() throws FileNotFoundException{
try{
FileInputStreamfis = new FileInputStream("D://a.txt");
}catch(FileNotFoundExceptione){
//当遇见这个异常之后,直接抛出(这就是我给出的处理方法)
//如果【抛出的是编译时期异常的话,必须在方法声明上给予声明
thrownew FileNotFoundException();
}
}
privatestatic void method() throws ArithmeticException{
inta = 10;
intb = 2;
if(b==0) {
//在这里抛出的是运行时期异常,抛出这个异常的同时,可以在方法声明上给予声明,也可以不声明
thrownew ArithmeticException();
}else{
System.out.println(a/b);
}
}
}标签:异常、io、file
原文地址:http://12771294.blog.51cto.com/12761294/1924437