黑马程序员07 IO流
来源:互联网 发布:2016淘宝有前景的类目 编辑:程序博客网 时间:2024/04/30 19:50
------- android培训、java培训、期待与您交流! ----------
IO流用来处理设备之间的数据传输
java对数据的操作是通过流的方式,JAVA用于操作流的对象都在IO包中,流栈操作数据分为两种:字节流和字符流
按流向分为 输入流输出流。
字节流的抽象基类:
inputstream 和 OutputStream;
字符流的抽象基类:
Reader 和 Writer
一、异常概述
异常——概述
异常:程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。
在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是产生了一个异常对象。
异常体系图
Java默认处理方式:JVM有一个默认的异常处理机制,即将该异常的名称、异常的信息、异常出现的位置打印在了控制台上,同时将程序停止运行。
标准打印流与错误打印流不同步。
异常相关操作:
创建异常对象(JDK已定义的异常会自动创建对象,自定义异常需要手动创建)
抛出异常(JDK已有定义的异常会自动抛出异常,自定义异常需要手动抛出)
处理异常
程序员在有异常抛出时,异常的处理方法有两种:
将异常捕获并处理
声明抛出异常
多异常捕获处理:
分别捕获分别处理,每个try对应一个catch
分别捕获分别处理,一个try对应所有catch
注意:大的异常不能在前边捕获
一次捕获共同处理
注意:不能同时捕获大的异常与小的异常
异常常见方法
重写了toString方法
public String getMessage()
public void printStackTrace()
public void printStackTrace(PrintStream s)
声明抛出异常与抛出异常
throws:用于声明函数抛出异常。用于函数声明。
是异常对象的处理方式之一。
多个异常可以同时声明抛出,用逗号分隔。
throw:用于抛出异常对象。用于函数内容。
当出现JDK异常对象时,JVM会自动创建一个异常对象并抛出。
自定义异常对象可以先创建异常对象,再使用throw抛出。抛出后再进行处理:或使用捕获或使用声明抛出。
自定义异常
如果涉及其他需求,JDK没有提供相应的异常对象,则可以自己定义异常。
定义格式:继承Exception或者RuntimeException。同时需要带参的构造方法,用于接收异常信息。
class MyException{
public MyException(String message){
super(message);
}
}
异常处理注意细节
运行时异常被抛出可以不处理。即不捕获也不声明抛出。
如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。
父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。
函数中已经出现返回语句返回值A,再在finally中修改A值,则最终的返回值仍为修改前A的值。但在该方法中A的值已经被修改了。
finally语句只有在退出虚拟机的情况下不会被执行。
注意不要超出异常捕获处理时的变量作用域。
二、字符流
字符流的特点:
数据最常见的体现形式是:文件
需求:在硬盘上,创建一个文件,并写入一些文字数据。
用于操作操作文件的Writer的子类FileWriter,后缀名是父类名。前缀名是该流对象的功能。
操作步骤:
1.创建一个FileWriter对象。该对象一被初始化就必须明确要被操作的文件,该文件会被创建到指定目录下,如果该目录下已经有同名文件,将被覆盖
FileWriter fw=new FileWriter("demo.txt");
2.调用write方法,将字符串写入到流中。
fw.write();
3.刷新流对象中的缓冲中的数据,将数据刷到目的地
fw.flush();
4.关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中。和flush的区别,flush刷新后,流可以继续使用,close刷新后
将会将流关闭。
fw.close();
IO异常的处理方式:
FileWriter fw=null;try {fw=new FileWriter("demo.txt");fw.write("sdfasd");} catch (IOException e) {e.printStackTrace();}finally{try {if(fw!=null)fw.close();} catch (IOException e) {e.printStackTrace();}}}
文件的续写:
传递一个true参数,代表不覆盖已有文件,并在已知文件的末尾处进行数据续写。
FileWriter fw=new FileWriter("demo.txt",true);
换行转义字符:\r\n
文件的读取方式一:
FileReader();
1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
FileReader fr=new FileReader("demo.txt");
2.调用读取流的对象的read方法
(1)int ch=fr.read();一次读一个字符,会自动往下读。
(2)读出所有字符
while((ch=fr.read())!=-1) { System.out.println((char)ch); }
3.关闭流资源,
fr.close();
文件的读取方式2:通过字符数组进行读取
1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
FileReader fr=new FileReader("demo.txt");
2.定一个字符数组,用于存储读到字符,该rrad(char[])返回的是读到的字符个数。
char[] buf=new char[1024];一般定义1024-2个字节。
int num=0; while((num=fr.read(buf))!=-1) { System.out.println((new String(buf,0,num)); }
三、字符流的缓冲区
缓冲区的出现提高了对数据的读写效率
对应类:
BUfferWriter
BufferedReader
特点:缓冲区要结合流才可以使用,在创建缓冲区之前,必须要有流对象。在流的基础上对流的功能进行了增强。
BUfferWriter步骤:
1.创建一个字符写入流对象
FileWriter fw=new FileWriter("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
bufferedWriter bufw=new BufferedWriter(fw);
buff.write("asdasdas");
bufw.newLine();//换行符,跨平台的
3.将缓冲区刷新
bufw.flush;
4.关闭缓冲区,就是在关闭缓冲区中的流对象
bufw.close();
BufferedReader步骤
1.创建一个字符写入流对象
FileReader fr=new FileReader ("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
BufferedReader bufr=new BufferedReader (fr);
3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾
String line=null;
while((line=bufr.readLine())!=null)
{
String s=line;}
4.关闭
bufr.close();
readLine()方法的原理:
无论是读一行,获取多个字符,最终都是在硬盘上一个一个读取,最终使用额还是read方法一次读一个的方法。
四、装饰设计模式
当想要对已有的独享进行功能增强时,可以定义类,将已有的对象传入,基于已经有的功能,
并提供加强功能,那么自定义的该类称为装饰类
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
代码演示:
已知类:
Person(){ public void chifan() { }}增强类:superPerson(){ private Person p; superPerson(Person p) { this.p=p; } public void superchifan() { p.chifan(); ......... {}自定义装饰类package com.io;import java.io.*;public class MyBufferedReader {private Reader r; public MyBufferedReader(Reader r) {super();this.r = r;}//可以一次读取一行的方法public String myReadLine() throws IOException{//定义一个临时容器。StringBulider容器,应用于存储字符数组StringBuilder sb=new StringBuilder();int ch=0;while((ch=r.read())!=-1){if(ch=='\r')continue;if(ch=='\n')return sb.toString();elsesb.append((char)ch);}if(sb.length()!=0)return sb.toString();return null;}//复写reader中的抽象方法//复写close方法public void close() throws IOException{r.close();}//复写read方法public int read (char[] c,int off,int len) throws IOException{return r.read(c, off, len);}}
- 黑马程序员07 IO流
- 黑马程序员 IO流
- 黑马程序员IO流
- 黑马程序员-IO流
- 黑马程序员---IO流
- 黑马程序员-----IO流
- 黑马程序员--io流
- 黑马程序员:IO流
- 黑马程序员----IO流
- 黑马程序员--IO流
- 黑马程序员-IO流
- 黑马程序员:IO流
- 黑马程序员IO流
- 黑马程序员:IO流
- 黑马程序员-IO流
- 黑马程序员---IO流
- 黑马程序员---IO流
- 黑马程序员---IO流
- C++自增自减重载
- C++builder的文件读写操作总结(2)
- C++builder的文件读写操作总结(1)
- iOS打IPA包
- Qt汉字得到汉字拼音首字母
- 黑马程序员07 IO流
- 快学Scala习题解答—第十一章 操作符
- tiny_mce
- 散列技术之线性探测法
- php---魔术方法(__wakeup和__sleep)
- POJ 3304 - Segments【计算几何 - 直线线段相交判断】
- 文章标题
- 从上往下打印二叉树
- docker/compose项目笔记