JAVA part13 异常和IO流

JAVA part13 异常和IO流

异常

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

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

Error:
是Throwable的子类,用于指示合理的应用程序不应该试图捕获的严重问题。
也就是说针对程序发生了Error的情况,Java程序本身无能为力。比如说:硬件层面的问题,内存不足等。
所以,针对Error的问题我们不处理

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

RuntimeException:
是那些可能在Java虚拟机正常运行期间抛出的有i长的超类

Exception分为运行期和编译期:
1.运行期(RuntimeException)的异常:在编译期是不处理的,在程序运行出现了问题,休要我们回来修改代码。
2.编译期(非RuntimeException)的异常,在编译期就必须处理,否则程序不能通过编译,就更不能正常执行了。

异常的默认处理方式

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

处理方案:
1.把异常的名称,异常的原因,异常出现的位置等信息输出在控制台上
2.让程序停止执行

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

Java中的异常分为两大类:编译时异常和运行时异常

所有的RuntimeException类及其子类的实力被称为运行时异常,其他的异常都是编译时异常

编译时异常:Java程序必须显示处理,否则程序就会发生错误的一个提示,无法通过编译
运行时异常:Java程序无需显示处理,也可以和编译时异常一样处理。

package Day_13;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class test2 {
    public static void main(String[] args) {
        System.out.println("程序开始执行");
        method();
        method2();
        System.out.println("程序结束执行");
    }
    // 编译时异常
    public static void method(){
        try{
            String s = "2000-01-01";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date d = sdf.parse(s);
            System.out.println(d);
        }catch(ParseException e){
            e.printStackTrace();
        }
        System.out.println("------------------");
    }

    //运行时异常
    public static void method2(){
        try{
            int a = 10;
            int b = 0;
            System.out.println(a/b);
        }catch(ArithmeticException e){
            e.printStackTrace();
        }
    }
}

异常处理的方案

try…catch…

格式:

    try{
        可能出现异常的代码;
    }catch(异常类名 变量名){
        异常的处理代码;
    }

执行流程:
程序从try开始执行,执行到哪里出现了问题,就会跳转到catch里面执行
执行完毕后,程序还能继续往下执行

代码:

package Day_13;

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 = 0;
            System.out.println(a/b);
            System.out.println("节点A");//发生异常,节点A不输出
        }catch(ArithmeticException e){
            System.out.println("除数不能为0");
        }
        System.out.println("节点B");
    }
}

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

package Day_13;

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 = 0;
            System.out.println(a/b);
        }catch(ArithmeticException e){
            e.printStackTrace();
        }
    }
}

输出结果为:

程序开始执行
java.lang.ArithmeticException: / by zero
	at Day_13.test1.method(test1.java:13)
	at Day_13.test1.main(test1.java:6)
程序结束执行
throws

通常我们通过try…catch…对异常进行处理,但并不是所有的时候都有权限进行异常的处理。也就是说有些时候我们处理不了但这个时候异常是存在的,就需要使用Java提供的throws的处理方案

格式:

    throws 异常类名

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

代码:

package Day_13;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class test3 {
    public static void main(String[] args) throws ParseException {
        System.out.println("程序开始执行");
        method();
        method2();
    }
    // 编译时异常
    public static void method() throws ParseException {
        String s = "2000-01-01";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date d = sdf.parse(s);
        System.out.println(d);
    }
    //运行时异常
    public static void method2() throws ArithmeticException{
        int a = 10;
        int b = 0;
        System.out.println(a/b);
    }
}

tips:
1.编译时异常是必须要处理的,两种处理方法:try…catch…或者throws
如果你采用了throws这种方案,将来谁调用,还得进行处理
2.运行时异常可以不用处理,出现问题后回来该代码即可

File类

File:文件和目录路径名的抽象表示形式
也就是说文件和目录时可以通过File封装乘对象的
目录:就是文件夹

File构造方法:

1.File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新File实例。
2.File(String parent, String child):根据parent路径名字符串和child路径名字符串创建一个新File实例
3.File(File parent, String child):根据parent抽象路径名和child路径名字符串创建一个新File实例

package Day_13;

import java.io.File;

public class test4 {
    public static void main(String[] args) {
        //File(String pathname)
        File f1 = new File("d:\\aa\\b.txt");
        //File(String parent, String child)
        File f2 = new File("d:\\aa", "b.txt");
        //File(File parent, String child)
        File f3 = new File("d:\\aa");
        File f4 = new File(f3, "b.txt");
        
        //上面的f1,f2,f4其实做的时同样的事,就是把d:\\aa\\b.txt转换为了一个File对象
    }
}

File类的创建功能

创建功能:
1.public boolean createNewFile():创建文件
如果文件不存在,创建文件并返回true
如果文件存在,创建文件失败并返回false
2.public boolean mkdir():创建目录
如果目录不存在,创建目录并返回true
如果目录存在,创建目录失败并返回false
3.public boolean mkdirs():创建多级目录

代码:

package Day_13;

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

public class test5 {
    public static void main(String[] args) throws IOException {

        //public boolean createNewFile()创建文件
        File f1 = new File("d:\\a.txt");
        System.out.println("creatNewFile:"+f1.createNewFile());
        //public boolean mkdir()创建目录
        File f2 = new File("d:\\bb");
        System.out.println("mkdir:"+f2.mkdir());
        //public boolean mkdirs()创建多级目录
        File f3 = new File("d:\\cc\\dd");
        System.out.println("mkdirs:"+f3.mkdirs());
    }
}

File类的删除功能

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

路径问题:
1.绝对路径:是以盘符开始的路径。d:\aa\b.txt
2.相对路径:不以盘符开始,相对于当前的项目而言,在项目的额目录下。

tips:
如果一个目录中有内容(目录、文件)就不能直接删除,需要先删除目录中的内容,再删除内容

代码:

package Day_13;

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

public class test6 {
    public static void main(String[] args) throws IOException {
        //删除a.txt文件
        File f1 = new File("a.txt");
        System.out.println("delete:"+f1.delete());

        //删除无内容的bb目录
        File f2 = new File("bb");
        System.out.println("delete:"+f2.delete());

        //删除有内容的cc目录
        File f3 = new File("cc//dd.txt");
        System.out.println("delete:"+f3.delete());
    }
}

File类的判断和获取功能

判断功能:
public boolean isDirectory():判断是否是目录
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在
获取功能:
public String getAbsolutePath():获取绝对地址
public String getPath():获取相路径
public String getName():获取名称

代码:

package Day_13;

import java.io.File;

public class test7 {
    public static void main(String[] args) {
        
        //创建File对象
        File f = new File("aaa\\bbb.txt");
        
        //判断功能
        System.out.println("isDirectory:"+f.isDirectory());
        System.out.println("isFile:"+f.isFile());
        System.out.println("exists:"+f.exists());
        System.out.println("------------");
        
        //获取功能
        System.out.println("getAbsolutePath:"+f.getAbsolutePath());
        System.out.println("getPath:"+f.getPath());
        System.out.println("getName:"+f.getName());
    }
}

IO流

是用来处理设备间数据传输问题的

常见的应用:
文件复制
文件上传
文件下载

IO流分类:
输入流、输出流
输入流即为读数据
输出流即为写数据

数据类型:
字节流输入流、字节流输出流
字符流输入流、字符流输出流
字符流数据通过windows系统自带的 记事本软件打开时可以读懂里面的内容的

FileOutputStream写数据

字节流:
InputStream 字节输入流
OutputSteam 字节输出流

字符流:
Reader 字符输入流
Writer 字节输出流

字节流写数据:
OutputSteam:此抽象类时表示输出字节流的所有类的超类
FileOutputStream:文件输出流时用于将数据写入File

构造方法:
FileOutputStream(String name):创建一个想具有指定名称的文件中写入数据的输出文件流

创建字节输出流对象做了三件事:
1.调用系统功能创建了文件
2.创建字节输出流对象
3.让fos这个对象指向a.txt这个文件

字节流写数据的步骤:
1.创建字节输出流对象
2.调用写数据的方法
3.释放资源

代码:

package Day_13;

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

public class test8 {
    public static void main(String[] args) throws IOException {

        //创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("a.txt");

        //write(int b)
        fos.write(65);
        fos.write(66);
        
        //释放资源
        fos.close();
    }
}
FileOutputStream写数据的三种方式

构造方法:
FileOutputStream(String name)
FileoutputSteam(File file)

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

public void write(int b):一次写一个字节

package Day_13;

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

public class test9 {
    public static void main(String[] args) throws IOException {

        //创建字节输出流对象
        //FileOutputStream(String name)
        FileOutputStream fos = new FileOutputStream("b.txt");

        //public void write(int b):一次写一个字节
        fos.write(65);
        
        //释放资源
        fos.close();
    }
}

public void write(byte[ ] b):一次写一个字节数组

package Day_13;

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

public class test9 {
    public static void main(String[] args) throws IOException {

        //创建字节输出流对象
        //FileOutputStream(String name)
        FileOutputStream fos = new FileOutputStream("b.txt");

        //public void write(byte[ ] b):一次写一个字节数组
        byte[] bys = {65, 66, 67, 68, 69};
        fos.write(bys);
        
        //写一个字符串数组
        fos.write("ABCDE".getBytes());

        //释放资源
        fos.close();
    }
}

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

package Day_13;

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

public class test9 {
    public static void main(String[] args) throws IOException {

        //创建字节输出流对象
        //FileOutputStream(String name)
        FileOutputStream fos = new FileOutputStream("b.txt");

        //public void write(byte[ ] b, int off, int len):一次写一个字节数组的一部分
        fos.write("ABCDE".getBytes(),0, 3);
        
        //释放资源
        fos.close();
    }
}
FileOutputStream实现换行和追加写入

实现换行:
不同的操作系统针对换行的符号识别时不一样的:
windows: \r\n
linux: \n
mac: \r

实现数据的追加写入:
用构造方法第二个参数是true的情况即可

代码:

package Day_13;

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

public class test10 {
    public static void main(String[] args) throws IOException {
        
        //创建字节输出流对象,如果第二个参数为true,则将他字节写入文件末尾处,而不是写入文件开始处
        FileOutputStream fos = new FileOutputStream("c.txt", true);
        
        //调用写数据的方法
        for(int x=0; x<10; x++){
            fos.write("hello".getBytes());
            //加入换行符号
            fos.write("\r\n".getBytes());
        }
        //释放资源
        fos.close();
    }
}
FileOutputStream写数据加入异常处理
package Day_13;

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

public class test11 {
    public static void main(String[] args){

        FileOutputStream fos = null;

        try{
            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读取

读取方式分两种:
1.一次读取一个字节:

package Day_13;

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

public class test12 {
    public static void main(String[] args) throws IOException {

        FileInputStream fis = new FileInputStream("a.txt");

        int by;
        while((by=fis.read()) != -1);{
            System.out.println((char)by);
        }
        fis.close();
    }
}

2.一次读取一个字节数组:

package Day_13;

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

public class test13 {
    public static void main(String[] args) throws IOException {

        FileInputStream fis = new FileInputStream("b.txt");

        byte[] bys = new byte[1024];//1024或1024的整数倍
        int len;
        while((len=fis.read(bys)) != -1){
            System.out.println(new String(bys, 0, len));
        }
        fis.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误提示是处理multipart/form-data请求时出现了问题,具体是java.io.eofexception异常。这个异常表示在读取输入流时,已经到达了流的末尾,但是还在尝试读取数据,导致读取失败。可能是请求中的数据不完整或者格式不正确导致的。需要检查请求数据的完整性和格式是否正确,或者检查代码中处理请求的部分是否有问题。 ### 回答2: multipart/form-data是一种常见的表单数据格式,由于其文件上传的功能在Web开发中被广泛使用。当使用Java编程语言处理multipart/form-data请求时,可能会遇到“processing of multipart/form-data request failed. java.io.eofexception”错误。 在Java中,通过使用Apache Commons FileUpload库来处理表单数据。该库提供了一个FileUpload类,该类可以从HTTP请求中提取并解析文件上传表单数据。 使用FileUpload类将multipart/form-data请求解析为文件,其中每个文本域和文件域都可以包含一个或多个值。此外,它还提供了一个InputStream,用于读取文件上传的内容。 然而,在处理multipart/form-data请求时,如果遇到EOFException,表示程序已经读取完毕,但仍没有获得正确的数据。通常,这是由于客户端突然关闭了连接或上传过程中出现了网络问题。 为了解决EOFException,在处理multipart/form-data请求时,可以添加一个try-catch块来捕获EOFException异常并处理它。另外,还可以使用检查和校验数据来确保multipart/form-data请求的完整性和正确性。 总之,处理multipart/form-data请求的过程可能会出现一些异常,而EOFException是其中的一种。在处理multipart/form-data请求时,我们需要仔细检查和校验数据,并进行适当的错误处理,以确保Web应用程序的安全和稳定性。 ### 回答3: multipart/form-data 是一种常见的 HTTP 请求数据格式,在这种格式下,HTTP 请求被分成多个部分进行传输。这些部分在传输过程中是以二进制的形式进行拼接的。在 Java 应用程序中,我们可以使用 Servlet API 提供的 Part 接口和 MultipartConfig 注解来处理 HTTP 请求中的 multipart/form-data 数据。 然而,当处理 multipart/form-data 请求时,有时会出现 “processing of multipart/form-data request failed. java.io.eofexception” 这样的异常。 其中,EOF 代表的是 End of File,也就是文件结束的标志。在 Java 中,IOException 是常见的输入输出异常,是由于在处理 IO 流时出现错误所导致的。 在处理 multipart/form-data 请求时,通常会使用 InputStream 类中的 read() 方法读取二进制数据。当请求中的二进制数据被读取完毕后,InputStream 会返回 -1 作为文件结束的标志。EOFException 的出现就是因为程序试图从 InputStream 读取不存在的数据。 造成这个问题的原因可能是由于传输的 multipart/form-data 请求数据不完整或者没有读取完全,从而造成解析时出现 EOFException 异常。也有可能是单个文件或者多个文件某个文件大小过大,超出了程序可以处理的限制。 解决该问题的方法可以尝试增加可读取数据的大小,修改应用程序中的配置文件,或者更改所使用的框架或 API。可以使用支持大文件传输处理的第三方框架,如Apache FileUpload和Spring MultiPart File,或者将数据上传至云存储并使用链接进行访问以避免超出应用限制的问题。 综上所述,解决 “processing of multipart/form-data request failed. java.io.eofexception” 异常的方法有多种,需要根据具体情况进行具体分析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值