美文网首页
Java之IO(二)字节流:InputStream/Output

Java之IO(二)字节流:InputStream/Output

作者: 如果仲有听日 | 来源:发表于2018-08-24 15:14 被阅读0次

    Java中文件数据流操作有2个大类:OutputStream/InputStream接口 和 FileWriter/FileReader类

    1. OutputStream接口:所有字节输出流的超类

    包:java.io.OutputStream

    作用:从java程序,写字节到文件,不能写入目录

    字节:数据流以字节的形式进行操作

    方法:因为是从程序存文件,因此方法都是write写方法

    1.1. OutputStream所有方法

    void write(int b) 将指定字节写入输出流

    void write(byte[] b) 将字节数组写入输出流

    void write(byte[] b, int off, int len) 将字节数组从off开始写入len个字节

    void close() 关闭输出流

    1.2. FileOutputStream类: OutputStream接口的一个实现类

    1.2.1. 写字节到文件

    构造方法:

        作用:绑定输出的输出目的地

        参数: FileOutputStream (File file)

                    FileOutputStream (String name)

    流对象使用步骤:

        1. 创建流子类的对象,丙丁数据目的

        2. 调用流对象的方法write

        3. close输出流

    如果文件不存在,创建文件;如果文件已经存在,则不保留原来内容,即重写文件内容

    public static void demo() throws IOException{

        FileOutputStream f = new FileOutputStream("/kluter/temp/fileOutS");

        f.write(1);

        f.write(2);

        f.write(48); //"0"

        f.write(49); //"1"

        f.write(11); //0x0b

        f.write(15); //0x0f

        f.close();

    }

    1.2.2 写字节数组到文件

    写一个完整的字节数组:

    public static void demo() throws IOException{

        FileOutputStream f = new FileOutputStream("/kluter/temp/fileOutS");

        byte[] barr = {10, 11, 12, 13, 14, 15};

        f.write(barr);

        f.close();

    }

    写部分字节数组:

    public static void demo() throws IOException{

        FileOutputStream f = new FileOutputStream("/kluter/temp/fileOutS");

        byte[] barr = {10, 11, 12, 13, 14, 15};

        f.write(barr, 2, 3);

        f.close();

    }

    由于字节数组输入单个字节很麻烦,提供用String转换写字节数组的简便方式:

    public static void demo() throws IOException{

        FileOutputStream f = new FileOutputStream("/kluter/temp/fileOutS");

        String s = "abcdef";

        f.write(s.getBytes());

        f.close();

    }

    1.2.3. 追加数据到文件

    使用带boolean append参数的双参构造器

    FileOutputStream (File file, boolean append)

    FileOutputStream (String name, boolean append)

    public static void demo() throws IOException{

        FileOutputStream f = new FileOutputStream("/kluter/temp/fileOutS", true);

        String s = "abcdef";

        f.write(s.getBytes());

        f.close();

    }

    1.2.4. 换行符

    加\n

    public static void demo() throws IOException{

        FileOutputStream f = new FileOutputStream("/kluter/temp/fileOutS", true);

        String s = "abcdef\n";

        f.write(s.getBytes());

        f.close();

    }

    1.3 I/O中的异常处理

    说明:

    1. 保证流对象变量,作用域正确

    2. catch里面,怎么处理异常

        输出异常,目的看到底哪里出了问题

        因为可能是硬件问题,只能听下程序,从新尝试

    3. 如果流对象创建失败了,需要关闭资源吗?

        new对象的时候,失败了,没有占用系统资源

        释放资源的时候,对流对象判断null,如果是null,不需要close资源

    2. InputStream接口:所有字节输入流的超类

    包:java.io.InputStream 

    作用:读取任意文件,每次读取一个字节

    2.1. InputStream所有方法

    abstract int read() 读取输入流的下1个字节

    int read(byte[] b) 从输入流读取一些字节存储到缓冲区

    int read(byte[] b, int off, int len) 从输入流偏移量off位置开始读取len个字节

    void close() 关闭输入流

    2.2. FileInputStream类: InputStream接口的一个实现类

    构造方法:

        FileInputSteam (File file)

        FileInputSteam (String name)

    2.2.1. 从文件读字节

    read()方法的特点,读取一个字节,文件指针移到下一个字节

    public int read()返回值:

        读取到的字节:成功

        -1:到文件末尾了

    public static void input() throws IOException{

        FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");

        int ret = 0;

        while(ret != -1){

            ret = fin.read();

            out.println(ret);

        }

        fin.close();

    }

    2.2.2. 从文件读到字节数组

    public int read(byte[] b)

    返回值:

        返回读取到的字节数:成功

        -1:已经到达文件末尾

    根据read返回读取的字节数来决定循环遍历:

    public static void input() throws IOException{

        FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");

        int ret = 0;

        byte[] barr = new byte[100];

        ret = fin.read(barr);

        out.print(ret);

        out.print("*******************");

        int idx = 0;

        while(idx < ret){

            out.print(barr[idx]);

            idx++;

        }

        fin.close();

    }

    将获取的字节数组使用String的构造函数转换成String来显示:

    public static void input() throws IOException{

        FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");

        int ret = 0;

        byte[] barr = new byte[100];

        ret = fin.read(barr);

        out.print(ret);

        out.print("*******************");

        String s = new String(barr);

        out.print(s);

        fin.close();

    }

    利用读取到的字节数,循环read到字节数组:

    一定要注意!倒数第二次read的时候,不是刚好读取数组长度个字节的情况下,打印数组有倒数第三次read字节的情况,用s = new String(barr, 0, ret);解决

    public static void input() throws IOException{

        FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");

        int ret = 0;

        String s = null;

        byte[] barr = new byte[3];

        while((ret = fin.read(barr)) != -1){

            out.println(ret);

            s = new String(barr, 0, ret);

            out.println(s);

        }

        fin.close();

    }

    3. 文件复制

    3.1. 单字节复制

    public static void copy_byte() throws IOException{

        FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");

        FileOutputStream fout = new FileOutputStream("/kluter/temp/fileCopy1", true);

        int ret = 0;

        while((ret = fin.read()) != -1){

            out.print((char)ret);

            fout.write(ret);

        }

        fin.close();

        fout.close();

    }

    3.2. 字节数组复制

    为了提高复制的效率,需要采用字节数组的方式来复制文件:

    public static void copy_arr() throws IOException{

        FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");

        FileOutputStream fout = new FileOutputStream("/kluter/temp/fileCopy2", true);

        int ret = 0;

        byte[] barr = new byte[6];

        String s = null;

        while((ret = fin.read(barr)) != -1){

            s = new String(barr, 0, ret);

            out.print(s);

            fout.write(barr);

        }

        fin.close();

        fout.close();

    }

    总结:

    为了演示,这里我没有加上IOexception的代码,但是工作中一定要加上

    单个字节的操作,效率远远低于字节数组

    读写中文用FileWriter和FilerReader类

    相关文章

      网友评论

          本文标题:Java之IO(二)字节流:InputStream/Output

          本文链接:https://www.haomeiwen.com/subject/pkpbiftx.html