java文件流IO基础入门.docx
《java文件流IO基础入门.docx》由会员分享,可在线阅读,更多相关《java文件流IO基础入门.docx(24页珍藏版)》请在冰点文库上搜索。
java文件流IO基础入门
1异常的概述
●异常:
异常就是Java程序在运行过程中出现的错误。
●异常由来:
问题也是现实生活中一个具体事务,也可以通过java的类的形式进行描述,并封装成对象。
其实就是Java对不正常情况进行描述后的对象体现。
●我们见过的异常,角标越界异常,空指针异常
●讲解IO流之前为什么先讲解异常和File类呢?
●因为File表示的是IO流将来要操作的文件,所以我们需要学习File类。
●而操作文件无非就是上传文件和下载文件,在这个操作的过程中可能出现问题,
●出现问题后,我们需要对对应的代码进行处理。
所以我们需要学习异常异常。
异常分类
异常分三类:
骑车去旅行:
Error:
走到半路上,发生山路塌陷,或者出现了泥石流,这个问题很严重,不是班长能够立马解决的。
Exception:
出门前,班长要看看车轮子以及车链子等是否还在
RuntimeException:
在骑车的过程中,有好路不走,偏偏要走石子路
1,编译时异常
除了RuntimeException及其子类,Exception中所有的子类都是,这种异常必须要处理,要不编译通不过
2,运行是异常
RuntimeException及其子类都是,这种异常不用处理,编译会通过,不过这样的程序会有安全隐患,遇到这种异常是需要改代码的
3,严重错误问题
用Error进行描述,这个问题发生后,一般不编写针对代码进行处理,而是要对程序进行修正.通常都是由虚拟机抛出的问题
异常举例
●除数为0
●数组访问越界
2JVM的默认处理方案
●把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
●程序停止执行
●jvm发现运算是已经违反了数学运算规则,java将这种常见的问题进行描述,并封装成了对象叫做ArithmeticException
●当除0运算发生后,jvm将该问题打包成了一个异常对象.
●并将对象抛给调用者main函数,newArithmeticException("/byzero");
●main函数收到这个问题时,有两种处理方式:
●1,自己将该问题处理,然后继续运行
●2,自己没有针对的处理方式,只有交给调用main的jvm来处理
●jvm有一个默认的异常处理机制,就将该异常进行处理.并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上
●同时将程序停止运行
3异常处理方案
●异常处理方案
•try…catch…finally
•throws
try…catch处理方式
●一个异常的情况
●多个异常的情况
•平级情况
•存在上下级的情况
•JDK7的新特性及注意事项
●基本格式:
try是检测异常,catch是用来捕获异常的,finally是用来结束资源的
●世界上最真情的相依,是你在try我在catch,无论你发神马脾气,我都默默接受,静静处理
●分别采用RuntimeException和非RuntimeException举例
4编译时异常和运行时异常的区别
●Java中的异常被分为两大类:
编译时异常和运行时异常。
所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常
●编译时异常
•Java程序必须显示处理,否则程序就会发生错误,无法通过编译
●运行时异常
•无需显示处理,也可以和编译时异常一样处理
5Throwable中的方法
●getMessage()
•获取异常信息,返回字符串。
●toString()
•获取异常类名和异常信息,返回字符串。
●printStackTrace()
•获取异常类名和异常信息,以及异常出现在程序中的位置。
返回值void。
●printStackTrace(PrintStream s)
•通常用该方法将异常内容保存在日志文件中,以便查阅。
6throws
●定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
那么就通过throws在方法上标识。
●举例分别演示编译时异常和运行时异常的抛出
●在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
●举例分别演示编译时异常对象和运行时异常对象的抛出
7throws和throw的区别
●throws
•用在方法声明后面,跟的是异常类名
•可以跟多个异常类名,用逗号隔开
•表示抛出异常,由该方法的调用者来处理
•throws表示出现异常的一种可能性,并不一定会发生这些异常
●throw
•用在方法体内,跟的是异常对象名
•只能抛出一个异常对象名
•表示抛出异常,由方法体内的语句处理
•throw则是抛出了异常,执行throw则一定抛出了某种异常
8我们到底该如何处理异常呢
●原则:
如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
●区别:
•后续程序需要继续运行就try
•后续程序不需要继续运行就throws
●举例:
•感冒了就自己吃点药就好了,try
•吃了好几天药都没好结果得了H7N9,那就的得throws到医院
如果医院没有特效药就变成Error了
9finally的特点作用及面试题
●finally的特点
•被finally控制的语句体一定会执行
•特殊情况:
在执行到finally之前jvm退出了(比如System.exit(0))
●finally的作用
•用于释放资源,在IO流操作和数据库操作中会见到
●finally相关的面试题
•final,finally和finalize的区别
•如果catch里面有return语句,请问finally的代码还会执行吗?
如果会,请问是在return前还是return后。
●try…catch…finally可以使用
●try…catch也可以使用
●try…finally也可以使用
●但是,catch,finally不能单独使用
10自定义异常
●考试成绩必须在0-100之间
●很明显java没有对应的异常,需要我们自己来做一个异常
●自定义异常
•继承自Exception
•继承自RuntimeException
异常注意事项
●子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
(父亲坏了,儿子不能比父亲更坏)
●如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
●如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
11File类概述和构造方法
●File类的概述
•文件和目录路径名的抽象表示形式
●构造方法
•publicFile(Stringpathname)
•publicFile(Stringparent,Stringchild)
•publicFile(Fileparent,Stringchild)
●通过创建对象后,我们再来理解文件和目录路径名的抽象表示形式这句话的意思:
●仅仅是一个路径的表示,不代码具体的事物一定是存在的。
12File类的成员方法
●创建功能
•publicbooleancreateNewFile()
•publicbooleanmkdir()
•publicbooleanmkdirs()
●删除功能
•publicbooleandelete()
●重命名功能
•publicbooleanrenameTo(Filedest)
13File类的成员方法
●判断功能
•publicbooleanisDirectory()
•publicbooleanisFile()
•publicbooleanexists()
•publicbooleancanRead()
•publicbooleancanWrite()
•publicbooleanisHidden()
●基本获取功能
•publicStringgetAbsolutePath()
•publicStringgetPath()
•publicStringgetName()
•publiclonglength()
•publiclonglastModified()
●高级获取功能
•publicString[]list()
•publicFile[]listFiles()
●判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称
●文件名称过滤器的实现思想及代码
•publicString[]list(FilenameFilterfilter)
•publicFile[]listFiles(FilenameFilterfilter)
•查看源码看执行流程
14递归的思想概述
●递归
•方法定义中调用方法本身的现象
●递归注意实现
•要有出口,否则就是死递归
•次数不能太多,否则就内存溢出
•构造方法不能递归使用
●递归举例:
●从前有座山…
●我们学编程…
15递归解决问题的思想及内存图
●递归解决问题的思想
•找到出口
•找到规律
●求阶乘案例
•普通for循环
•递归实现
•画内存图
•断点查看执行流程
16IO流概述
●IO流用来处理设备之间的数据传输
•上传文件和下载文件
●Java对数据的操作是通过流的方式
●Java用于操作流的对象都在IO包中
17IO流分类
●按照数据流向
•输入流读入数据
•输出流写出数据
●按照数据类型
•字节流
•字符流
•什么情况下使用哪种流呢?
•如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。
其他用字节流。
•如果你什么都不知道,就用字节流
IO流的分类如果没有明确指定,默认指按照数据类型分。
18IO流常用基类
●字节流的抽象基类:
•InputStream,OutputStream。
●字符流的抽象基类:
•Reader,Writer。
●注:
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
•如:
InputStream的子类FileInputStream。
•如:
Reader的子类FileReader。
19字节流写数据
●OutputStream
•FileOutputStream
●往一个文本文件中写一句话:
”helloworld”
•分析发现其实更适合用字符流,但是由于字节流先出现,所以,我们考虑先使用字节流后面再讲会什么出现字符流。
●FileOutputStream的构造方法
•FileOutputStream(Filefile)
•FileOutputStream(Stringname)
●publicvoidwrite(intb)
●publicvoidwrite(byte[]b)
●publicvoidwrite(byte[]b,intoff,intlen)
20字节流写数据常见问题
●创建字节输出流到底做了哪些事情?
●数据写成功后,为什么要close()?
●如何实现数据的换行?
●如何实现数据的追加写入?
●加入异常处理的IO流操作
21字节流读取数据
●InputStream
•FileInputStream
●把刚才写的数据读取出来显示在控制台
●FileInputStream的构造方法
•FileInputStream(Filefile)
•FileInputStream(Stringname)
●FileInputStream的成员方法
•publicintread()
•publicintread(byte[]b)
字节流读取数据两种方式图解比较
●一次读取一个字节
●一次读取一个字节数组
•每次可以读取多个数据,提高了操作效率
●喝水:
●一次喝一滴水
●一次喝一口水
●搬运东西
●一次搬一件
●一次搬多件
●
●复制数据的最基本思想:
●数据源:
读数据
●目的地:
写数据
22字节缓冲流
●字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流
●字节缓冲输出流
•BufferedOutputStream
●字节缓冲输入流
•BufferedInputStream
23转换流出现的原因及思想
●由于字节流操作中文不是特别方便,所以,java就提供了转换流。
●字符流=字节流+编码表。
24编码表概述和常见的编码表
●编码表
•由字符及其对应的数值组成的一张表
●常见编码表
•ASCII/Unicode字符集
•ISO-8859-1
•GB2312/GBK/GB18030
•BIG5
•UTF-8
●计算机只能识别二进制数据,早期由来是电信号。
●为了方便应用计算机,让它可以识别各个国家的文字。
●就将各个国家的文字用数字来表示,并一一对应,形成一张表。
●ASCII:
美国标准信息交换码。
●用一个字节的7位可以表示。
●ISO8859-1:
拉丁码表。
欧洲码表
●用一个字节的8位表示。
●GB2312:
中国的中文编码表。
●GBK:
中国的中文编码表升级,融合了更多的中文文字符号。
●GB18030:
GBK的取代版本
●BIG-5码:
通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。
●Unicode:
国际标准码,融合了多种文字。
●所有文字都用两个字节来表示,Java语言使用的就是unicode
●UTF-8:
最多用三个字节来表示一个字符。
●UTF-8不同,它定义了一种“区间规则”,这种规则可以和ASCII编码保持最大程度的兼容:
●它将Unicode编码为00000000-0000007F的字符,用单个字节来表示
它将Unicode编码为00000080-000007FF的字符用两个字节表示
它将Unicode编码为00000800-0000FFFF的字符用3字节表示
25字符串中的编码问题
●编码
•把看得懂的变成看不懂的
●解码
•把看不懂的变成看得懂的
26转换流概述
●OutputStreamWriter字符输出流
•publicOutputStreamWriter(OutputStreamout)
•publicOutputStreamWriter(OutputStreamout,StringcharsetName)
●InputStreamReader字符输入流
•publicInputStreamReader(InputStreamin)
•publicInputStreamReader(InputStreamin,StringcharsetName)
27OutputStreamWriter写数据
●OutputStreamWriter写数据方法
•publicvoidwrite(intc)
•publicvoidwrite(char[]cbuf)
•publicvoidwrite(char[]cbuf,intoff,intlen)
•publicvoidwrite(Stringstr)
•publicvoidwrite(Stringstr,intoff,intlen)
●字符流操作要注意的问题
•flush()的作用
•flush()和close()的区别
28InputStreamReader读数据
●OutputStreamWriter读数据方法
•publicintread()
•publicintread(char[]cbuf)
29转换流的简化写法
●转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类。
●FileWriter
●FileReader
30FileWriter和FileReader
●FileWriter写数据
●FileReader读取数据
●FileWriter和FileReader实现文本文件的复制
31字符缓冲流
●BufferedWriter基本用法
●BufferedReader基本用法
●字符缓冲流复制文本文件
●特殊功能
•BufferedWriter
•voidnewLine()
•BufferedReader
•StringreadLine()
●字符缓冲流特殊功能复制文本文件
32IO流小结
●字节流
•字节输入流
•字节输出流
●字符流
•字符输入流
•字符输出流
33操作基本数据类型的流
●操作基本数据类型
•DataInputStream
•DataOutputStream
●1:
数据输出流允许应用程序以适当方式将基本Java数据类型写入输出流中。
然后,应用程序可以使用数据输入流将数据读入。
●2:
案例
●publicstaticvoidmain(String[]args)throwsIOException{
●write();
●read();
●}
●privatestaticvoidread()throwsFileNotFoundException,IOException{
●DataInputStreamdis=newDataInputStream(
●newFileInputStream("dos.txt"));
●byteb=dis.readByte();
●System.out.println(b);
●shorts=dis.readShort();
●System.out.println(s);
●inti=dis.readInt();
●System.out.println(i);
●longl=dis.readLong();
●System.out.println(l);
●floatf=dis.readFloat();
●System.out.println(f);
●doubled=dis.readDouble();
●System.out.println(d);
●charch=dis.readChar();
●System.out.println(ch);
●booleanbb=dis.readBoolean();
●System.out.println(bb);
●dis.close();
●}
●privatestaticvoidwrite()throwsIOException{
●DataOutputStreamdos=newDataOutputStream(newFileOutputStream(
●"dos.txt"));
●dos.writeByte
(1);
●dos.writeShort(20);
●dos.writeInt(300);
●dos.writeLong(4000);
●dos.writeFloat(12.34f);
●dos.writeDouble(12.56);
●dos.writeChar('a');
●dos.writeBoolean(true);
●dos.close();
●}
34内存操作流
●操作字节数组
•ByteArrayInputStream
•ByteArrayOutputStream
●操作字符数组
•CharArrayReader
•CharArrayWrite
●操作字符串
•StringReader
•StringWriter
●1:
内存操作流一般用于处理临时信息,因为临时信息不需要保存,使用后就可以删除。
●2:
以第一个举例即可
●ByteArrayOutputStreambaos=newByteArrayOutputStream();
●baos.write("helloworld".getBytes());
●baos.close();
●byte[]bys=baos.toByteArray();
●ByteArrayInputStreambais=newByteArrayInputStream(bys);
●intby=0;
●while((by=bais.read())!
=-1){
●System.out.println((char)by);
●}
●baos.close();
●bais.close();
●最后的close()可以不写,通过看源码可以知道这里什么都没有做。
35打印流
●打印流概述
•字节流打印流
•字符打印流
●打印流特点
•只能操作目的地,不能操作数据。
•可以操作任意类型的数据。
•如果启动了自动刷新,能够自动刷新。
•可以操作文件的流
打印流复制文本文件
36标准输入输出流
●System类中的字段:
in,out。
●它们各代表了系统标准的输入和输出设备。
●默认输入设备是键盘,输出设备是显示器。
●System.in的类型是InputStream.
●System.out的类型是PrintStream是OutputStream的子类FilterOutputStream的子类.
●说明:
System.out.println()语句的原理。
●并测试如下两个代码:
●用System.in实现键盘录入数据。
用BufferedReader改进。
●用System.out实现控制台输出数据。
用BufferedWriter改进。
37随机访问流
●RandomAccessFile概述
•RandomAccessFile类不属于流,是Object类的子