• Java复习7.输入输出流


    Java复习7.输入输出流 20131005

    前言:

             Java中涉及数据的读写,都是基于流的,这一块的知识相当重要,而且在Java中的数据,char字符是16bit的,所以存在字节流和字符流的区别。如果是字符文件的输入输出,使用字符流(以Reader/Writer为抽象基类),而其他的数据是二进制的,需要使用字节流(以InputStream和OutputStream为抽象基类)。

             其实不止文件,网络数据传输也是输入输出流。

    目录

    1.字节流和字符流... 2

    1.1字节输入流:... 2

    1.2字节输出流:... 5

    2.字符流... 6

    2.1字符数据流输入:... 6

    2.2字符数据流输出:... 7

    3.使用缓冲数据流,提高IO的效率,减少IO的次数... 7

    3.1缓冲字节流: 8

    3.2缓冲字符流:... 9

    为了便于理解,附图一张:

     

     

    1.字节流和字符流

             字节流就是数据的基本单位是byte,字符流使用字符组成的,基本单位是char,在Java中char是由两个字节保存的。所有的InputStream/OutputStream的子类都可以用于处理二进制数据,他是按照字节存储的,但是对于字符的文本文件,使用字符流比较好。

             首先是字节流,基类是InputStream/OutputStream

    1.1字节输入流:

    InputStream in = null;

    try {

        String filePath = ClassLoader.getSystemResource("a.txt").getPath();

        System.out.println("FilePath:"+filePath);

        /*

         * 以字节流的方式打开文件,读取的是一个二进制流 byte[] ,如果不存在该文件,则会抛出异常,FileNotFoundException           *

         */

        in = new FileInputStream(filePath);

        byte[] buf = new byte[100];

        // read file from inputstream

        /*

         * public int read(); read next byte data, if to the file end return -1;

         * public int read(byte[] buf);

         * Reads up to b.length bytes of data from this input stream into an array of bytes.

         * return the total number of bytes read into the buffer, or -1 if there is no more data

         * because the end of the file has been reached.

         * we should clear the buf or record the read byte number.

         *

         */

        if(in != null){

           /*

            * 比较正规的读取方式,这样每一次获取的是一定字节数的byte,保存在响应的字节中,然后

            * 将字节数组转换成String输出结果

            */

          

           /*int read_byte_number = -1;

           int count = 0;

           while( (read_byte_number = in.read(buf, 0, 100)) != -1){

               System.out.print(new String(buf,0,read_byte_number));

               count++;

           }

           System.out.println("count:" + count);

           */

           /*

            *  在文件中的数据,一个ASCII对应的是一个字节,但是一个汉字或者其他的字符,保存在文件中是两个字节

            *  我们读取的时候使用read只是读取的一个字节,所以对于ASCII的字符是可以读取出来的,返回值对应的ASCII的int

            *  可以将它转换成相应的char;但是对于汉字是不可以的,每次只是读取的一个字符。

            */

           int i = in.read();

           System.out.println(i+":" + (char)i);

        }

    } catch (FileNotFoundException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }finally{

        if(in != null){

           try {

               in.close();

           } catch (IOException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

           }

        }         

    }

    1.2字节输出流:

    OutputStream  out = null;

    try {

        /*

         * if the file does not exist, it will create the file

         * if the file exists, but append default is false, it will clear the file write new content

         * we can use the parameter append = true to append context to the end

         */   

        out = new FileOutputStream("b.txt",true);

        out.write('腾');

        /*

         * public void write(int b); 可以是一个char但是,如果在ASCII之外的字符,就只能写一byte结构很坑,不可预期

         * public void write(byte[] buf);

         * public void write(byte[] buf, int start, int length);

         */

    } catch (FileNotFoundException e1) {

        // TODO Auto-generated catch block

        e1.printStackTrace();

    } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }finally{

        if(out != null){

           try {

               out.close();

           } catch (IOException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

           }

        }         

    }

    2.字符流

        使用字节流是不可以处理中文的,这样我们就必须使用字符流。字符流的基类是Reader/Writer

        Reader BufferedReader

               InputStreamReader    FileReader

        Writer BufferedWriter

               OutputStreamWriter       FileWriter

               PrintWriter

        这几个是常见的使用的。

    2.1字符数据流输入:

    Reader reader= null;

    try {

        reader = new FileReader(ClassLoader.getSystemResource("a.txt").getPath());

        char[] buf  = new char[10];

        int count = 0;

        while((count = reader.read(buf,0,10)) != -1){

            System.out.print(new String(buf,0,count));

        }

        /*

         * use public int read() function return 0x0000~0xffff int value 

         */

        /*int a;

        while((a=reader.read()) != -1){

            System.out.println((char)a);

        }

        */

    } catch (FileNotFoundException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }finally{

        if(reader != null){

            try {

                reader.close();

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    }

    2.2字符数据流输出:

    Writer out = null;

    try {

        // FileWriter(String filename, boolean append = false);

        //FileWriter(File file, boolean append = false);

        out = new FileWriter("a.txt",true);

    } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }

    char buf[] = {'杨','腾','飞','a','b','c'};

     

    if(out != null){

        try {

           System.out.println(new String(buf,0,buf.length));

           out.write(buf, 0, buf.length);

           out.flush();

        } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

        }finally{

           if(out != null){

               try {

                  out.close();

               } catch (IOException e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

               }

           }

        }

    }

    3.使用缓冲数据流,提高IO的效率,减少IO的次数

        2中的操作数据流的方法特别低效,不适合远程操作或者是大型项目,我们使用缓冲数据流提高IO的性能。

    3.1缓冲字节流:

        InputStream   FileInputStream

                      FilterInputStream  BufferedInputStream

        OutputStream  FileOutputStream

                      FilterOutputStream BufferedOutputStream  

    将FileInputStream/FileOutputStream转换成

    BufferedInputStream/BufferedOutputStream

    BufferedInputStream bis = null;

    try {

        bis = new BufferedInputStream(new FileInputStream("a.txt"));

        byte [] buf = new byte[10];

        int count = -1;

        while( (count = bis.read(buf, 0, 10)) != -1){

           System.out.print(new String(buf,0,count));

        }

    } catch (FileNotFoundException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }finally{

        if(bis != null){

           try {

               bis.close();

           } catch (IOException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

           }

        }

    }

     

    BufferedOutputStream bos = null;

    try {

        bos = new BufferedOutputStream(new FileOutputStream("b.txt",true));

        byte[] buf = null;

        String a = "杨腾飞a";

        buf = a.getBytes();

        bos.write(buf,0,buf.length);

        bos.flush();

    } catch (FileNotFoundException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }finally{

        if(bos != null){

           try {

               bos.flush();

               bos.close();

           } catch (IOException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

           }

        }

    }

    3.2缓冲字符流:

    BufferedReader/BufferedWriter

    BufferedReader breader = new BufferedReader(new FileReader(“filename”))

    Example:

    BufferedReader breader = null;

    try {

         breader = new BufferedReader(new FileReader("a.txt"));

         char[] buf = new char[10];

         int count = -1;

         while( (count = breader.read(buf, 0, 10))  != -1){

            System.out.print(new String(buf,0,count));

         }

         //每一次获取一行数据,当遇到行结束的时候,终止,返回的是一个字符串,但是不包含换行符。

         /*

          String a ;

          while((a=breader.readLine()) != null){

            System.out.println(a);

         }

         */

         

    } catch (FileNotFoundException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }

    缓冲输出流的话,详细你也会了吧,就这样了

    在Java 中的输入输出流是十分重要的一个知识点,后面的网络编程也是需要用到这些输入输出流。

    追梦的飞飞

    于广州中山大学 20131005

    HomePage: http://yangtengfei.duapp.com

  • 相关阅读:
    Scrapy抓取Quotes to Scrape
    pyspider爬取TripAdvisor
    [转]Python爬虫框架--pyspider初体验
    使用代理处理反爬抓取微信文章
    控制流程语句
    【bzoj3029】守卫者的挑战 概率dp
    【bzoj4994】[Usaco2017 Feb]Why Did the Cow Cross the Road III 树状数组
    【bzoj4952】[Wf2017]Need for Speed 二分
    【bzoj5047】空间传送装置 堆优化Dijkstra
    【bzoj5055】膜法师 离散化+树状数组
  • 原文地址:https://www.cnblogs.com/hbhzsysutengfei/p/3409527.html
Copyright © 2020-2023  润新知