字节流

字节流写数据

字节流抽象基类 :

InputStream:这个抽象类是表示字节输入流的所有类的超类

OutputStream:这个抽象类是表示字节输出流的所有类的超类

子类名特点:子类名称都是以其父类名作为子类名的后缀

字节输出流 :

FileOutputStream(String name):创建文件输出流以指定的名称写入文件

使用字节输出流写数据的步骤 :

创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)

调用字节输出流对象的写数据方法

释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源) —很重要

package com.itxuexi.it17.FileOutput01;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo01 {
    public static void main(String[] args) throws IOException {
        //创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("G:\\javaSE_code\\fos.txt");
        /*
        做了三件事情:
            A:调用系统功能创建了文件
            B:创建了字节输出流对象
            C:让字节输出流对象指向创建好的文件
        */

        //void write(int b):将指定的字节写入此文件输出流
        fos.write(97);  //a
        fos.write(57);  //9

        //最后都要释放资源
        //void close():关闭此文件输出流,并释放与此流相关联的任何系统资源。
        fos.close();
        
    }
}

字节流写数据的3种方式
方法名说明
void write(int b)将指定的字节写入此文件输出流 一次写一个字节数据
void write(byte[] b)将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据
void write(byte[] b, int off, int len)将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据
package com.itxuexi.it17.FileOutput01;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo02 {
    public static void main(String[] args) throws IOException {
        //构造方法

        //FileOutputStream(String name):创建文件输出流以指定的名称写入文件
        //new Flie   不为空     new FileOutputStream(new ("G:\\javaSE_code\\fos.txt"));
        FileOutputStream fos = new FileOutputStream("G:\\javaSE_code\\fos.txt");

        //new Flie 等同上面方法
//        File file = new File("G:\\javaSE_code\\fos.txt");
//        FileOutputStream fos2 = new FileOutputStream(file);

        //void write​(byte[] b)  一次写一个字节数组数据
        byte [] bys = {97,98,99,100,101};
        fos.write(bys);                  //abcde
//        byte[] bys = "bacde".getBytes(); 等同于上面方法

        // void write​(byte[] b, int off, int len) 从偏移量off开始写入此文件输出流 ,一次写一个字节数组的部分数据
        byte [] byss = {97,98,99,100,101};
        fos.write(byss,1,3);     //bcd

        fos.close();

    }
}

字节流写数据的两个小问题

字节流写数据如何实现换行 :注意不同系统 \r\n

字节流写数据如何实现追加写入:

public FileOutputStream(String name,boolean append)

创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头

package com.itxuexi.it17.FileOutput01;

/*
字节流换行
    windos: \n\r
    linux: \n
    mac:\r
 */

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo03 {
    public static void main(String[] args) throws IOException {
        //append: true   在文件末尾追加写入 ;不加会重写文件
        FileOutputStream fos = new FileOutputStream("G:\\javaSE_code\\fos.txt",true);

        //写数据
        for (int i =0;i<10;i++){
            fos.write("hello".getBytes());
            //换行
            fos.write("\n\r".getBytes());
        }

        //释放内存
        fos.close();

    }
}
字节流写数据加异常处理
try{
	可能出现异常的代码;
}catch(异常类名 变量名){
	异常的处理代码;
}finally{
	执行所有清除操作;
}

finally:在异常处理时提供finally块来执行所有清除操作。比如说IO流中的释放资源

finally特点:被finally控制的语句一定会执行,除非JVM退出

package com.itxuexi.it17.FileOutput01;

import java.io.IOException;
import java.io.FileOutputStream;

public class FileOutputStreamDemo04 {
    public static void main(String[] args) {
//        try {
//            FileOutputStream fos = new FileOutputStream("G:\\javaSE_code\\fos.txt",true);
//            fos.write("hello".getBytes());
//            fos.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("G:\\javaSE_code\\fos.txt",true);
            fos.write("hello".getBytes());
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //判断文件不为null了时,执行释放资源操作 ;加强系统健壮性
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        

    }
}

字节流练习题
字节流读数据

一次读一个字节数据

把文件fos.txt中的内容读取出来在控制台输出

package com.itxuexi.it17.FileOutput01;

import java.io.FileInputStream;
import java.io.IOException;

public class FileOutputStreamEx01 {
    public static void main(String[] args) throws IOException {
        //创建字节流输入对象
        FileInputStream fis = new FileInputStream("G:\\javaSE_code\\fos.txt");

        /*
        //调用字节流输入对象的读数据方法
        byte [] bys = new byte[5];

        //第一次读数据
        int len = fis.read(bys);
        System.out.println(len);
        //String (byte [] bytes)
        System.out.println(new String(bys));                //hello

        //第二次读数据
        len = fis.read(bys);
        System.out.println(len);                            //hel
        System.out.println(new String(bys));

        //第三次读数据
        len = fis.read(bys);
        System.out.println(len);                            //lo
        System.out.println(new String(bys));
         */

        byte[] bys = new byte[1024];
        int len;
        while ((len = fis.read(bys)) != -1) {
            System.out.print(new String(bys, 0, len));
        }

        //释放资源
        fis.close();

    }
}

字节流复制文本文件
package com.itxuexi.it17.FileOutput01;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileOutputStream;

/*
//需求:把“E:\\itcast\\窗里窗外.txt”复制到模块目录下的“窗里窗外.txt

分析:
复制文本文件,其实就把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目的地)
数据源:
E:\\itcast\\窗里窗外.txt --- 读数据 --- InputStream --- FileInputStream
目的地:
myByteStream\\窗里窗外.txt --- 写数据 --- OutputStream --- FileOutputStream

 */
public class FileOutputStreamEx03 {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字节输入流对象
        FileInputStream fis = new FileInputStream("G:\\javaSE_code\\fos.txt");

        //根据目的地创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("G:\\javaSE_code\\out\\fos.txt");

        int by;
        while ((by = fis.read())!= -1){
            fos.write(by);
        }

        //释放资源
        fos.close();
        fis.close();

    }
}

字节流读数据(数组)
package com.itxuexi.it17.FileOutput01;

import java.io.FileInputStream;
import java.io.IOException;

public class FileOutputStreamEx04 {
    public static void main(String[] args) throws IOException {
        //创建字节流对象
        FileInputStream fis = new FileInputStream("G:\\javaSE_code\\fos.txt");

        //
        byte[] bye = new byte[1024];
        int len;
        while ((len = fis.read(bye))!= -1){
            System.out.println(new String(bye,0,len));
        }
        fis.close();
    }
}

字节流复制图片
package com.itxuexi.it17.FileOutput01;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamEx05 {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字节输入流对象
        FileInputStream fis = new FileInputStream("G:\\javaSE_code\\IMG_1093.JPG");

        //根据目的地创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("G:\\javaSE_code\\out\\IMG_1093.JPG");

        //读写数据
        byte[] bys = new byte[1024];
        int len;
        while ((len=fis.read(bys))!=-1){
            fos.write(bys,0,len);
        }

        //释放资源
        fos.close();
        fis.close();
    }
}

字节缓冲流

字节缓冲流介绍

lBufferOutputStream:该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写 入字节,而不必为写入的每个字节导致底层系统的调用

lBufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过 字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节

构造方法:

BufferedOutputStream(OutputStream out) 创建字节缓冲输出流对象

BufferedInputStream(InputStream in) 创建字节缓冲输入流对象

package com.itxuexi.it18.Buffered01;

import java.io.*;

public class BufferedDemo01 {
    public static void main(String[] args) throws IOException {
        //字节缓冲输出流:BufferedOutputStream(OutputStream out)
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("G:\\javaSE_code\\fos.txt"));

        //写数据
        bos.write("hello\n\r".getBytes());
        bos.write("world\n\r".getBytes());

        //释放资源
        bos.close();

        //字节缓冲输入流:BufferedInputStream(InputStream in)
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("G:\\javaSE_code\\fos.txt"));

//        //一次读取一个字节
//        int by;
//        while ((by = bis.read()) != -1) {
//            System.out.println((char)by);
//        }

        //一次读取一个字节数组数据
        byte[] bys = new byte[1024];
        int len;
        while ((len = bis.read(bys)) != -1){
            System.out.println(new String(bys,0,len));
        }

        //释放资源
        bis.close();

    }
}
字节流复制视频(字节流/字节缓冲流 读取字节/字节数组 耗时)
package com.itxuexi.it18.Buffered01;

import java.io.*;

public class BufferedDemo02 {
    public static void main(String[] args) throws IOException {
        //记录开始时间
        long startTime = System.currentTimeMillis();
//        mothod1();   //共耗时126732毫秒
        mothod2();     //共耗时172毫秒
//        mothod3();     //共耗时687毫秒
//        mothod4();     //共耗时57毫秒
        
        //记录结束时间
        long endTime = System.currentTimeMillis();

        System.out.println("共耗时" + (endTime - startTime) + "毫秒");
    }

    //字节缓冲流一次读写一个字节数组
    public static void mothod4 () throws IOException{
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("G:\\javaSE_code\\10-Java语言(Hello World).avi"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("G:\\javaSE_code\\out\\10-Java语言(Hello World).avi"));

        byte [] bys = new byte[1024];
        int len;
        while((len = bis.read(bys)) != -1){
            bos.write(bys,0,len);
        }
        bis.close();
        bos.close();
    }

    //字节缓冲流一次读写一个字节
    public static void mothod3() throws IOException{
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("G:\\javaSE_code\\10-Java语言(Hello World).avi"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("G:\\javaSE_code\\out\\10-Java语言(Hello World).avi"));

        int by;
        while ((by = bis.read()) != -1){
            bos.write(by);
        }

        bis.close();
        bos.close();
    }


    //字节流一次读写一个字节
    public static void mothod2() throws IOException{
        //创建源地址
        FileInputStream fis = new FileInputStream("G:\\javaSE_code\\10-Java语言(Hello World).avi");
        FileOutputStream fos = new FileOutputStream("G:\\javaSE_code\\out\\10-Java语言(Hello World).avi");

        byte[] bys = new byte[1024];
        int len;
        while ((len = fis.read(bys)) != -1){
            fos.write(bys,0,len);
        }
        fos.close();
        fis.close();

    }

    //基本字节流一次读写一个字节
    public static void mothod1() throws IOException {
        //创建源地址
        FileInputStream fis = new FileInputStream("G:\\javaSE_code\\10-Java语言(Hello World).avi");
        //创建目标地址
        FileOutputStream fos = new FileOutputStream("G:\\javaSE_code\\out\\10-Java语言(Hello World).avi");

        int by;
        while ((by = fis.read()) != -1) {
            fos.write(by);
        }
        fos.close();
        fis.close();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岿然如故

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值