黑马程序员-JAVA基础-IO流之字节流和字节流缓冲区

时间:2023-02-16 17:51:06

------- android培训java培训、期待与您交流!-------

  
二.字节流

  2.1 字节流基类:

  OutputStream 和 InputStream 通过这两个抽象类提供的方法可以对文件进行操作。

  OutputStream 类中包含的常用方法:

  > void close() : 关闭此输出流并释放与此流有关的所有系统资源。

  > void flush() :刷新此输出流并强制写出所有缓冲的输出字节。

  > void writer(byte[] b ) : 将 b.length 个字节从指定的 byte 数组写入此输出流。

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

  > abstract void writer(int b )  将指定的字节写入此输出流。

  注意: 和Writer 类中的writer 方法不同的是,Writer 类中的writer 操作的是字符串,而OutputStream 中操作的是 字节。

  InputStream 类中常用的方法:

  > void close() : 关闭流。

  > abstract int read() 从输入流中读取数据的下一个字节。 

  > int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
  > int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。

  > int available() : 方法返回的是数据的长度,包括换行符和回车符。

  OutputStream 和 InputStream类的基本演示:

 1 public class FileOutputStreamDemo {
 2     public static void main(String[] arg) throws IOException {
 3 //        写文件。
 4         OutputStream fos = new FileOutputStream("D:\\OutputStream.txt") ;
 5         
 6         fos.write("jfwhjef".getBytes()) ; 
 7         fos.close() ;
 8 //        读文件。
 9         InputStream is = new FileInputStream("D:\\OutputStream.txt") ;
10 //        方法一:
11 //        int  ch = 0 ; 
12 //        while((ch = is.read()) != -1) {
13 //            System.out.println((char)ch);
14 //        }
15 //        is.close() ;
16 //        方法二:推荐使用这个。
17 //        int ch = 0 ;
18 //        byte[] bt = new byte[1024] ; 
19 //        while((ch = is.read(bt) )!= -1) {
20 //            System.out.println(new String(bt,0,ch));
21 //        }
22 //        is.close() ;
23 //        方法三:如果数据较大不推荐使用
24         byte[] bt = new byte[is.available()] ; // 定义一个刚刚好的缓冲区,不用在循环了
25         is.read(bt) ;
26         System.out.println(new String(bt));
27     }
28 }

  对于上诉的三种读取方式,推荐使用第二种。第一种因频繁的读取刷新效率低;而第三种,因为虚拟机运行时默认开的内存是64M, 如果要操作的数据是1G多,则不可能在内存中开出这么大的空间。 

  练习:拷贝一个图片。

  当需要操作图片、音频等数据,这时就要用到字节流。

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

 1 public class CopyPic {
 2     public static void main(String[] args) {
 3         FileInputStream fis = null ; 
 4         FileOutputStream fos = null ; 
 5         try {
 6             fis = new FileInputStream("C:\\Users\\Administrator\\Downloads\\1.jpg") ;
 7             fos = new FileOutputStream("D:\\1.jpg") ; 
 8 //            方法一:
 9 //            int leng = 0  ;
10 //            byte[] bt = new byte[1024] ; 
11 //            while ((leng = fis.read(bt)) != -1) {
12 //                fos.write(bt,0,leng) ; 
13 //            }
14 //            方法二;
15             byte[] bt = new byte[fis.available()];
16             fis.read(bt) ; 
17             fos.write(bt);
18         }catch(Exception e) { 
19         }finally{
20             try{
21                 if(fos != null)
22                     fos.close() ; 
23             }catch(Exception e){ 
24             } 
25             try {
26                 if (fis != null) 
27                     fis.close() ; 
28             }catch(Exception e) { 
29             }
30         }
31     }
32 }

  

  2.2 字节流缓冲区

  字节流缓冲区对应的类:BufferedOutputStream 和BufferedInputStream 。

  练习:通过缓冲区,完成Mp3的复制。 

 1 public class CopyMp3 {
 2     public static void main(String[] args) throws IOException { 
 3         Copy_1() ;  
 4     }
 5 //    通过字节流的缓冲区完成复制。
 6     public static void Copy_1() throws IOException {
 7         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
 8                 "F:\\KuGou\\Suede - Beautiful Ones.mp3")) ;
 9         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(
10                 "D:\\1.mp3")) ;
11         int by = 0  ; 
12         while((by = bis.read()) != -1) {
13             bos.write(by) ; 
14         }
15         bos.close(); 
16         bis.close() ;
17     }
18 }