码迷,mamicode.com
首页 > 编程语言 > 详细

IO流02--毕向东JAVA基础教程视频学习笔记

时间:2016-01-09 23:03:05      阅读:462      评论:0      收藏:0      [点我收藏+]

标签:

提要

08 自定义装饰类
09 LineNumberReader
10 MyLineNumberReader
11 字节流File读写操作
12 拷贝图片
13 字节流的缓冲区
14 自定义字节流的缓冲区-read和write的特点
15 读取键盘录入

 

 

08 自定义装饰类

 1 /*自定义装饰设计类*/
 2 import java.io.*;
 3 class MyBufferedReader2 extends Reader
 4 {
 5     private Reader r;
 6     public MyBufferedReader2(Reader r)
 7     {
 8         this.r=r;
 9     }
10     public String MyReadLine()throws IOException
11     {
12         int ch;
13         StringBuilder sb=new StringBuilder();
14         while((ch=r.read())!=-1)
15         {
16             if(ch==‘\r‘)
17                 continue;
18             if(ch==‘\n‘)
19                 return sb.toString();
20             else
21                 sb.append((char)ch);
22         }
23         if(sb.length()!=0)
24             return sb.toString();
25         return null;
26     }
27     public void MyClose()throws IOException
28     {
29         r.close();
30     }
31     //重写父类的抽象方法
32     public void close()throws IOException
33     {
34         r.close();
35     }
36     public int read(char[] cbuf, int off, int len)throws IOException
37     {
38         return r.read(cbuf,off,len);
39     }
40 }
41 
42 public class  MyBufferedReaderDemo2
43 {
44     public static void main(String[] args)throws IOException
45     {
46         FileReader fw=new FileReader("buf.txt");
47         MyBufferedReader2 mr=new MyBufferedReader2(fw);
48         String line;
49         while((line=mr.MyReadLine())!=null)
50         {
51             System.out.println(line);
52         }
53         mr.MyClose();
54     }
55 }

 


09 LineNumberReader

 1 /*带行号的缓冲区,lineNumberReader
 2 是BufferedReader的直接子类,此类定义了setLineNumber(int)和getLineNumber)(),
 3 分别用来设置和获取当前行号。
 4 */
 5 import java.io.*;
 6 public class LineNumberReaderDemo 
 7 {
 8     public static void main(String[] args) 
 9     {
10         try
11         {
12            FileReader fw=new FileReader("PersonDemo.java");
13            LineNumberReader lr=new LineNumberReader(fw);
14            String line;
15            lr.setLineNumber(100);
16            while((line=lr.readLine())!=null)
17             {
18                System.out.println(lr.getLineNumber()+":"+line);
19            }
20            lr.close();
21             
22         }
23         catch (IOException ie)
24         {
25             ie.printStackTrace();
26         }
27     
28     }
29 }

 


10 MyLineNumberReader

 1 /*
 2 练习,自定义一个类,实现LineNumberReader的功能
 3 
 4 */
 5 import java.io.*;
 6 class MyLineNumberReader extends MyBufferedReader2
 7 {
 8     private int lineNumber;
 9     public MyLineNumberReader(Reader r)
10     {
11         super(r);
12     }
13     public String readLine()throws IOException
14     {
15         lineNumber++;
16         return super.MyReadLine();
17     }
18     //自定义设置行号的方法
19     public void setLineNumber(int lineNumber)
20     {
21         this.lineNumber=lineNumber;
22     }
23     //自定义获取行号的方法
24     public int getLineNumber()
25     {
26         return lineNumber;
27     }
28 
29 }
30 public class MyLineNumberReaderDemo 
31 {
32     public static void main(String[] args) 
33     {
34         try
35      {
36         FileReader fr=new FileReader("BufferedReaderDemo.java");
37         MyLineNumberReader mlnr=new MyLineNumberReader(fr);
38         String line=null;
39         mlnr.setLineNumber(99);
40 
41         while((line=mlnr.readLine())!=null)
42         {
43             System.out.println(mlnr.getLineNumber()+"  "+line);
44         }
45         mlnr.close();
46 
47             
48      }
49         catch (IOException ie)
50      {
51             ie.printStackTrace();
52      }
53         
54     }
55     
56         
57 
58     
59 }

 


11 字节流File读写操作

 1 /*
 2 字符流:
 3 FileReader
 4 FileWriter
 5 
 6 BufferedReader
 7 BufferedWriter
 8 
 9 字节流:
10 InputStream  读
11 OutPutStream 写
12 
13 需求:想要操作图片数据,这就需要用到字节流。
14 
15 */
16 import java.io.*;
17 public class FileStream
18 {
19     public static void main(String[] args)throws IOException
20     {
21         writeFile();
22         readFile_1();
23         readFile_2();
24         readFile_3();
25 
26 
27     
28     }
29     //把读到的存放到一个字节数组中,然后一起输出
30     public static void readFile_3()throws IOException
31     {
32         FileInputStream fis=new FileInputStream("fos.txt");
33        //int num=fis.available();
34        //使用avaliable方法,定义一个刚刚好的缓冲区,不用再循环了
35        //如果文件太大,不建议使用,会出现内存溢出
36        byte[] buf=new byte[fis.available()];
37        fis.read(buf);
38        System.out.println(new String(buf));
39 
40        fis.close();
41     }
42     //把读到的存放到一个字节数组中,然后一起输出
43     public static void readFile_2()throws IOException
44     {
45         FileInputStream fis=new FileInputStream("fos.txt");
46        byte[] buf=new byte[1024];
47        int len=0;
48        while((len=fis.read(buf))!=-1)
49         {
50            System.out.println(new String(buf,0,len));
51        }
52        fis.close();
53     }
54     //一个一个地读
55     public static void readFile_1()throws IOException
56     {
57         FileInputStream fis=new FileInputStream("fos.txt");
58         int ch=0;
59         while((ch=fis.read())!=-1)
60         {
61             System.out.println((char)ch);
62         }
63         fis.close();
64     }
65     public static void writeFile()throws IOException
66     {
67         FileOutputStream fos=new FileOutputStream("fos.txt");
68         fos.write("abcde".getBytes());
69         //对最小单位字节操作,不需要刷新
70         fos.close();
71     }
72 }

 


12 拷贝图片

void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。

int read(byte[] b) 从此输入流中,将最多b.length个字节的数据读入byte数组中。返回读入缓冲区的字节总数,如果达到文件末尾没有更多数据,则返回-1.
          

 1 /*
 2 复制一个图片
 3 思路:
 4 1.用字节读取流对象和图片相关联
 5 2.用字节写入流对象创建一个图片文件,用于存储获取到的图片数据
 6 3.通过循环读写,完成数据的存储
 7 4.关闭资源
 8 */
 9 import java.io.*;
10 public class CopyPic
11 {
12     public static void main(String[] args)
13     {
14         FileOutputStream fos=null;
15         FileInputStream fis=null;
16         try
17         {
18             fis=new FileInputStream("d:\\十字路口.bmp");
19             fos=new FileOutputStream("d:\\路口.bmp");
20 
21             byte[] buf=new byte[1024];
22             int len=0;
23             while((len=fis.read(buf))!=-1)
24             {
25                 fos.write(buf,0,len);
26             }
27 
28 
29         }
30         catch (IOException e)
31         {
32             throw new RuntimeException("复制文件失败!");
33         }
34         finally
35         {
36             try
37             {
38                 if(fis!=null)
39                     fis.close();
40                 
41             }
42             catch (IOException e)
43            {
44             throw new RuntimeException("读取关闭失败!");
45            }
46            try
47             {
48                 if(fos!=null)
49                     fos.close();
50                 
51             }
52             catch (IOException e)
53            {
54             throw new RuntimeException("写入关闭失败!");
55            }
56         }
57     }
58 }

 


13 字节流的缓冲区

 1 /*
 2 演示mp3的复制,通过缓冲区
 3 BufferedOutputStream
 4 BufferedInputStream
 5 */
 6 import java.io.*;
 7 public class CopyMp3
 8 {
 9     public static void main(String[] args)throws IOException
10     {
11         long start=System.currentTimeMillis();
12         copy();
13         long end=System.currentTimeMillis();
14 
15         System.out.println((end-start)+"毫秒");
16 
17     }
18     //通过字节流的缓冲区完成复制
19     public static void copy()throws IOException
20     {
21         BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("D:\\安又琪-那你呢.mp3"));
22         BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("d:\\那你呢.mp3"));
23 
24         int by=0;
25         while((by=bufis.read())!=-1)
26         {
27             bufos.write(by);        
28         }
29         bufis.close();
30         bufos.close();
31 
32     }
33 }

 


14 自定义字节流的缓冲区-read和write的特点

 1 /*
 2 通过自定义的缓冲区,拷贝Mp3
 3 
 4 注意,把myRead方法的返回值设为int型,而不是byte型
 5 因为当连续读取8个1时,可能错误结束main函数中的读取循环,
 6 提升了一个int型(byte型1个字节,int型32位,4个字节),还是-1的原因是因为在8个1前面补1造成的。
 7  那么如果能在前面补0,既可以保留原字节数据不变,又可以避免-1的出现。
 8 
 9  补0的方法:
10  和255相与
11 
12 最后文件大小并没有变成原来的4倍的原因是,write方法只写入后8位,对int型又做了强制转换
13 
14 运行发现,自定义的缓冲区的拷贝时间比原来的提高了大约200毫秒
15 
16 */
17 import java.io.*;
18 class MyBufferedInputStream
19 {
20     private InputStream in;
21     private byte[] buf=new byte[1024];
22     private int pos=0,count=0;
23     public MyBufferedInputStream(InputStream in)
24     {
25         this.in=in;
26     }
27     //一次读一个字节,从缓冲区(字节数组)获取。
28     public int myRead()throws IOException
29     {
30         //通过in对象读取硬盘上数据,并存储在buf中。
31         if(count==0)
32         {
33             count=in.read(buf);
34             pos=0;
35             byte b=buf[pos];
36 
37             count--;
38             pos++;
39             return b&255;
40         }
41         else if(count>0)
42         {
43             byte b=buf[pos];
44             count--;
45             pos++;
46             return b&255;
47         }
48         return -1;
49 
50     }
51     public void myClose()throws IOException
52     {
53         in.close();
54     }
55 }
56 public class CopyMp3_2
57 {
58     public static void main(String[] args)throws IOException
59     {
60         long start=System.currentTimeMillis();
61         copy_1();
62         long end=System.currentTimeMillis();
63 
64         System.out.println((end-start)+"毫秒");
65 
66     }
67     //通过字节流的缓冲区完成复制
68     public static void copy_1()throws IOException
69     {
70         MyBufferedInputStream bufis=new MyBufferedInputStream(new FileInputStream("D:\\安又琪-那你呢.mp3"));
71         BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("d:\\那你呢.mp3"));
72 
73         int by=0;
74         while((by=bufis.myRead())!=-1)
75         {
76             
77             bufos.write(by);        
78         }
79         bufis.myClose();
80         bufos.close();
81 
82     }
83 }

 


15 读取键盘录入

需求:
通过键盘录入数据
当录入一行数据后,就将该行数据转变为大写形式再进行打印
如果录入的数据是over,则停止录入。

 1 /*
 2 字符流:
 3 FileReader
 4 FileWriter
 5 
 6 BufferedReader
 7 BufferedWriter
 8 
 9 字节流:
10 FileInputStream
11 FileOutputStream
12 
13 BufferedInputStream
14 BufferedOutputStream
15 
16 
17 读取键盘录入:
18 System.out :对应的是标准输出设备,控制台
19 System.in :对应的标准输入设备:键盘
20 
21 
22 */
23 import java.io.*;
24 public class  ReadIn
25 {
26     public static void main(String[] args) throws IOException
27     {
28         InputStream in=System.in;
29         //建立一个读入数据的缓冲区
30         StringBuilder sb=new StringBuilder();
31 
32         while(true)
33         {
34             //read方法是阻塞式方法,没有录入,就会一直等待
35         int ch=in.read();
36         if(ch==‘\r‘)
37             continue;
38         else if(ch==‘\n‘)
39             {
40             String s=sb.toString();
41             if("over".equals(s))
42                 break;
43             System.out.println(s.toUpperCase());
44             //清空缓冲区
45             sb.delete(0,sb.length());
46 
47         }
48         else 
49             sb.append((char)ch);
50 
51         }
52     
53     }
54 }

 

IO流02--毕向东JAVA基础教程视频学习笔记

标签:

原文地址:http://www.cnblogs.com/wsw-tcsygrwfqd/p/5117347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!