java IO流(二)字节流

1. Java 中有几种类型的流

按照流的方向:输入流(inputStream)和输出流(outputStream)。

按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个 已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。处理流的构造方法总是要 带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)

按照处理数据的单位:字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于 InputStreamReader 和 OutputStreamWriter

这篇主讲字节流,下一篇会将字符流

字节流

一切的文本数据(文本,图片,视频)都是二进制存储,所以理论上字节流可以传输任何的数据。

字节输出流:

写出字节与字节数组

 //(在项目根目录)创建流对象(如果没有文件就创建文件,存在就覆盖文件)
        FileOutputStream fileOutputStream=new FileOutputStream("a.txt");
        //写出一个字节
        fileOutputStream.write(97);
        //将字符串转换为字节数组
        byte[] a="你好输出流".getBytes();
        //写出字节数组
        fileOutputStream.write(a);
        //关闭流
        fileOutputStream.close();

运行结果:在项目的根目录下生成了一个a.txt内容如下

 以上的代码每次运行都会重新覆盖原有内容

数据追加续写与换行:

//true为开启数据追加
        FileOutputStream fileOutputStream=new FileOutputStream("a.txt",true);
        //换行
        fileOutputStream.write("\r\n".getBytes());
        byte[] a="追加内容".getBytes();
        fileOutputStream.write(a);

运行结果:

 以上为a.txt的内容

字节输入流:

 //获取流对象
        FileInputStream fileInputStream=new FileInputStream("a.txt");
        //读到最后返回-1
        //读取a.txt的内容输出
           while (fileInputStream.read()!=-1){
               //读取一个字节
               int read=fileInputStream.read();
               //将读取的字节输出
               System.out.print((char) read);

以上代码为读取a.txt三个字节并将结果输出到控制台上

 输出结果中有乱码

我们可以通过String来解决,String的构造方法有解码功能

 FileInputStream inputStream=new FileInputStream("a.txt");
        byte[] bytes=new byte[1024];
        int len;
        while ((len=inputStream.read(bytes))!=-1){
            System.out.print(new String(bytes,0,len));
        }

运行结果:

 在使用字节输入流时还有一点要非常注意:

 FileInputStream inputStream=new FileInputStream("b.txt");
        byte[] bytes=new byte[2];
        int len;
        while ((len=inputStream.read(bytes))!=-1){
            System.out.print(new String(new String(bytes)));
        }

这个代码只是读取b.txt,然后输出结果

b.txt内容

运行结果:

 

 以上的运行结果为什么多了一个d?

这是由于d没有被覆盖掉

由于每次读取两个字节

 所以会将d也输出

复制本地图片:

    try {
            //读取根目录文件0.png
            FileInputStream fis=new FileInputStream("0.png");
            //设置字节数组大小与图片大小一至方便一次读取
            byte[]  arr2=new byte[23367130];
            fis.read(arr2);
            //在根目录写文件1.png
            FileOutputStream fos=new FileOutputStream("1.png");
            fos.write(arr2);
            //关闭流
             fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

运行结果:在项目的根目录生成了一个与0.png一摸一样的图片1.png

 

需要将0.png复制到项目的根目录(也可以写绝对路径或相对路径)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值