黑马程序员------IO(二)

1.1 字符流的缓冲区
缓冲区的出现提高了对数据的读写效率
对应类:
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方法一次读一个的方法。

缓冲区练习:通过缓冲区复制一个文件(示例1)

 1 示例1
 2 BufferWriter bufw=null;
 3      BufferReader bufr=null;
 4       try {
 5           bufw=new BufferWriter(new FileWriter("b.txt"));
 6           bufr=new BufferReader(new FileReader("a.txt"));
 7          String line=null;
 8           while ((line=buffr.read(buf))!=null){
 9               bufw.write(line);
10                     bufw.newLine();
11                     bufw.flsuh;
12           }
13     }
14       catch (IOException e) {
15         // TODO Auto-generated catch block
16         e.printStackTrace();
17     }
18       finally
19         {
20            try {
21                 fr.close();
22             } catch (IOException e) {
23
24                 e.printStackTrace();
25             }
26
27            try {
28                 fw.close();
29             } catch (IOException e) {
30
31                 e.printStackTrace();
32             }
33         }

1.2 装饰设计模式

当想要对已有的独享进行功能增强时,可以定义类,将已有的对象传入,基于已经有的功能,
并提供加强功能,那么自定义的该类称为装饰类
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。

代码演示(示例2):

 1 示例2:
 2
 3 已知类:
 4 Person()
 5 {
 6   public void chifan()
 7    {
 8     }
 9 }
10 增强类:
11 superPerson()
12 {
13    private Person p;
14    superPerson(Person p)
15    {
16      this.p=p;
17     }
18
19     public void superchifan()
20     {
21       p.chifan();
22       .........
23     {
24 }

1.2.1 装饰和继承都能实现一样的特点:进行功能的扩展增强。有什么区别呢?

以前是通过继承将每一个子类都具备缓冲功能。
那么继承体系会复杂,并不利于扩展。

现在优化思想。单独描述一下缓冲内容。
将需要被缓冲的对象。传递进来。也就是,谁需要被缓冲,谁就作为参数传递给缓冲区。
这样继承体系就变得很简单。优化了体系结构。

装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。

1.3 LineNumberReader 带有行号的缓冲区:

LineNumberReader lnr=new LineNumberReader();

获取行号:lnr.getLineNumber();
设置行号从几开始:lnr.setLineNumber(100);

LineNumberReader 步骤
1.创建一个字符写入流对象
FileReader fr=new FileReader ("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
LineNumberReader lnfr=new LineNumberReader (fr);
3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾
String line=null;
while((line=lnfr.readLine())!=null)
{
String s=line;
String linenum=lnfr.getLineNumber();
}
4.关闭
lnfr.close();

1.3.1 自定义带行号的MyLineNumber(示例3):

 1 示例3:
 2 public class MyLineBufferReader extends MyBufferedReader {
 3
 4     public MyLineBufferReader(Reader r) {
 5         super(r);
 6
 7     }
 8
 9     private int LineNumber;
10
11     public int getLineNumber() {
12         return LineNumber;
13     }
14
15     public void setLineNumber(int lineNumber) {
16         LineNumber = lineNumber;
17     }
18
19     public String myReadLine() throws IOException
20     {
21         LineNumber++;
22         return super.myReadLine();
23     }
24
25 }

1.4 IO流常用基类-字节流InputStream  OutputStream

基本操作与字符流类相同。但它不仅可以操作字符,还可以操作其他媒体文件。

1.4.1 需求:复制一个图片。

想要操作图片数据。这时就要用到字节流(示例4):

思路:
1,用字节读取流对象和图片关联。
2,用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。
3,通过循环读写,完成数据的存储。
4,关闭资源。

 1 示例4:
 2 import java.io.*;
 3 class  CopyPic
 4 {
 5     public static void main(String[] args)
 6     {
 7         FileOutputStream fos = null;
 8         FileInputStream fis = null;
 9         try
10         {
11             fos = new FileOutputStream("c:\\2.bmp");
12             fis = new FileInputStream("c:\\1.bmp");//源
13
14             byte[] buf = new byte[1024];
15
16             int len = 0;
17
18             while((len=fis.read(buf))!=-1)//只要不等于-1的话就往里边写
19             {
20                 fos.write(buf,0,len);
21             }
22         }
23         catch (IOException e)
24         {
25             throw new RuntimeException("复制文件失败");
26         }
27         finally
28         {
29             try
30             {
31                 if(fis!=null)
32                     fis.close();
33             }
34             catch (IOException e)
35             {
36                 throw new RuntimeException("读取关闭失败");
37             }
38             try
39             {
40                 if(fos!=null)
41                     fos.close();
42             }
43             catch (IOException e)
44             {
45                 throw new RuntimeException("写入关闭失败");
46             }
47         }
48     }
49 }

1.5 字节流的缓冲区:同样是提高了字节流的读写效率

BufferedOutputStream
BufferedInputStream

示例5:通过缓冲区演示对mp3的复制

 1 示例5:
 2 import java.io.*;
 3 class  CopyMp3
 4 {
 5     public static void main(String[] args) throws IOException
 6     {
 7         long start = System.currentTimeMillis();
 8         copy_2();
 9         long end = System.currentTimeMillis();
10
11         System.out.println((end-start)+"毫秒");
12     }
13
14     public static void copy_2()throws IOException
15     {
16         MyBufferedInputStream bufis = new MyBufferedInputStream(new FileInputStream("c:\\9.mp3"));
17         BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\3.mp3"));
18
19         int by = 0;
20
21         //System.out.println("第一个字节:"+bufis.myRead());
22
23         while((by=bufis.myRead())!=-1)
24         {
25             bufos.write(by);
26         }
27
28         bufos.close();
29         bufis.myClose();
30     }
31
32     //通过字节流的缓冲区完成复制。
33     public static void copy_1()throws IOException
34     {
35         BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("c:\\0.mp3"));
36         BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\1.mp3"));
37
38         int by = 0;
39
40         while((by=bufis.read())!=-1)
41         {
42             bufos.write(by);
43         }
44
45         bufos.close();
46         bufis.close();
47
48
49     }
50 }
时间: 2024-11-19 23:45:38

黑马程序员------IO(二)的相关文章

黑马程序员------IO(五)

黑马程序员------IO(五) 1.1  操作对象(示例1)ObjectInputStream与ObjectOutputStream 被操作的对象需要实现Serializable. Serializable:用于给被序列化的类加入ID号,用于判断类和对象是否是同一个版本 类通过实现java.io.Serializable接口以启用序列化功能,Serializable只是一个标记接口. 1 示例1: 2 import java.io.*; 3 4 class ObjectStreamDemo 5

黑马程序员——IO篇

------- android培训.java培训.期待与您交流! ---------- IO(Input Output)流 1.IO流用来处理设备之间的数据传输 2.Java对数据的操作是通过流的方式 3.Java用于操作流的对象都在IO包中 4.流按操作数据分为两种:字节流与字符流 . 字符流的数据字节流其实都能处理,因为无论什么在计算机上最后都是以字节存在的,但是其中有一部分数据它是以文本形式存在的,所以为了方便有了字符流,字符流里融合了编码表,而只有文字用到了编码表,所以字符流用来处理文本

黑马程序员 IO流 文件的分割与合并

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ----------------------package cn.itcast.IO; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;

黑马程序员——IO流总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 什么是IO流? IO流是用来处理设备之间的数据传输 有哪些流? 流按操作数据的种类分为:字符流和字节流 流按流的方向分:输入流和输出流 字节流的基类:InputStream和OutputStream 字符流的基类:Writer和Reader 常用写字符流:FileWriter,BufferedWriter,OutputStreamWriter,PrinterWriter 常用读字符流  : F

黑马程序员-IO流其他流与File类

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 1:其他的流 1: DataOutputStream ;多了一些操作基本数据类型的功能 DataInputStream:读取文件. 用DataOutputStream流写进去的数据,就用DataInputStream流来读取. 1 imp

黑马程序员-IO(二)

装饰设计模式: 当想要对已有对象进行功能增强时.可以定义类,将已经有的类传入,基于已经有的功能,并且提供增强的功能,那么自定义的类就是装饰类. 两个基类:outputStream  inputStream ; 缓冲区:Buffer+两个基类的名称 小技巧: 如何分辨字节流和字符流,就是字节流用byte[]操作, 字符流用char[] 操作 在字节流当中是对数据的最小操作,所以在写入操作的时候就不需要刷新操作. 使用缓冲区读写文件的思路: 1.通过两个基类.建立一个读写数据的流通道.因为我们在re

黑马程序员——IO流

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- IO流 IO流概述 IO流用来处理设备之间的数据传输.Java对数据的操作是通过流的方式.Java用于操作流的对象都在IO包中. 流按照流向分为两种:输入流和输出流. 输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中:输入.将内存的数写入到外设中:输出. 流按照操作数据分为两种:字节流和字符流. 字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字.再对这个文字

黑马程序员-io读取键盘录入之转换流

--Java培训.Android培训.iOS培训..Net培训.期待与您交流! -- 自学视频io第二部分最后 这一讲重点部分,明白io流中这么多体系,怎么快速判断用哪种流... 1 1.1:明白源:InputStream Reader 1.2:明确目的:OutputStream Writer 2 是否是文本文件 是: 用Reader Writer 不是:用 InputStream OotputStream 3 是否要提高读写效率 是:BufferedReader br=new Buffered

黑马程序员—IO(一)流概述、字符流、字节流、流操作规律

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一节     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都在IO包中. 4)流按其操作数据的类型分为两种:字节流和字符流. 5)流按其流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象基流:Inp