您的位置:首页 > 职场人生

黑马程序员_温习 IO流一 (个人笔记) 简要(IO介绍。。字符流。。字符流缓冲区..装饰设计模式)

2013-12-16 22:19 519 查看
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

简要(IO介绍。。字符流。。字符流缓冲区..装饰设计模式)

IO(Input Output)流:处理设备之间的数据传输

JAVA对于数据的操作时通过流的方式,用于操作流的对象都在IO包中



流按操作数据分两中 按流向分

|--字节流
|--输入流

|--字符流
|--输出流

IO流常用基本数据类型

|--字节流的抽象基类

|--输入:InputStream

|--输出:OutputStream

|--字符流的抽象基类

|--输入:Reader

|--输出:Writer()



字符流:

|--输出流:Writer -->FileWriter:用于输出字符文件的便捷类

例:

class Demo2

{

public static void main(String[] args)throws IOException //操作字符输出流必须声明异常或者 try catch

{

FileWriter fw = new FileWriter("Demo.txt");//创建一个FileWriter对象,且一初始化就明确要操作的文件,若无指定地址

//则创建在当前目录下,如有同名文件,则覆盖,且一建立必须声明异常或者try catch

fw.write("abcderf");//调用write方法,将字符串写入到输出流中

fw.flush();//刷新流,将流中数据刷到文件中

fw.close();//关闭流,关闭前会刷新一次

}

}

IO异常的处理方式:

例:

class Demo2

{

public static void main(String[] args)

{

FileWriter fw = null;

try

{

fw = new FileWriter("Demo.txt");

fw.write("abdffd");

}

catch (IOException e)

{

throw new RuntimeException("写入有误");

}

finally

{

try

{

if(fw!=null) ///有几个IO流就要写几个关闭且每个关闭都要分别try catch和判断,引用是否指向NULL,

fw.close(); //因为,如果指向空,就不存在close方法了则fw.flose()会报错

}

catch (IOException e)

{

System.out.println(e.toString());

}

}

}

}

文件的续写:因为每编译一遍JAVA文件FileWriter fw = new FileWriter("Demo.txt")

都会覆盖原文件,所以要解决之

例:

class Demo2

{

public static void main(String[] args)throws IOException //操作字符输出流必须声明异常或者 try catch

{

FileWriter fw = new FileWriter("Demo.txt",true);//传递一个参数true,代表不覆盖文件,并在文件末尾处进行数据续写

fw.write("nihao \r\n xiexie");// "\r\n"在记事本中实现换行,若只写\n记事本不识别会用黑色方框表示

fw.close();

}

}

读取方式:Reader(输入流)-->FileReader(文件输入流)

读取方式一 read():一次读一个字符,且自动往下读

例:

FileReader fr = new FileReader("Demo.txt");//建一个FileReader对象,并指定要读取(输入)的对象

int num = 0;//建一个装字符的容器

while ((num = fr.read())!=-1)//当read读完内容时,会返回-1表示,已经没有内容

{

System.out.println((char)num);//(char)num将数组num强转会字符

}

读取方式二 read(char[]) (返回值为字符个数)一次读一个存入char[]再操作(常用)

例:

FileReader fr = new FileReader("Demo.txt");

char[] buf = new char[1024];//建一个数组,1024位规定,可以改

int num = 0; //建计数器,记录read(char[])的返回值:字符个数,若到头,则返回-1

while ((num = fr.read(buf))!=-1)

{

System.out.println(new String(buf,0,num));//打印成字符串,规定长度,否则若1024没用完,则大一堆null浪费资源

}

练习:拷贝文本文件(两种方法:一次拷贝一个字符 一次拷贝一个字符数组 )用第二种

FileWriter fw = null;

FileReader fr = null;

try

{

fw = new FileWriter("Demo_Copy.txt");//指定输出文件

fr = new FileReader("Demo.txt");//指定输入文件

char[] buf = new char[1024];

int len = 0;

while ((len = fr.read(buf))!=-1)

{

fw.write(buf,0,len);//一组一组写入,规定长度,避免1024没用完,写一堆null

}

}

catch (IOException e)

{

throw new RuntimeException("读写失败");

}

finally //有几个流就要写几个try catch 和 if

{

try

{

if(fw!=null)

fw.close();

}

catch (IOException e)

{

throw new RuntimeException("关闭输出流失败");

}

try

{

if(fr!=null)

fr.close();

}

catch (IOException e)

{

throw new RuntimeException("关闭输入流失败");

}

}

字符流缓冲区:缓冲字符,提高输入,输出效率,创建前必须有流对象

|--输出流缓冲区:BufferedWriter

|--输入流缓冲区:BufferedReader

输出流缓冲区:BufferedWriter

例:

FileWriter fw = new FileWriter("Demo.txt");

BufferedWriter bufw = new BufferedWriter(fw); //建缓冲器,并指定要缓冲的流对象

bufw.write("acbxs"); //通过缓冲区方法,把字符写入缓冲区

bufw.flush(); //缓冲区刷新

for(int x=1;x<5;x++)

{

bufw.write("abcd"+x);

bufw.newLine(); //newLine(),跨平台换行操作

bufw.flush();

}

bufw.close(); //关闭缓冲区,其实就是 fw.close()

输入流缓冲区:BufferedReader

|--readLine()方法:一次读取一行,若到结尾则返回null

图例:



例:

FileReader fr = new FileReader("Demo.txt");

BufferedReader bufr = new BufferedReader(fr); //建缓冲区,并指定要缓冲的流对象

String line = null; //建一个容器接收readLine方法返回的字符串

while ((line = bufr.readLine())!=null)//readLine()方法,自动读取一行数据,若到结尾则返回null

{

System.out.println(line);

}

bufr.close(); //关流

练习:通过缓冲区复制文本文件

BufferedWriter bufw = null;

BufferedReader bufr = null;

try

{

bufw = new BufferedWriter(new Writer("Demo_copy.txt")); //缓冲区内,直接new 流对象

bufr = new BufferedReader(new Reader("Demo_copy.txt")); //缓冲区内,直接new 流对象

String line = null; //容器

while ((line=bufr.readLine())!=null)//一行一行读

{

bufw.write(line);//一行一行写

bufw.newLine();//每行都换行

bufw.flush();//每行都刷新

}

}

catch (IOException e)

{

........

}

finally //有几个流就写几个try catch 和 if

{

try

{

if(bufw!=null)....

}

catch ()

{

.......

}

try

{

if(bufr!=null)....

}

catch ()

{

.......

}

}

装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入基于其已有的功能,提供加强功能

那么自定义的类称为”装饰类“

如:BufferedReader就是FileReader的装饰类,是基于其现有对象的read方法,给与其增强方法readLine的

装饰和继承的区别:

|--装饰模式比继承要灵活,避免了继承体系的臃肿,而且降低了类与类的关系

|--装饰类因为增强已有对象,所以其具备的功能和对象是一样的,只不过提供了

更强的功能,所以装饰类和被装饰类通常都属于一个体系

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐