黑马程序员-javase-io(1)

来源:互联网 发布:缓存数据库 编辑:程序博客网 时间:2024/05/21 22:42

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

   IO

一、概述

1、流的概念和作用:流失一组由顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输为流

      流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

2IO:即InputOutput的缩写。

3、特点:

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

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

        3Java用于操作流的对象都在IO包中。

        4)流按操作数据分为两种:字节流和字符流。

        5)流按流向分为:输入流和输出流。

注意:流只能操作数据,而不能操作文件。

4IO流的常用基类:

        1)字节流的抽象基流:InputStreamOutputStream

        2)字符流的抽象基流:ReaderWriter

注:此四个类派生出来的子类名称都是以父类名作为子类名的后缀,以前缀为其功能;如InputStream子类FileInputStreamReader子类FileReader

如下图



二、 字符流简述

       字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字   节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.

三、字符流缓冲区

    1)、 缓冲区的出现提高了对数据的读写效率,所以在创建缓冲区之前,必须要有流对象。

    2)、对应类  BufferedWriter    BufferedReader

    3)、缓冲区要结合流才可以使用。

    4)、在流的基础上对流的功能进行了增强。

    5)、 该缓冲区提供了一个跨平台的换行符。 newLine();其实关闭缓冲区,就是在关闭缓冲区中的流对象。

    bufw.close();

    6)、字符串取流缓冲区:

       该缓冲区提供了一个一次读一行的方法,readLine,方便与文本数据的获取。当返回null时,表示读到文件末尾。

       readLine 方法返回的时候只返回回车符之前的数据内容,并不返回回车符

       readLine 方法的原理无论是读一行,获取读取多个字符,其实最终都是在硬盘上以一个读取。所以最终使用的还   是read方法,一次读一个方法。

     7)、实例:复制纯文本文件

public class CopyDemo {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubBufferedWriter bw = null;BufferedReader br = null;try {bw = new BufferedWriter(new FileWriter("E:\\a.txt"));br = new BufferedReader(new FileReader("D:\\a.txt"));String msg = null;//用缓冲的话不需要刷新流while((msg = br.readLine())!=null){bw.write(msg);bw.newLine();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {bw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {br.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} }



 四、字节流 

        1)、InputStream OutputStram

               需求,想要操作图片数据。这时需要用到字节流

        2)、如果直接使用字节流,没有指定使用缓冲区的话,是不用刷新的。

              流操作的基本规律:

              Buffered****.read() 都是从内存中取数据,

              FileReader.read(); 从硬盘上取数据

       3)、读取键盘录入。

          System.out:对应的是标准输出设备,控制台。

          System.in:对应的是标准输入设备,键盘

          Ctrl+z 往里面加结束标志或Ctrl+c

 

       4)、获取键盘录入对象:

          将字节流对象转成字符流对象,使用转换流InputStreamReader

          为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader;

          字符流底层用的也是字节流那个缓冲区

       5)、键盘最常见写法

                   BufferedReader a =new BufferedReader(new InputStreamReader(System.in));

              将字符流对象对象转成字节流

                 OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的charset 将要写入流中的字符编码成字节

                 BufferedWrite bufw = new BufferedWrite(newOutputStreamWriter(System.out));

 

 

         6)、 Propertise a =System.getPropertise();获取系统属性。

         7)、实例:复制图片

 

public class CopyDemo {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubFileInputStream fis = null;FileOutputStream fos = null;/* * 如果图像大小大于一次数组的容纳量,那么就不是完整的复制,所以需要从源文件中不断的把数据取到数组中,直到len为-1 */try {fis = new FileInputStream("e:\\a.jpg");fos = new FileOutputStream("d:\\a.jpg");byte[] arr = new byte[1024];int len = 0 ;while((len = fis.read(arr))!=-1){fos.write(arr, 0, len);fos.flush();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {fis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {fos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}


五、什么时候该用字节流,什么时候用字符流

    1 明确源和目的。

       源:输入流 InputSteam Reader

       目的 :输出流 OutputStream Writer

    2 操作的数据是否纯文本

      是:字符流

     不是:字节流

 

    3 当体系明确后,在明确要使用哪个具体对象。

       通过设备来区分。

      源设备:内存,硬盘,键盘

     目的设备:内存,硬盘,控制台。

 

记住,转化流什么时候用,字符与字节之间的桥梁,通常,涉及到字符编码转化时,

需要用到转化流

 




0 0