您的位置:首页 > 编程语言 > Java开发

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

2017-04-06 15:49 761 查看
提要
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)
[b]将指定 byte 数组中从偏移量 
off
 开始的 
len
 个字节写入此文件输出流。
[/b]

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 }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: