编程语言
首页 > 编程语言> > JAVA 字节流

JAVA 字节流

作者:互联网

IO流概述和分类

 

IO流概述:

  常见的应用:文件复制;文件上传;文件下载


IO流分类:

一般来说,IO流的分类是按照数据类型来分的

如果数据通过Window自带的记事本软件打开,我们还可以读懂里面的内容,就使用字符流,否则使用字节流。如果不知道使用哪种类型的流,就饿使用字节流

 

字节流写数据

 

字节流抽象基类:


FileOutputStream:文件输出流用与将数据写入File

 

使用字节输出流写数据的步骤:

 

 1 import java.io.FileOutputStream;
 2 import java.io.IOException;
 3 
 4 /*
 5 
 6 字节流写数据**
 7 
 8 字节流抽象基类:
 9 
10  - InputStream:这个抽象类是表示字节输入流的所有类的超类
11  - OutputStream:这个抽象列是表示字节输出流的所有类的超类
12  - 子类名特点:子类名称都是以其父名作为子类名的后缀
13 
14 FileOutputStream:文件输出流用与将数据写入File
15 
16  - FileOutputStream(String name):创建文件输出流以指定的名称写入文件
17 */
18 
19 public class FileOutputStreamDemo {
20     public static void main(String[] args) throws IOException {
21         //创建字节输出流对象
22         //FileOutputStream(String name):创建文件输出流以指定的名称写入文件
23         FileOutputStream fos = new FileOutputStream("..\\hello java\\fos.txt");
24         /*
25         做了三件事:
26             调用系统功能创建了文件
27             创建了字符输出流对象
28             让字符输出流对象指向创建好的文件
29         */
30 
31         //void write (int b):将指定的字节写入此文件输出流
32         fos.write(97);//a
33         //        fos.write(57);//9
34         //        fos.write(55);//7
35 
36         //最后都要释放资源
37         //void close():关闭此文件输出流并释放与此流相关联的任何系统资源
38         fos.close();
39 
40     }
41 }

 

字节流输入的三种方式

 

 

 1 import java.io.File;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileOutputStream;
 4 import java.io.IOException;
 5 
 6 /*
 7 
 8 构造方法:
 9     FileOutputStream(String name):创建文件输出以指定的名称写入文件
10     FileOutputStream(File file):创建文件输出流以写入有指定的File对象表示的文件
11 
12 
13 字节流写数据的3种方法
14 
15 void write(int b)   将指定的字节写入此文件输出流,
16                     一次写一个字节数据
17 void write(byte[] b)将b.leangth字节从指定的字节数组写入此文件输出流,
18                     一次写一个字节数组数据
19 void write(byte[] b,int off,int len)将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,
20                                     一次写一个字节数组的部分数据
21 */
22 
23 public class FileOutputStreamDemo2 {
24     public static void main(String[] args) throws IOException {
25         //1:FileOutputStream(String name):创建文件输出以指定的名称写入文件
26         FileOutputStream fos = new FileOutputStream("..\\hello java\\fos.txt");
27         //new File(name)
28         //        FileOutputStream fos=new FileOutputStream(new File("..\\hello java\\fos.txt"));//相当于上面的
29 
30         //2:FileOutputStream(File file):创建文件输出流以写入有指定的File对象表示的文件
31         //        File file=new File("..\\hello java\\fos.txt");
32         //        FileOutputStream fos2=new FileOutputStream(file);
33         //        FileOutputStream fos2=new FileOutputStream(new File("..\\hello java\\fos.txt"));//两种都可以
34 
35         //void write(int b)   将指定的字节写入此文件输出流,
36         //一次写一个字节数据
37         //        fos.write(97);
38         //        fos.write(98);
39         //        fos.write(99);
40         //        fos.write(100);
41         //        fos.write(101);
42         /*abcde*/
43 
44         //void write(byte[] b)将b.leangth字节从指定的字节数组写入此文件输出流,
45         //一次写一个字节数组数据
46         //        byte[] bys= {97,98,99,100,101};
47         //byte[] getByted():返回字符串对应的字节数组
48         byte[] bys = "abcde".getBytes();
49         //        fos.write(bys);
50         /*abcde*/
51 
52         //void write(byte[] b,int off,int len)将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,
53         //一次写一个字节数组的部分数据
54         //        fos.write(bys,0,bys.length);//abcde
55         fos.write(bys, 1, 3);//bcd
56 
57         //释放资源
58         fos.close();
59 
60     }
61 }

 

 字节流写数据的两个小问题

  

字节流写数据如何实现换行?

字节流写数据如何实现追加写入?

 

 1 import java.io.FileOutputStream;
 2 import java.io.IOException;
 3 
 4 /*
 5 字节流写数据的两个小问题
 6 
 7     1.字节流写数据如何实现换行?
 8     不同系统换行识别是不一样的
 9         windeow:\r\n
10         linux:\n
11         mac:\r
12         
13     2.字节流写数据如何实现追加写入?
14         public fileOutputStream(String name,boolean append)
15             创建文件输出流以指定的名称写入文件。
16             如果第二个参数为true,则字节将写入文件的末尾而不是开头
17 */
18 
19 public class FileOutputStreamDemo3 {
20     public static void main(String[] args) throws IOException {
21         //创建字节输出流对象
22         //        FileOutputStream fos=new FileOutputStream("..\\hello java\\fos.txt");
23         FileOutputStream fos = new FileOutputStream("..\\hello java\\fos.txt", true);
24 
25         //写数据
26         for (int i = 0; i < 10; i++) {
27             fos.write("hello".getBytes());
28             fos.write("\r\n".getBytes());//换行
29         }
30 
31         //释放资源
32         fos.close();
33 
34     }
35 }

 

字节流写数据加入异常处理

finally:在异常处理时提供finally块来执行所有清楚操作。比如说IO流中的释放资源
特点:被finally控制的语句一定会执行,除非JVM退出

 

1 try{
2     可能出现异常的代码;
3 }catch(异常类名 变量名){
4     异常的处理代码;
5 }finally{
6     执行所有清楚操作;
7 }

 

 1 import java.io.FileOutputStream;
 2 import java.io.IOException;
 3 
 4 /*
 5 字节流数据加入异常处理
 6 */
 7 public class FileOutputStreamDemo4 {
 8     public static void main(String[] args) {
 9         /*
10         try {
11             FileOutputStream fos = new FileOutputStream("..\\hello java\\fos.txt");
12             fos.write("hello".getBytes());
13             fos.close();
14         } catch (IOException e) {
15             e.printStackTrace();
16         }
17         */
18         
19         //加入finally来实现释放资源
20         FileOutputStream fos = null;//在外面创建fos,给初始化null
21         try {
22             //            fos=new FileOutputStream("Z:\\hello java\\fos.txt");//错误地址
23             fos = new FileOutputStream("..\\hello java\\fos.txt");
24             fos.write("hello".getBytes());
25             fos.close();
26         } catch (IOException e) {
27             e.printStackTrace();
28         } finally {
29             if (null != fos) {//释放资源前对fos进行不为null的判断
30                 try {
31                     fos.close();//快捷键try...catch方法
32                 } catch (IOException e) {
33                     // TODO Auto-generated catch block
34                     e.printStackTrace();
35                 }
36             }
37         }
38 
39     }
40 }

 

字节流读数据(一次读一个字节数据)

 

FileInputStream:从文件系统中的文件获取输入字节


使用字节输入流读数据的步骤:

  1. 创建字节输入流对象
  2. 调用字节输入流对象的读数据方法
  3. 释放资源

 

 1 import java.io.FileInputStream;
 2 import java.io.IOException;
 3 
 4 /*
 5 字节流读数据(一次读一个字节数据)**
 6 
 7 需求:把文件fos.txt中的内容读取出来在控制台输出
 8 
 9 FileInputStream:从文件系统中的文件获取输入字节
10 
11  - FileInputStream(String name):通过打开与实际文件的连接俩创建一个FileInputStream,该文件由文件系统中的路径名name命名
12 
13 使用字节输入流读数据的步骤:
14 
15  1. 创建字节输入流对象
16  2. 调用字节输入流对象的读数据方法
17  3. 释放资源
18 */
19 
20 public class FileInputStreamDemo {
21     public static void main(String[] args) throws IOException {
22         //创建字节输入流对象
23         //FileInputStream(String name)
24         FileInputStream fis = new FileInputStream("..\\hello java\\fos.txt");
25         /*
26             fos.txt中的内容
27                 ab
28         */
29 
30         //调用字节输入流对象的读数据方法
31         //int read():从该输入流读取一个字节的数据
32 
33         /*
34         //第一次读取数据
35         int i = fis.read();
36         System.out.println(i);//97
37         System.out.println((char)i);//a 强制转换
38         
39         //第一次读取数据
40         i = fis.read();
41         System.out.println(i);//98
42         System.out.println((char)i);//b 强制转换
43         
44         //再多读取两次
45         i = fis.read();
46         System.out.println(i);//-1 文件中没有数据了,返回-1
47         i = fis.read();
48         System.out.println(i);//-1
49         */
50 
51         /*
52         //判断条件:文件末尾-1
53         int by=fis.read();
54         while(by!=-1) {
55         //            System.out.println(by);
56             System.out.print((char)by);
57             by=fis.read();
58         }
59         运行结果:
60         ab
61         
62         */
63 
64         //优化上面的程序
65         int by;
66         /*
67         fis.read():读数据
68         by=fis.read():把读取到的数据赋值给by
69         by!=-1:判断读取到的数据是否是-1
70         
71         */
72         while ((by = fis.read()) != -1) {
73             System.out.print((char) by);
74         }
75         //        运行结果:
76         //        ab
77 
78         //释放资源
79         fis.close();
80 
81     }
82 }

 

案例:复制文本文件

 

分析:复制文本文件,就是把文件内容从一个文件中读取出来(数据源),然后写入另一个文件中(目的地)

 

 1 import java.io.FileInputStream;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 
 5 /*
 6 案例:复制文本文件
 7 需求:把“E:\\\itcast\\\窗里窗外.txt”复制到模块目录下的“窗里窗外.txt”
 8 
 9 分析:复制文本文件,就是把文件内容从一个文件中读取出来(**数据源**),然后写入另一个文件中(**目的地**)
10 
11 数据源:E:\\\itcast\\\窗里窗外.txt---读数据---InputStream---FileInputStream
12 目的地:..\\\hello java\\\窗里窗外.txt---写数据---OutputStream---FileOutputStream
13 
14 */
15 public class CopyDemo {
16     public static void main(String[] args) throws IOException {
17         //根据数据源创建字节输入流对象
18         FileInputStream fis = new FileInputStream("E:\\itcast\\窗里窗外.txt");
19 
20         //根据目的地创建字节输出流对象
21         FileOutputStream fos = new FileOutputStream("..\\hello java\\窗里窗外.txt");
22 
23         //读写数据,复制文本文件(一次读取一个字节,一次写入一个字节)
24         int by;
25         while ((by = fis.read()) != -1) {
26             fos.write(by);
27         }
28 
29         //释放资源
30         fos.close();
31         fis.close();
32 
33     }
34 }

 

字节流读数据(一次读一个字节数组数据)

需求:把文件fos.txt中的内容读取出来在控制台输出

使用字节输入流读数据的步骤:

  1. 创建字节输入流对象
  2. 调用字节输入流对象的读数据方法
  3. 释放资源

 

 1 import java.io.FileInputStream;
 2 import java.io.IOException;
 3 
 4 /*
 5 字节流读数据(一次读一个字节数组数据)**
 6 
 7 需求:把文件fos.txt中的内容读取出来在控制台输出
 8 
 9 使用字节输入流读数据的步骤:
10 
11  1. 创建字节输入流对象
12  2. 调用字节输入流对象的读数据方法
13  3. 释放资源
14 */
15 public class FileInputStreamDemo2 {
16     public static void main(String[] args) throws IOException {
17         //创建字节输入流对象
18         FileInputStream fis = new FileInputStream("..\\hello java\\fos.txt");
19 
20         //调用字节输入流对象的读数据方法
21         //int read(byte[] b):从该输入流读取最多 b.length个字节的数据到一个字节数组
22 
23         /*
24         byte[] bys=new byte[5];
25         
26         //第一次读取数据
27         int len = fis.read(bys);
28         System.out.println(len);
29         //String(byte[] bytes)
30         //        System.out.println( new String(bys) );
31         System.out.println( new String(bys,0,len) );
32         
33         //第二次读取数据
34         len = fis.read(bys);
35         System.out.println(len);
36         //        System.out.println( new String(bys) );
37         System.out.println( new String(bys,0,len) );
38         
39         //第三次读取数据
40         len = fis.read(bys);
41         System.out.println(len);
42         //String(byte[] bytes,int offset,int length)
43         System.out.println( new String(bys,0,len) );
44         //        System.out.println( new String(bys) );
45         
46         //再多读取两次
47         len = fis.read(bys);
48         System.out.println(len);
49         len = fis.read(bys);
50         System.out.println(len);
51         
52         运行结果:
53         5
54         hello
55         5
56         
57         wor
58         5
59         ld 
60         
61         -1
62         -1
63         
64         
65         */
66 
67         /*
68         hello\r\n
69         world\r\n
70         
71         第一次:hello
72         第二次:\r\nwor
73         第三次:ld\r\nr
74         */
75 
76         byte[] bys = new byte[1024];//1024及其整数倍
77         int len;
78         while ((len = fis.read(bys)) != -1) {
79             System.out.print(new String(bys, 0, len));
80         }
81         /*
82         运行结果:
83         hello
84         world 
85         
86         */
87 
88         //释放资源
89         fis.close();
90 
91     }
92 }

 

复制图片

 

 1 import java.io.FileInputStream;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 
 5 /*
 6 案例:复制图片
 7 
 8 需求:把“E:\\\itcast\\\mn.jpg”复制到模块目录下的“mn.jpg”
 9 
10 */
11 public class CopyJpg {
12     public static void main(String[] args) throws IOException {
13         //根据数据源创建字节输入流对象
14         FileInputStream fis = new FileInputStream("E:\\itcast\\mn.jpg");
15 
16         //根据目的地创建字节输出流对象
17         FileOutputStream fos = new FileOutputStream("..\\hello java\\mn.jpg");
18 
19         //读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
20         byte[] bys = new byte[1024];
21         int len;
22         while ((len = fis.read(bys)) != -1) {
23             fos.write(bys, 0, len);
24         }
25 
26         //释放资源
27         fis.close();
28         fos.close();
29 
30     }
31 }

 

字节缓冲流

字节缓冲流:

构造方法:

为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?

 

 1 import java.io.BufferedInputStream;
 2 import java.io.BufferedOutputStream;
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 
 7 /*
 8 字节缓冲流:
 9 
10  - BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以想底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
11  - BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
12 
13 构造方法:
14 
15  - 字节缓冲输出流:BufferedOutputStream(OutputStream out)
16  - 字节缓冲输入流:BufferedInputStream(InputStream in)
17 
18 */
19 public class BufferStreamDemo {
20     public static void main(String[] args) throws IOException {
21         //字节缓冲输出流:BufferedOutputStream(OutputStream out)
22         //        FileOutputStream fos=new FileOutputStream("..\\hello java\\bos.txt");
23         //        BufferedOutputStream bos=new BufferedOutputStream(fos);
24 
25         //合并成一步
26         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("..\\hello java\\bos.txt"));
27         //写数据
28         bos.write("hello\r\n".getBytes());
29         bos.write("world\r\n".getBytes());
30         //释放资源
31         bos.close();
32 
33         //字节缓冲输入流:BufferedInputStream(InputStream in)
34         BufferedInputStream bis = new BufferedInputStream(new FileInputStream("..\\hello java\\bos.txt"));
35 
36         //读数据
37         /*
38         //一次读取一个字节数据
39         int by;
40         while((by=bis.read())!=-1) {
41             System.out.print((char)by);
42         }
43         */
44         //一次读取一个字节数组的数据
45         byte[] bys = new byte[1024];
46         int len;
47         while ((len = bis.read(bys)) != -1) {
48             System.out.print(new String(bys, 0, len));
49         }
50 
51         //释放资源
52         bis.close();
53 
54     }
55 }

 

案例:复制视频

 

  1 import java.io.BufferedInputStream;
  2 import java.io.BufferedOutputStream;
  3 import java.io.FileInputStream;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 
  7 /*
  8 案例:复制视频
  9 需求:把“E:\\\itcast\\\字节流复制图片.avi”复制到模块目录下的“字节流复制图片.avi”
 10 思路:
 11 
 12  1. 根据数据源创建字节输入流对象
 13  2. 根据目的地创建字节输出流对象
 14  3. 读写数据,复制视频
 15  4. 释放资源
 16  
 17  
 18  四种方式实现复制视频,并记录每种方式复制视频的时间
 19      1.基本字节流一次读写一个字节        共耗时:72743毫秒
 20      2.基本字节流一次读写一个字节数组        共耗时:87毫秒
 21      3.字节缓冲流一次读写一个字节        共耗时:198毫秒
 22      4.字节缓冲流一次读写一个字节数组        共耗时:22毫秒
 23 
 24 */
 25 
 26 public class CopyAviDemo {
 27     public static void main(String[] args) throws IOException {
 28         //记录开始时间
 29         long startTime = System.currentTimeMillis();
 30 
 31         //复制视频
 32         //        method1();
 33         //        method2();
 34         //        method3();
 35         method4();
 36 
 37         //记录结束时间
 38         long endTime = System.currentTimeMillis();
 39         System.out.println("共耗时:" + (endTime - startTime) + "毫秒");
 40 
 41     }
 42 
 43     //4.字节缓冲流一次读写一个字节数组
 44     private static void method4() throws IOException {
 45         BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字节流复制图片.avi"));
 46         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("..\\hello java\\字节流复制图片.avi"));
 47 
 48         byte[] bys = new byte[1024];
 49         int len;
 50         while ((len = bis.read(bys)) != -1) {
 51             bos.write(bys, 0, len);
 52         }
 53 
 54         bis.close();
 55         bos.close();
 56 
 57     }
 58 
 59     //3.字节缓冲流一次读写一个字节
 60     private static void method3() throws IOException {
 61         BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\itcast\\字节流复制图片.avi"));
 62         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("..\\hello java\\字节流复制图片.avi"));
 63 
 64         int by;
 65         while ((by = bis.read()) != -1) {
 66             bos.write(by);
 67         }
 68 
 69         bis.close();
 70         bos.close();
 71 
 72     }
 73 
 74     //2.基本字节流一次读写一个字节数组
 75     private static void method2() throws IOException {
 76         FileInputStream fis = new FileInputStream("E:\\itcast\\字节流复制图片.avi");
 77         FileOutputStream fos = new FileOutputStream("..\\hello java\\字节流复制图片.avi");
 78 
 79         byte[] bys = new byte[1024];
 80         int len;
 81         while ((len = fis.read(bys)) != -1) {
 82             fos.write(bys, 0, len);
 83         }
 84 
 85         fis.close();
 86         fos.close();
 87 
 88     }
 89 
 90     //1.基本字节流一次读写一个字节
 91     private static void method1() throws IOException {
 92         //E:\\\itcast\\\字节流复制图片.avi
 93         //模块目录下的字节流复制图片.avi
 94         FileInputStream fis = new FileInputStream("E:\\itcast\\字节流复制图片.avi");
 95         FileOutputStream fos = new FileOutputStream("..\\hello java\\字节流复制图片.avi");
 96 
 97         int by;
 98         while ((by = fis.read()) != -1) {
 99             fos.write(by);
100 
101         }
102 
103         fos.close();
104         fis.close();
105     }
106 }

 

标签:java,字节,fos,bys,FileOutputStream,new,JAVA
来源: https://www.cnblogs.com/cuipengchong/p/16244213.html