首页 > 编程语言 > 详细

黑马程序员——Java基础---IO流

时间:2015-11-29 21:06:07      阅读:292      评论:0      收藏:0      [点我收藏+]

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

                                                                                                    IO

.IO

 

     1.概念

 

            1) IO流用来处理设备之间的数据传输

 

            2)Java对数据的操作是通过流的方式

 

            3)Java用于操作流的类都在IO包中

 

         4)流按流向分为两种:输入流,输出流。

 

            5) 流按操作类型分为两种: 

                字节流 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的

 

                      字符流 字符流只能操作纯字符数据,比较方便。

 

    2.IO流常用父类

 

        字节流的抽象父类:

 

           InputStream 

 

           OutputStream

 

        字符流的抽象父类:

 

             Reader 

 

             Writer

 

 3.IO程序书写

 

      使用前,导入IO包中的类

 

      使用时,进行IO异常处理

 

      使用后,释放资源

 

.字节流

 

     1.常用方法

 

         InputStream:

 

               read() 读取一个字节

 

               read(byte[]) 读取若干(数组长度)字节

 

               available() 获取可读的字节数

 

               close() 关闭流释放资源

 

       OutputStream:

 

           write(int) 写出一个字节

 

           write(byte[]) 写出数组中的所有字节

 

           write(byte[],start,len);

 

           close() 关闭流释放资源

 

   2.读取文件

 

    创建FileInputStream对象指定一个文件文件必须存在不存在则会抛出FileNotFoundException

 

    使用read()方法可以从文件中读取一个字节如果读取到文件末尾会读到-1

 

    读取结束后需要释放资源调用close()方法关闭输入流

 

 

 

输入流代码:

 

 1 FileInputStream fis = new FileInputStream("xxx.txt"); //创建流对象,关联xxx.txt文件
 2 
 3 
 4 int b;
 5 
 6 
 7 while((b = fis.read()) != -1) { //将每次读到的结果赋值给b
 8 
 9 
10 System.out.println(b);
11 
12 
13 }
14 
15 fis.close();

为什么read方法返回是int而不是byte类型呢?

 

    因为如果读取的是视频文件或音频文件或图片文件等,在读取过程中很有可能会遇到11111111,也就是byte类型的-1,那么遇到-1程序就会停止读取,会漏掉文件,

   为了防止这种情况出现,byte类型提升为int类型,在这个字节前补上240,把遇到的-1变成255,这样可以保证将整个文件读完

 

3.写出文件

 

   创建FileOutputStream对象指定一个文件文件不存在会创建新文件存在则清空原内容如果需要追加在构造函数中传入true.

 

   使用write()方法可以向文件写出一个字节.

 

   写出结束后同样需要调用close()

 

 

 

输出流代码:

 

 1 FileOutputStream fos = new FileOutputStream("aaa.txt"); //创建流对象,关联aaa.txt
 2 
 3 
 4 fos.write(100); //写出数据的时候会将前面24个0去掉,写出的是一个字节
 5 
 6 
 7 fos.write(98);
 8 
 9 
10 fos.write(99);
11 
12 
13 fos.close(); //关闭流,释放资源

 

4.拷贝文件

 

   可以从文件中逐个字节读取逐个字节写出但这样做效率非常低

 

   我们可以定义一个数组作为缓冲区一次读取多个字节装入数组然后再一次性把数组中的字节写出1byte = 8bit

 

 

 1,逐个字节拷贝

 

 

 1 FileInputStream fis = new FileInputStream("致青春.mp3"); //创建输入流对象,关联致青春.mp3
 2 
 3 
 4 FileOutputStream fos = new FileOutputStream("copy.mp3"); //创建输出流对象,关联copy.mp3
 5 
 6 
 7  
 8 
 9 
10 int b;
11 
12 
13 while((b = fis.read()) != -1) { //将每次读到的赋值给b
14 
15 
16 fos.write(b); //将b中的字节写出去
17 
18 
19 }
20 
21 
22 
23 fis.close(); //关流,释放资源
24 
25 
26 fos.close();  

 

 

 

 

   2,自定义数组拷贝

 

 

 

 1 FileInputStream fis = new FileInputStream("致青春.mp3"); //创建输入流对象,关联致青春.mp3
 2 
 3 
 4 FileOutputStream fos = new FileOutputStream("copy.mp3"); //创建输出流对象,关联copy.mp3
 5 
 6 
 7 byte[] arr = new byte[1024 * 8]; //自定义数组
 8 
 9 
10 int len;
11 
12 
13 while((len = fis.read(arr)) != -1) { //将数据读到字节数组中
14 
15 
16 fos.write(arr, 0, len); //从字节数组中将数据写到文件上
17 
18 
19 //fos.write(arr);
20 
21 
22 }
23 
24 
25 fis.close(); //关流,释放资源
26 
27 
28 fos.close();
29 
30 
31 
32 int len = read(arr);如果文件上有数据返回的就是读到有效的字节个数,如果文件上没有数据返回的就是-1

 

 

 3,定义一个大数组拷贝,数组和文件的字节个数一样大

 

 

 

 1 //fis.available();一次获取读的文件的大小
 2 
 3 
 4 FileInputStream fis = new FileInputStream("致青春.mp3");
 5 
 6 
 7 FileOutputStream fos = new FileOutputStream("copy.mp3");
 8 
 9 
10 byte[] arr = new byte[fis.available()]; //虽然可以拷贝,但是在开发时不建议,有可能会导致内存溢出
11 
12 
13 fis.read(arr);
14 
15 
16 fos.write(arr);
17 
18 
19 fis.close();

 

 

 4,带缓冲区的拷贝

 

 1 FileInputStream fis = new FileInputStream("致青春.mp3"); //创建输入流对象,关联致青春.mp3
 2 
 3 
 4 BufferedInputStream bis = new BufferedInputStream(fis); //对fis进行包装,内置一个8192大小的字节数组
 5 
 6 
 7 FileOutputStream fos = new FileOutputStream("copy.mp3"); //创建输出流对象,关联copy.mp3
 8 
 9 
10 BufferedOutputStream bos = new BufferedOutputStream(fos); //对fos进行包装,内置一个8192大小的字节数组
11 
12 
13  
14 
15 
16 int b;
17 
18 
19 while((b = bis.read()) != -1) { //read一次会先将文件上的数据读到缓冲区中,再从缓冲区一个一个的赋值给b
20 
21 
22 bos.write(b); //write一次,是将b中的字节数据写到缓冲区,缓冲区写满再一次写到文件上
23 
24 
25 }
26 
27 
28  
29 
30 
31 bis.close(); //只需要关掉包装后的即可
32 
33 
34 bos.close();

 

 

 5.BufferedInputStream

 

      BufferedInputStream内置了一个缓冲区(数组)

       BufferedInputStream中读取一个字节时

 

      BufferedInputStream会一次性从文件中读取8192存在缓冲区中返回给程序一个

 

       程序再次读取时就不用找文件了直接从缓冲区中获取

 

       直到缓冲区中所有的都被使用过才重新从文件中读取8192

 

 6.BufferedOutputStream

 

       BufferedOutputStream也内置了一个缓冲区(数组)

 

       程序向流中写出字节时不会直接写到文件先写到缓冲区中

 

       直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里

 

7.读中文

 

   字节流只读中文有弊端,可能会出现半个中文

 

   解决办法

 

          1,用字符流只读

 

          2,将文件上的所有的字节数据都读到缓冲区中,然后在转换成字符串ByteArrayOutputStream 

 

 1 FileInputStream fis = new FileInputStream("bbb.txt");
 2 
 3 
 4 byte[] arr = new byte[4];
 5 
 6 
 7 int len;
 8 
 9 
10 while((len = fis.read(arr)) != -1) {
11 
12 
13 System.out.println(new String(arr,0,len));
14 
15 
16 }
17 
18 
19  
20 
21 
22 fis.close(); 

 

 

8.写中文

 

     字节流是可以写字符串的

 

     但是必须将字符串转换成字节数组写出去

1  FileOutputStream fos = new FileOutputStream("bbb.txt");
2 
3 
4 fos.write("你要减肥,造吗".getBytes());
5 
6 
7 fos.close();

 

 

 

                                                       ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

黑马程序员——Java基础---IO流

原文:http://www.cnblogs.com/hmchengxuyuan/p/5005244.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!