黑马程序员_温习 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>、期待与您交流! ----------------------
简要(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>、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员_基础_IO流学习笔记_文本文件读取及复制、字符流的缓冲区和装饰设计模式
- 黑马程序员——Java基础——IO流、字符流、字节流、缓冲区技术、装饰设计模式、LineNumberReader等
- 黑马程序员--字符流缓冲区对象,装饰设计模式,字节流,字节流的缓冲区对象,转换流对象
- 黑马程序员_java的IO流(对第十九课字符缓冲区及装饰设计模式的总结)
- 12.IO(一)【IO流概述】【字符流】【字符流缓冲区】【装饰设计模式】【字节流】
- 黑马程序员---IO2(缓冲区、装饰设计模式、转换流)
- 基础_IO流学习笔记_文本文件读取及复制、字符流的缓冲区和装饰设计模式
- 黑马程序员 io中的缓冲字符流,装饰设计模式(毕向东)
- 黑马程序员-JAVA高级视频_IO输入与输出-19天-5(装饰设计模式)
- IO流二:IO流之缓冲区BufferedReader、BufferedWriter、装饰设计模式、LineNumberReader
- 黑马程序员——JAVA笔记——装饰设计模式
- 47.黑马程序员-IO流缓冲区、装饰设计模式
- 黑马程序员-Java IO和装饰设计模式
- 黑马程序员—字节流+字符流缓冲区(装饰设计)+转换流+IO流操作规律+异常日志+系统信息列表输出
- 黑马程序员---2015.6.25java基础笔记---装饰模式--字节流拷贝图片--字节流缓冲--字节字符转化--File类
- IO流2(字符流缓冲区、字节流、装饰设计模式、转换流)
- 黑马程序员——21,字符流FileReader,FileWriter,BufferedWriter,BufferedReader,装饰设计模式,LineNumberReader
- 黑马程序员:装饰设计模式介绍及装饰模式与继承关系的区别
- 黑马程序员——学习Java基础之 io LineNumberReader 之装饰设计模式
- IO流-2.【字符流缓冲区BufferedWriter/BufferedReader】【readLine()方法】【装饰设计模式】【LineNumberReader】