• java IO流(二)


       IO流主要用于硬板、内存、键盘等处理设备上得数据操作,根据处理数据的数据类型的不同可以分为:字节流(抽象基类为InputStream和OutputStream)和字符流(抽象基类为Reader和Writer)。根据流向不同,可以分为:输入流和输出流。一般探讨IO流时,是按数据类型来分的。

    IO流的分类:

        流向:

          输入流  (读取数据)

          输出流  (写出数据)

        数据类型:

          字节流 

            字节输入流(读取数据) InputStream

            字节输出流 (写出数据)OutputStream

          字符流

            字符输入流 (读取数据) Reader

            字符输出流 (写出数据) Writer

     字符流和字节流的主要区别:

           1.字节流读取的时候,读到一个字节就返回一个字节;  字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。

           2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。

    一、字节流:

    1、字节输出流:FileOutputStream

    构造方法:

    public FileOutputStream(File file)        

    public FileOutputStream(String name)  

    public FileOutputStream(String name,boolean append):当append设为true,可以在原有文件上追加数据

    Write方法:

    public void write(int b) :写一个字节到文件输出流

    public void write(byte[] b) :从byte[]数组中写b.length个字节到文件输出流

    public void write(byte[] b, int off, int len) :从索引为off开始,写len个长度的字节到文件输出流 

        void createFileOutputStream() throws IOException {
            FileOutputStream fos=new FileOutputStream("a.txt");
    
            fos.write("Hello World".getBytes());
    
            byte[] by={97,98,99,100};
            fos.write(by);
    
            byte[] by2={101,102,103,104,105};
            fos.write(by2,1,3);
    
            fos.close();
        }

    最后给出加入了异常处理的字节输出流的写法:

      FileOutputStream fos= null;
            try {
                fos = new FileOutputStream("a.txt");
                fos.write("Hello World".getBytes());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(fos!=null){
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

     2、字节输入流:FileInputStream

    构造方法:

    public FileInputStream(File file)

    public FileInputStream(String name)

    读取方法:

    public int read()  :从输入流中读取一个字节,如果已到达文件末尾,则返回-1;

    public int read(byte[] b)  :从输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果因为已经到达文件末尾而没有更多的数据,则返回 -1

    以下是代码示例:

            //一次读取一个字节
            FileInputStream fis=new FileInputStream("a.txt");
            int b=0;
            while ((b=fis.read())!=-1){
                System.out.print((char)b);
            }
            fis.close();
    
            //一次读取一个字节数组
            FileInputStream fis2=new FileInputStream("a.txt");
            byte[] by=new byte[1024];
            int len=0;
            while ((len=fis2.read(by))!=-1){
                System.out.print(new String(by,0,len));
            }
            fis2.close();

    小提示:计算机是如何识别什么时候将两个字节转成中文的呢?

     因为中文的第一个字节肯定是负数,第二个字节不论正负,都没有影响。

    3、字节缓冲输出流:BufferedOutputStream 

    该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。 

            //字节缓冲输出流写出文件
            BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("a.txt"));
            bos.write("Hello World".getBytes());
            bos.close();

    4、字节缓存输入流:BufferedInputStream

    在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。

            //字节缓冲输入流读取文件
            BufferedInputStream bis=new BufferedInputStream(new FileInputStream("a.txt"));
            byte[] bytes=new byte[1024];
            int len=0;
            while ((len=bis.read(bytes))!=-1){
                System.out.print(new String(bytes,0,len));
            }      
            bis.close();

    二、字符流

    1、字符输出流  OutputStreamWriter、FileWriter

    字符流=字节流+编码。 

    a、OutputStreamWriter

    构造方法:

    OutputStreamWriter(OutputStream out) :根据默认编码把字节流的数据转换为字符流

    OutputStreamWriter(OutputStream out,String charsetName) :根据指定的编码把字节流的数据转换为字符流

    b、FileWriter--------FileWriter继承自OutputStreamWriter

    构造方法

    FileWriter(File file)

    FileWriter(String name)

    用法: 

            //用OutputStreamWriter写出
            OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("a.txt"));
            osw.write("Hello World 中国");
            osw.close();
            //用FileWriter写出
            FileWriter writer=new FileWriter("a.txt");
            writer.write("Hello World");
            writer.close();

     2、字符输入流  InputStreamReader  、FileReader

    a、InputStreamReader

    构造方法:

    InputStreamReader(InputStream in) :按默认编码读取

    InputStreamReader(InputStream in,String charsetName) :按指定编码读取

    b、FileReader--------FileReader继承自InputStreamReader

    构造方法:

    FileReader(File file)

    FileReader(String name)

    用法:

            //用InputStreamReader读取
            InputStreamReader reader=new InputStreamReader(new FileInputStream("a.txt"));
            char[] chars=new char[1024];
            int len=0;
            while ((len=reader.read(chars))!=-1){
                System.out.print(new String(chars,0,len));
            }
            reader.close();
            
            //用FileReader读取
            FileReader fileReader=new FileReader("a.txt");
            char[] chars1=new char[1024];
            int len1=0;
            while ((len=fileReader.read(chars1))!=-1){
                System.out.print(new String(chars1,0,len));
            }
            fileReader.close();

    3、字符缓存输出流   BufferedWriter

    将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

            BufferedWriter bw=new BufferedWriter(new FileWriter("a.txt"));
            bw.write("Hello World");
            bw.flush();
            bw.close();

    4、字符缓存输入流   BufferedReader

    从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

            BufferedReader br=new BufferedReader(new FileReader("a.txt"));
            char[] chars2=new char[1024];
            int len2=0;
            while ((len=br.read(chars2))!=-1){
                System.out.print(new String(chars2,0,len2));
            }
            br.close();
    
            //BufferedReader还提供了按行读取的功能readLine
            BufferedReader br1=new BufferedReader(new FileReader("a.txt"));
            String s="";
            while ((s=br1.readLine())!=null){
                System.out.print(s);
            }
            br1.close();
  • 相关阅读:
    Unity3D中使用委托和事件
    进程与线程浅析(三)之线程三国战斗模拟
    NGUI学习笔记(一)UILabel介绍
    Mongodb学习笔记(2)--修改器
    Mongodb学习笔记(1)--入门
    Java8学习笔记(七)--Collectors
    Java8学习笔记(六)--Optional
    Java8学习笔记(五)--Stream API详解[转]
    Java8学习笔记(四)--接口增强
    Java8学习笔记(三)--方法引入
  • 原文地址:https://www.cnblogs.com/liujufu/p/5035488.html
Copyright © 2020-2023  润新知