java 之 API-IO

异常概述

异常:异常就是Java程序在运行过程中出现的错误。
异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象。其实就是Java对不正常情况进行描述后的对象体现。
我们见过的异常,角标越界异常,空指针异常

这里写图片描述

JVM的默认处理方案

把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
程序停止执行

异常处理方案

异常处理方案
try…catch…finally
throws

try…catch处理方式

一个异常的情况
多个异常的情况
    平级情况
    存在上下级的情况
    JDK7的新特性及注意事项

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

    Java中的异常被分为两大类:编译时异常和运行时异常。所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常
编译时异常
    Java程序必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常
    无需显示处理,也可以和编译时异常一样处理

Throwable中的方法

getMessage()
    获取异常信息,返回字符串。
toString()
    获取异常类名和异常信息,返回字符串。
printStackTrace()
    获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
printStackTrace(PrintStream s)
    通常用该方法将异常内容保存在日志文件中,以便查阅。 

throws

定义功能方法时,需要把出现的问题暴露出来让调用者去处理。那么就通过throws在方法上标识。

throw

在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。

throws和throw的区别

throws
    用在方法声明后面,跟的是异常类名
    可以跟多个异常类名,用逗号隔开
    表示抛出异常,由该方法的调用者来处理
    throws表示出现异常的一种可能性,并不一定会发生这些异常
throw
    用在方法体内,跟的是异常对象名
    只能抛出一个异常对象名
    表示抛出异常,由方法体内的语句处理
    throw则是抛出了异常,执行throw则一定抛出了某种异常

到底该如何处理异常呢

原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
区别:
    后续程序需要继续运行就try
    后续程序不需要继续运行就throws
举例:
    感冒了就自己吃点药就好了,try
    吃了好几天药都没好结果得了H7N9,那就的得throws到医院
    如果医院没有特效药就变成Error了

finally的特点作用及面试题

finally的特点
    被finally控制的语句体一定会执行
    特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
finally的作用
    用于释放资源,在IO流操作和数据库操作中会见到
finally相关的面试题
    final,finally和finalize的区别
    如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。

自定义异常

考试成绩必须在0-100之间
很明显java没有对应的异常,需要我们自己来做一个异常
自定义异常
    继承自Exception
    继承自RuntimeException

异常注意事项

子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws

File类概述和构造方法

File类的概述
    文件和目录路径名的抽象表示形式
构造方法
    public File(String pathname)
    public File(String parent,String child)
    public File(File parent,String child)

File类的成员方法

创建功能
    public boolean createNewFile()
    public boolean mkdir()
    public boolean mkdirs()
删除功能
    public boolean delete()
重命名功能
    public boolean renameTo(File dest)

File类的成员方法

判断功能
    public boolean isDirectory()
    public boolean isFile()
    public boolean exists()
    public boolean canRead()
    public boolean canWrite()
    public boolean isHidden()

File类的成员方法

基本获取功能
    public String getAbsolutePath()
    public String getPath()
    public String getName()
    public long length()
    public long lastModified()
高级获取功能
    public String[] list()
    public File[] listFiles()

递归的思想概述

递归
    方法定义中调用方法本身的现象
递归注意实现
    要有出口,否则就是死递归
    次数不能太多,否则就内存溢出
    构造方法不能递归使用

IO流概述

IO流用来处理设备之间的数据传输
    上传文件和下载文件
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中

IO流分类

按照数据流向
    输入流 读入数据
    输出流 写出数据
按照数据类型
    字节流
    字符流
    什么情况下使用哪种流呢?
        如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。
        如果你什么都不知道,就用字节流

IO流常用基类

字节流的抽象基类:
    InputStream ,OutputStream。
字符流的抽象基类:
    Reader , Writer。
    注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
    如:InputStream的子类FileInputStream。
    如:Reader的子类FileReader。

字节流写数据

OutputStream
    FileOutputStream
往一个文本文件中写一句话:”helloworld”
    分析发现其实更适合用字符流,但是由于字节流先出现,所以,我们考虑先使用字节流后面再讲会什么出现字符流。
FileOutputStream的构造方法
    FileOutputStream(File file)
    FileOutputStream(String name)

字节流写数据的方式

public void write(int b)
public void write(byte[] b)
public void write(byte[] b,int off,int len)

字节流读取数据

nputStream
    FileInputStream
把刚才写的数据读取出来显示在控制台
FileInputStream的构造方法
    FileInputStream(File file)
    FileInputStream(String name)
FileInputStream的成员方法
    public int read()
    public int read(byte[] b)

字节缓冲流

    字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流
字节缓冲输出流
    BufferedOutputStream
字节缓冲输入流
    BufferedInputStream

转换流出现的原因及思想

由于字节流操作中文不是特别方便,所以,java就提供了转换流。
字符流=字节流+编码表

编码表概述和常见的编码表

编码表
    由字符及其对应的数值组成的一张表
常见编码表
    ASCII/Unicode 字符集
    ISO-8859-1
    GB2312/GBK/GB18030
    BIG5
    UTF-8

字符串中的编码问题

编码
    把看得懂的变成看不懂的
解码
    把看不懂的变成看得懂的

转换流概述

OutputStreamWriter 字符输出流
    public OutputStreamWriter(OutputStream out)
    public OutputStreamWriter(OutputStream out,String charsetName)
InputStreamReader 字符输入流
    public InputStreamReader(InputStream in)
    public InputStreamReader(InputStream in,String charsetName)

OutputStreamWriter写数据

OutputStreamWriter写数据方法
    public void write(int c)
    public void write(char[] cbuf)
    public void write(char[] cbuf,int off,int len)
    public void write(String str)
    public void write(String str,int off,int len)
字符流操作要注意的问题
    flush()的作用
    flush()和close()的区别

InputStreamReader读数据

OutputStreamWriter读数据方法
    public int read()
    public int read(char[] cbuf)

字符流复制文本文件

把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
把c:\\a.txt内容复制到d:\\b.txt中

转换流的简化写法

转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类。
FileWriter
FileReader

FileWriter和FileReader

FileWriter写数据
FileReader读取数据
FileWriter和FileReader实现文本文件的复制

字符缓冲流

BufferedWriter基本用法
BufferedReader基本用法
字符缓冲流复制文本文件
特殊功能
    BufferedWriter
        void newLine()
    BufferedReader
        String readLine()
字符缓冲流特殊功能复制文本文件

IO流小结

字节流
    字节输入流
    字节输出流
字符流
    字符输入流
    字符输出流

操作基本数据类型的流

操作基本数据类型
    DataInputStream
    DataOutputStream

内存操作流

操作字节数组
    ByteArrayInputStream
    ByteArrayOutputStream
操作字符数组
    CharArrayReader
    CharArrayWrite
操作字符串
    StringReader
    StringWriter

打印流

打印流概述
    字节流打印流
    字符打印流
打印流特点
    只能操作目的地,不能操作数据。
    可以操作任意类型的数据。
    如果启动了自动刷新,能够自动刷新。
    可以操作文件的流
打印流复制文本文件

标准输入输出流

System类中的字段:in,out。
它们各代表了系统标准的输入和输出设备。
默认输入设备是键盘,输出设备是显示器。
System.in的类型是InputStream.
System.out的类型是PrintStream是OutputStream的子类FilterOutputStream 的子类.

随机访问流

RandomAccessFile概述
RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。支持对随机访问文件的读取和写入。

合并流

SequenceInputStream概述
    SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流,因此,该流也被称为合并流。
SequenceInputStream的构造方法
    SequenceInputStream(InputStream s1, InputStream s2)  
    SequenceInputStream(Enumeration<? extends InputStream> e)
    把多个文件的内容写入到一个文本文件

序列化流

序列化流
    ObjectOutputStream
反序列化流
    ObjectInputStream
序列化操作问题
    为什么要实现序列化?
    如何实现序列化?
    序列化数据后,再次修改类文件,读取数据会出问题,如何解决呢?
    使用transient关键字声明不需要序列化的成员变量

Properties集合

Properties概述
Properties作为Map集合的使用
Properties的特殊功能
    public Object setProperty(String key,String value)
    public String getProperty(String key)
    public Set<String> stringPropertyNames()
Properties和IO流的结合使用
    public void load(Reader reader)
    public void store(Writer writer,String comments)

NIO包下的IO流

NIO其实就是新IO的意思。
    JDK4出现NIO。新IO和传统的IO有相同的目的,都是用于进行输入输出的,但新IO使用了不同的方式来处理输入输出,采用内存映射文件的方式,将文件或者文件的一段区域映射到内存中,就可以像访问内存一样的来访问文件了,这种方式效率比旧IO要高很多,但是目前好多地方我们看到的还是旧IO的引用,所以我们仍以旧IO为主,知道NIO即可。
发布了65 篇原创文章 · 获赞 57 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/LiuMiao1128/article/details/53229393