异常
异常的分类(Throwable):
- 异常(Exception):可预料的。应用程序可能需要捕获的异常:NullPointerException
- 错误(Error):不可预料的。合理的应用程序不应该试图捕获的问题:StackOverFlowError
异常的处理方式:
- JVM默认的异常处理方式:控制台打一个错误信息。
- 开发中异常的处理方式
try...catch(finally):捕获,自己处理
throws:抛出,交给调用者处理 - try...catch(finally):
try { // 尝试执行的代码 }catch (Exception e){ // 出现可能的异常之后的处理代码 }finally { // 一定会执行的代码,如关闭资源 }
IO流概述
IO流指的是数据像连绵的流体一样进行传输。能够在本地磁盘和网络上传输。
BufferedReader:高校的字符输入流(字符缓冲输入流)。
IO流分类:
数据流向分:输出流 (读数据),输入流(写数据)。
操作方式:
字节流:以字节为单位操作数据。
InputStream:字节输入流的顶层抽象类。
FileInputStream:普通的字节输入流。
BufferedInputStream:高校的字节输入流(字节缓冲输入流)。
OutputStream:字节输出流的顶层抽象类。
FileOutputStream:普通的字节输出流。
BufferedIOutputStream:高校的字节输出流(字节缓冲输出流)。
字符流:以字符为单位操作数据
Reader:字符输入流的顶层抽象类。
FileReader:普通的字符输入流。
Writer:字符输出流的顶层抽象类。
FileWriter:普通的字符输出流。
BufferedWriter:高校的字符输出流(字符缓冲输出流)。
File类
File基本如下:
public static void main(String[] args) throws IOException {
// 创建File对象的构造方法:
File file = new File("D:/1.txt");
File file1 = new File("D:/","1.txt");
File file2 = new File("D:/");
File file3 = new File(file2 , "1.txt");
System.out.println(file);
System.out.println(file1);
System.out.println(file3);
file.exists();
file.createNewFile();
file.isDirectory();
file.isFile();
}
File成员的获取方法:
- 获取绝对路径:getAbsolutePath(),以盘符开头:D:/1.txt
- 获取相对路径:getPath(),相对于当前项目路径来说。
- getName():获取文件名。
- list():返回指定目录下所有文件(夹)名称数组:String[ ]
- listFiles():返回指定目录下所有文件(夹)File数组: File[ ]
字符流读写文件
Reader:一旦实例化对象之后进行read()方法之后,会记录上次的调用。
- 按单个字符读取:
public static void main(String[] args) throws IOException { File file = new File("lib/1.txt"); Reader reader = new FileReader(file); int ch; // 错误的写法 // while(reader.read() != -1){ // 此时判断时 会直接读取 // ch = reader.read(); // 再次读取时 跳到下一个字符 // System.out.println(ch); // } while ((ch = reader.read()) != -1){ System.out.println(ch); } reader.close(); }
- 按字符数组进行读取:
public static void main(String[] args) throws IOException { File file = new File("lib/2.txt"); Reader reader = new FileReader(file); // 定义字符数组 存储每次读取的字符 char[] chs = new char[3]; // 记录reader读取的数组中的字符的个数 int len ; while ((len = reader.read(chs)) != -1){ String string = new String(chs , 0 , len); /* chs : 表示要操作的数组 0 : 表示起始的索引 len: 表示要操作的字符的个数 */ System.out.println(string); } reader.close(); /*输出: abc def g */ }
- 字符流写文件-按单个字符
public static void main(String[] args) throws IOException { Writer writer = new FileWriter("lib/1.txt"); //第一种 // writer.write("你"); // 第二种 // char[] chs = {'你','好','啊'}; // writer.write(chs); // writer.write(chs,1,1); // 第三种 writer.write("好好学习,天天向上"); // 释放资源 writer.close(); }
- 文件拷贝
单个字符:
字符数组:public static void main(String[] args) throws IOException { Reader file = new FileReader("lib/1.txt"); // FileReader file = new FileReader("lib/1.txt"); Writer writer = new FileWriter("lib/3.txt"); int len; while ((len = file.read()) != -1){ System.out.println(len); writer.write(len); } // 关闭资源 file.close(); writer.close(); }
public static void main(String[] args) throws IOException { FileReader fileReader = new FileReader("lib/1.txt"); FileWriter fileWriter = new FileWriter("lib/4.txt"); char[] chs = new char[1024]; int len; while((len = fileReader.read(chs)) != -1){ fileWriter.write(chs , 0 ,len); } fileReader.close(); fileWriter.close(); }
字节流读写文件(拷贝除纯文本文件,如:图片、音频、视频等)
public static void main(String[] args) throws IOException {
SingleBy();
// ArrayBy();
// BufferCopy();
}
// 单个字节进行拷贝
public static void SingleBy() throws IOException{
FileInputStream fileInputStream = new FileInputStream("lib/1.txt");
FileOutputStream fileOutputStream = new FileOutputStream("lib/2.txt");
int len;
while((len = fileInputStream.read()) != -1){
fileOutputStream.write(len);
}
fileInputStream.close();
fileOutputStream.close();
}
// 按数组进行拷贝
public static void ArrayBy() throws IOException{
FileInputStream fileInputStream = new FileInputStream("lib/3.png");
FileOutputStream fileOutputStream = new FileOutputStream("lib/4.png");
byte[] b = new byte[2048];
int len;
while ((len = fileInputStream.read(b)) != -1){
fileOutputStream.write(b , 0 ,len);
}
fileInputStream.close();
fileOutputStream.close();
}
// 字节缓冲流进行文件拷贝
public static void BufferCopy() throws IOException{
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("lib/1234.zip"));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("lib/2345.zip"));
byte[] b =new byte[2048];
int len;
while((len = bufferedInputStream.read(b)) != -1){
bufferedOutputStream.write(b , 0 ,len);
}
bufferedInputStream.close();
bufferedOutputStream.close();
}
模拟上传图片(手动输入文件路径)
public static void main(String[] args) throws IOException{
// 1. 获取文件路径
File file = getPath();
// 2.判断在目的地文件夹中是否存在对应的文件
System.out.println(isExists(file));
if (isExists(file)){
System.out.println("图像已经存在!");
}else {
uploadFile(file);
System.out.println("头像传输成功!");
}
}
public static File getPath(){
// 1. 提示用户输入对应的文件路径
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("请输入文件的路径:");
String path = sc.nextLine();
// 如果不是.jpg 、.png 、 .bmp文件结尾的时候
if(!path.endsWith(",jpg") && !path.endsWith(".png") && !path.endsWith(".bmp")){
System.out.println("你输入的文件不是图片文件!请重新输入:");
continue;
}
// 判断文件是否存在
// 将path封装成File类型 isFile() and exists()
File file = new File(path);
if (!file.exists() && !file.isFile()){
System.out.println("存在否:"+file.exists());
System.out.println("文件输入有误,请重新输入:");
}else {
return file;
}
}
}
public static boolean isExists(File file){
// 遍历目的地文件夹下的所有图片文件,查看是否相同
File file1 = new File("picture/");
String[] fileName = file1.list();
for (String name:fileName) {
System.out.println(name);
if(name.equals(file.getName())){
return true;
}
}
return false;
}
public static void uploadFile(File file) throws IOException {
// 图片信息用字节流进行传输
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("picture/"+file.getName()));
byte[] bytes = new byte[2048];
int len;
while((len = bis.read(bytes)) != -1){
bos.write(bytes , 0 , len);
}
bis.close();
bos.close();
}