Java基础篇之IO流(1)

目录

 

IO流:

异常的概述和继承体系:

JVM针对异常的默认处理方式:

异常处理:

方案1:try...catch...

编译时异常和运行时异常的区别:

异常处理方案2:

File类:

File类的创建功能:

File类的删除功能:

File类的判断和获取功能:

IO流的概述和分类:

FileOutputStream:

FileInputStream:

字节流练习之复制文本:

字节流练习之复制图片:


IO流:

异常的概述和继承体系:

异常:就是程序出现了不正常的情况

如:ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。

Throwable 类是 Java 语言中所有错误或异常的超类。

Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。

也就是说针对程序发生了Error的情况,Java程序本身是无能为力的,比如说硬件层面的问题,如内存不足,针对Error的问题我们不处理

Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。也就是说针对程序发生了Exception的情况,是我们需要处理的问题。

Exception的分类:

运行期的异常(RunTimeException):在编译期是不处理的,在程序运行时候出现了问题,需要我们回来修改代码。

编译期的异常(非RunTimeException):在编译期就必须处理,否则程序不能通过编译,就更不能正常的执行了。

异常的体系:

Throwable

Error:严重问题,不需要处理

Exception:

RuntimeException:在编译期是不处理的,在程序运行时候出现了问题,需要我们回来修改代码。

非RunTimeException:在编译期就必须处理,否则程序不能通过编译,就更不能正常的执行了。

JVM针对异常的默认处理方式:

java.lang.ArithmeticException:异常的类名,包括包名

如果程序出现了问题,我们没有任何的处理,最终JVM会做出默认的处理。

处理方案:

A.把异常的名称,异常的原因,异常出现的位置等信息在控制台输出。

B.让程序停止运行。

异常处理:

方案1:try...catch...

格式:

try {

可能出现异常的代码;

 }catch(异常类名  变量名(出现异常返回的一个对象)) {

异常的处理代码;

 }

public void printStackTrace():把异常的错误信息输出在了控制台。

在实际开发中,遇见异常,会给出一个页面进行提示,而我们目前做不了,所以,就用异常对象调用printStackTrace()方法就可以了。

public class Test1 {
    public static void main(String[] args) {
        System.out.println("程序开始执行");
        method();
        System.out.println("程序接受执行");
    }
    public static void method(){
        try{
        int a = 10;
        int b = 5;
        b = 0;
        System.out.println(a/b);}
        catch (ArithmeticException e){
            e.printStackTrace();
        }
    }

}

显示:

程序开始执行
java.lang.ArithmeticException: / by zero
    at Day_13.Test1.method(Test1.java:20)
    at Day_13.Test1.main(Test1.java:12)
程序接受执行

编译时异常和运行时异常的区别:

编译时异常:Java程序必须显示处理,否则程序就会发生错误的一个提示,无法通过编译

运行时异常:Java程序无需显示处理,也可以和编译时异常一样处理

异常处理方案2:

throws

我们通过try...catch可以进行异常的处理了,但不是所有的时候我们都有权限进行异常的处理。

也就是说,有些时候我们处理不了,但是,这个时候异常是存在的,这时,就需要throws的处理方案

格式:

throws 异常类名

注意:这个格式必须跟在方法的括号后面

编译时异常时必须要进行处理的,两种处理方案:try...catch...或者throws

如果你采用了throws这种方案,将来谁调用,还得进行处理。

运行时异常可以不用处理,出现问题后我们需要回来修改代码。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test1 {
    public static void main(String[] args) throws ParseException {
        System.out.println("程序开始执行");
        method2();
        method();
        System.out.println("程序接受执行");
    }
    public static void method()throws ArithmeticException{
        int a = 10;
        int b = 5;
        b = 0;
        System.out.println(a/b);
    }
    public static void method2() throws ParseException {
        String s = "2018-02-01";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date d = sdf.parse(s);
        System.out.println(d);
    }

}

输出结果:

Thu Feb 01 00:00:00 CST 2018
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Day_13.Test1.method(Test1.java:25)
    at Day_13.Test1.main(Test1.java:17)

File类:

File:文件和目录路径名的抽象表示形式

文件和目录是可以通过File封装成对象的

目录:其实就是文件夹

File的构造方法:

File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

File(String parent, String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

File(File parent, String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

import java.io.File;

public class MyFile {
    public static void main(String[] args) {
        File f = new File("C:\\Users\\MR.chan\\Desktop");
        File f1= new File("C:\\Users\\MR.chan\\Desktop","新建文本文档 (3).txt");
        File f2 = new File(f,"新建文本文档 (3).txt");
        File f3 = new File("C:\\Users\\MR.chan\\Desktop\\新建文本文档 (3).txt");
    }
}

File类的创建功能:

public boolean createNewFile():创建文件

如果文件不存在,创建文件并返回true

如果文件存在,创建文件失败并返回false

public boolean mkdir():创建目录

如果目录不存在,创建目录并返回true

 如果目录存在,创建目录失败并返回false

public boolean mkdirs():创建多级目录

import java.io.File;
import java.io.IOException;

public class MyFile2 {
    public static void main(String[] args) throws IOException {
        //需求1:创建一个文件a.txt
        File f1 = new File("d:\\a.txt");
        System.out.println("createNewFile:"+f1.createNewFile());
        //需求2:在d盘创建一个目录bb
        File f2 = new File("d:\\bb");
        System.out.println("mkdir:"+f2.mkdir());
        System.out.println("---");
        File f3 = new File("d:\\aa\\bb");
        System.out.println("mkdirs:"+f3.mkdirs());
        File f4 = new File("d:\\aa\\bb\\a.txt");
        System.out.println(f4.createNewFile());
    }
}

File类的删除功能:

删除功能

public boolean delete():删除文件和目录

路径 问题:

绝对路径:是以盘符开始的路径

相对路径:不以盘符开始。相对于当前的项目而言,在项目的目录下。刷新即可显示出来。

注意:

如果一个目录中有内容(目录,文件),就不能直接删除。

应该先删除目录中的内容,最后才能删除目录。

File类的判断和获取功能:

判断功能

public boolean isDirectory():判断是否是目录

public boolean isFile():判断是否是文件

public boolean exists():判断是否存在

获取功能

public String getAbsolutePath():获取绝对路径

public String getPath():获取相对路径

public String getName():获取名称

import java.io.File;
import java.io.IOException;

public class FileDemo {
    public static void main(String[] args) throws IOException {
        File f = new File("aa\\a.txt");
        System.out.println("isDirectory:"+f.isDirectory());
        System.out.println("isFile:"+f.isFile());
        System.out.println("exists:"+f.exists());
        System.out.println("getAbsolutePath:"+f.getAbsolutePath());
        System.out.println("getPath:"+f.getPath());
        System.out.println("getName:"+f.getName());
    }
}

输出结果:

isDirectory:false
isFile:true
exists:true
getAbsolutePath:d:\IdeaProjects\Day_13\aa\a.txt
getPath:aa\a.txt
getName:a.txt

IO流的概述和分类:

IO流:用来处理设备间的数据传输问题

常见应用:

文件复制

文件上传

文件下载

IO流分类:

流向

         输入流

         输出流

数据类型

         字节流:输入流  输出流

         字符流(可通过windows自带记事本软件打开的内容):输入流  输出流

FileOutputStream:

字节流:

InputStream             字节输入流

OutputStream          字节输出流

字符流:

Reader     字符输入流

Writer      字符输出流

字节流写数据

OutputStream:此抽象类是表示输出字节流的所有类的超类

FileOutputStream:文件输出流是用于将数据写入 File

构造方法:

FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。

字节流写数据的步骤:

A:创建字节输出流对象

B:调用写数据的方法

C:释放资源

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("a.txt");
        fos.write(65);
        fos.write(66);
        fos.close();
    }
}

写数据的三种方式

public void write(int b):一次写一个字节
public void write(byte[] b):一次写一个字节数组
public void write(byte[] b,int off,int len):一次写一个字节数组的一部分

String类中的方法:byte[] getBytes()  将字符串转换为字节数组

import java.io.FileOutputStream;
import java.io.IOException;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        //FileOutputStream fos = new FileOutputStream(new File("d.txt"));
        FileOutputStream fos = new FileOutputStream("c.txt");
//        fos.write(65);
//        fos.write(66);
        //一次写一个字节数组
//        byte[]arr = {65,66,67,68,69};
//        fos.write(arr);
        byte []arr = "ABCE".getBytes();
        fos.write(arr);
        fos.close();
    }
}

如何实现换行和追加写数据:

不同的操作系统,针对换行的符号标识是不一样的

windows:\t\n

linux:\n

mac:\r

FileOutputStream(String name,boolean append)

如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处

import java.io.FileOutputStream;
import java.io.IOException;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        //FileOutputStream fos = new FileOutputStream(new File("d.txt"));
        FileOutputStream fos = new FileOutputStream("c.txt",true);
        for(int x = 0;x<10;x++){
            fos.write("hello".getBytes());
            fos.write("\t\n".getBytes());
        }
        fos.close();
    }
}

字节流写数据加入异常:

格式:

 try{

可能发生问题的代码

}catch(){

处理异常代码

}finally{

一定会被执行的代码.   // 通常用于释放资源, 做善后的动作

}

public class FileOutputStreamDemo4 {
	public static void main(String[] args) {
		FileOutputStream fos = null;
		try{
			//FileOutputStream fos = new FileOutputStream("d.txt");
//			fos = new FileOutputStream("z:\\d.txt");
			fos = new FileOutputStream("d.txt");
			fos.write("hello".getBytes());
		}catch(IOException e) {
			e.printStackTrace();
		}finally {
			if(fos!=null) {
				//释放资源
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

FileInputStream:

输出流

构造方法:

FileInputStream(String name)

 字节流读数据的步骤:

A:创建字节输入流对象

B:调用读数据的方法

C:释放资源

通过read()方法

一直读取数据,当读到无数据时,会返回-1

一次读取一个字节:

import java.io.*;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        //FileOutputStream fos = new FileOutputStream(new File("d.txt"));
        FileInputStream fis = new FileInputStream("a.txt");
//        int by = fis.read();//读取一个字节的数据值
        System.out.println(by);
        System.out.println((char)by);
        by = fis.read();
        System.out.println(by);
        System.out.println((char)by);
        int by;
        while ((by=fis.read())!=-1){
            System.out.print((char)by);
        }
        fis.close();
    }
}

一次读取一个字节数组

public int read(byte[] b):

从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中

返回值是读入缓冲区的字节总数,也就是实际的读取个数

如果因为已经到达文件末尾而没有更多的数据,则返回 -1。

import java.io.*;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        //FileOutputStream fos = new FileOutputStream(new File("d.txt"));
        FileInputStream fis = new FileInputStream("c.txt");
        byte []by = new byte[1024];
        int len;
        while ((len=fis.read(by))!=-1){
            System.out.print(new String (by,0,len));
        }
        fis.close();
    }
}

字节流练习之复制文本:

文件复制,其实就是从一个文件中读数据,然后把数据写到另一个文件中

数据源:

目的地:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo22 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("c:Users\\MR.chan\\Desktop\\2020219100331-pqu9qj\\resource\\窗里窗外.txt");
        FileOutputStream fos = new FileOutputStream("林青霞3.txt");
//        int by;
//        while ((by = fis.read())!=-1){
//            fos.write(by);
//        }
        byte[]bys = new byte[1024];
        int len;
        while ((len = fis.read(bys))!=-1){
            fos.write(bys,0,len);
        }
        fos.close();
        fis.close();
    }
}

字节流练习之复制图片:

代码如下:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo33 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:\\Users\\MR.chan\\Desktop\\2020219100331-pqu9qj\\resource\\mn.jpg");
        FileOutputStream fos = new FileOutputStream("林青霞.jpg");
        byte[]bys = new byte[1024];
        int len;
        while ((len = fis.read(bys))!=-1){
            fos.write(bys,0,len);
        }
        fos.close();
        fis.close();
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值