黑马程序员——IO流

来源:互联网 发布:科来网络 编辑:程序博客网 时间:2024/05/29 04:42
<a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>


数据在设备上的流动,以对象体现。


流操作规律:

(1)   明确操作对象

源:InputStream    Reader

1)     内存   Array

2)     硬盘   File

3)     键盘   System.in

目的:OutputStream    Writer

1)     内存    

2)     硬盘

3)     控制台

(2)   操作数据是否为纯文本


按处理数据不同分:

字符流:处理纯文本数据的流对象,将字节流与编码表封装成的对象。

(1)   Reader

1)     创建一个文件读取流对象,和指定名称文件关联

2)     调用read()。返回-1,标志读到结尾

3)     关闭流的底层资源

方法一:            

FileReader fr=new FileReader("demo.txt");int mark=0;while(mark=fr.read()!=-1){    charch=(char)mark;}fr.close();

 方法二:自定义缓冲区   

FileReader fr=new FileReader("demo.txt");char[] buf=new char[1024];int len=0;while (len=fr.read(buf)!=-1){                Strings=new String(buf,0,len);}fr.close();


(2)   Writer

1)     创建一个文件写入流对象,和文件要存放的目的地关联

2)     调用write(),将数据写入流中

3)     调用flush(),刷新对象缓冲区中的数据到目的地中

4)     关闭底层资源

FileWriterfw=new FileWriter("demo.txt",true);fw.write();fw.flush();fw.close();


字节流:处理字节数据的流对象

(1)   InputStream

(2)   OutputStream

例:复制图片

                  public static void copy() throwsIOException                  {                          FileInputStreamfis=new FileInputStream("F:\\1\\1.jpg");                          FileOutputStreamfos=new FileOutputStream("F:\\1\\2.jpg");                          byte[] buf=new byte[1024];                          intlen=0;                          while((len=fis.read(buf))!=-1)                          {                                   fos.write(buf,0,len);                          }                          fis.close();                          fos.close();                  }


缓冲区:提高流的操作效率

BufferedReader     BufferedWriter

BufferedInputStream     BufferedOutputStream

转换流

InputStreamReader  字节流转换成字符流输入

OutputStreamWriter   字符流转换成字节流输出

例:键盘输入,控制台输出

BufferedReader bufr = newBufferedReader(new InputStreamReader(System.in));BufferedWriter bufw = newBufferedWriter(new OutputStreamWriter(System.out));String line = null;while((line=bufr.readLine())!=null){         if("over".equals(line))                  break;         bufw.write(line.toUpperCase());//将输入的字符转成大写字符输出         bufw.newLine();         bufw.flush();         }bufw.close();bufr.close();


装饰设计模式

增强已有对象

定义类,通过构造函数将其传参,基于已有功能,加强功能

装饰类与被装饰类属于一个体系

优点:比继承灵活,避免体系臃肿。

例:

class MyBufferedInputStream{         private InputStream in;         private byte[] buf = new byte[1024*4];                private int pos = 0,count = 0;         MyBufferedInputStream(InputStreamin)         {                  this.in= in;         }         //一次读一个字节,从缓冲区(字节数组)获取。         publicint myRead()throws IOException         {                  //通过in对象读取硬盘上数据,并存储buf中。                  if(count==0)                  {                          count= in.read(buf);                          if(count<0)                               return -1;                          pos= 0;                          byteb = buf[pos];                          count--;                          pos++;                          return b&255;                  }                  elseif(count>0)                  {                          byteb = buf[pos];                          count--;                          pos++;                          return b&0xff;                  }                  return -1;         }         publicvoid myClose()throws IOException         {                  in.close();         }}



0 0
原创粉丝点击