JAVA基础【字节流】史上最简单的字节流操作演示

前言:

其实字符流的底层还是使用的字节流,因为计算机只识别二进制,虽然我们输出字符流的时候,里面写的是字符但是最终还是转换成字节流然后在进行存储或读取。并且还使用到了一个中间转换的类OutputStreamWriter和InputStreamReader,一个是在输出到本地的时候可以把字符流转换成字节流输出,还有一个是在本地读取字节流的内容,然后转换成字符流输出到程序的控制台或者存储到指定的容器里。

概述:

本篇博客会先从什么是IO流的概念开始介绍,然后才是例子演示。所以前面一部分理论可能会有点枯燥,不过没有理论的例子是没有灵魂的。如果没有理论指导,即使把例子实现了也不会真正的理解什么是IO流?什么是字节流?什么是字符流?所以先从概念开始,然后依次是读取本地文件和把用户输入的内容输出到指定的硬盘位置。最后会有一个小小的扩展图片复制(本片博客例子部分只列出了字节流的操作,字符流的详细操作敬请期待下一篇博客。)

目录

IO流

概念:

分类:

数据的流向分为:输入流和输出流。

数据的类型分为:字节流和字符流。

IO流图解流向说明

读取

单个读取

数组读取

写出

单个写出

数组写出

图片复制

IO流
概念:
生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了。当你电脑 上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬 盘、外接设备等等。 我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 输入input 和 输出 output ,即流向内存是输入流,流出内存的输出流。 Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写 出数据。

分类:
数据的流向分为:输入流和输出流。
输入流 :把数据从 其他设备 上读取到 内存 中的流。

输出流 :把数据从 内存 中写出到 其他设备 上的流。

数据的类型分为:字节流和字符流。
字节流 :以字节为单位,读写数据的流。

字符流 :以字符为单位,读写数据的流。

IO流图解流向说明

读取
单个读取
package com.itheima.demo02.Reader;

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

/*

  • 使用字节流读取中文文件
  • 1个中文
  • GBK:占用两个字节
  • UTF-8:占用三个字节
  • */
    public class Demo01InputStream {
    public static void main(String[] args) throws IOException {
    FileInputStream fis=new FileInputStream("F:\虚拟机共享文件\Stream\康世行.txt");
    int len=0;
    while ((len=fis.read())!=-1){
    System.out.println(len);
    }
    fis.close();
    }
    }
    数组读取
    package com.itheima.demo02.Reader;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.IOException;
/*

    1. 使用字节数组读取: read(byte[] b) ,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读
      取到末尾时,返回 -1
  • */
    public class Demo02Reader {
    public static void main(String[] args) throws IOException {
    // 使用文件名称创建流对象.
    FileInputStream fis = new FileInputStream("read.txt"); // 文件中为abcde
    // 定义变量,作为有效个数
    int len ;
    // 定义字节数组,作为装字节数据的容器
    byte[] b = new byte[2];
    // 循环读取
    while (( len= fis.read(b))!=‐1) {
    // 每次读取后,把数组变成字符串打印
    System.out.println(new String(b));
    }
    // 关闭资源
    fis.close();

    }
    }
    写出
    单个写出
    package com.itheima.demo01.OutputStream;

import java.io.*;

/*
*java.io.OutputStream此抽象类是表示输出字节流的所有类的超类
* public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输
出到此输出流。
public abstract void write(int b) :将指定的字节输出流

  • 继承者 java.io.FileOutputStream 文件字节输出流
  • 构造方法
  • FileOutputStream(File file)
    创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
    FileOutputStream(String name)
    创建一个向具有指定名称的文件中写入数据的输出文件流。
    参数: 写入数据的目的地
    • File file 目的地是一个文件(对象)
    • String name 目的地是一个文件路径
    • 作用
    • 1.创建一个FileoutputStream对象
    • 2.会根据构造方法中 传递的文件/文件路径,创建一个空文件
    • 3.会把Fileoutputstream对象指向创建好的文件
  • */
    public class Demo01OutputStream {
    public static void main(String[] args) {
    //使用File对象创建流对象
    File file=new File("F:\虚拟机共享文件\Stream\康世行.txt");
    try {
    //输出到指定位置
    FileOutputStream fos=new FileOutputStream(file,true);
    //读取指定文件内容
    FileInputStream finput=new FileInputStream(file);
    //向文件里写入数据
    fos.write('s');
    finput.close();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    数组写出
    package com.itheima.demo01.OutputStream;

import java.io.*;

/*
*java.io.OutputStream此抽象类是表示输出字节流的所有类的超类
* public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输
出到此输出流。
public abstract void write(int b) :将指定的字节输出流

  • 继承者 java.io.FileOutputStream 文件字节输出流

  • 构造方法

  • FileOutputStream(File file)
    创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
    FileOutputStream(String name)
    创建一个向具有指定名称的文件中写入数据的输出文件流。
    参数: 写入数据的目的地

    • File file 目的地是一个文件(对象)
    • String name 目的地是一个文件路径
    • 作用
    • 1.创建一个FileoutputStream对象
    • 2.会根据构造方法中 传递的文件/文件路径,创建一个空文件
    • 3.会把Fileoutputstream对象指向创建好的文件
  • */
    public class Demo01OutputStream {
    public static void main(String[] args) {
    //使用File对象创建流对象
    File file=new File("F:\虚拟机共享文件\Stream\康世行.txt");

     try {
         //输出到指定位置
         FileOutputStream fos=new FileOutputStream(file,true);
         //读取指定文件内容
         FileInputStream finput=new FileInputStream(file);
        
        //使用字节数组
         byte[] b="康世行".getBytes();
         fos.write(b);//写出数据
         fos.write(';');
         
         //读取指定文件内容
         //使用字节数组读取
         int len;//定义变量,作为有效个数(标记)
         //定义字节数组,作为封装字节数据的容器
         byte[] b1=new byte[2];
         while ((len=finput.read(b1))!=-1){
             //每次读取后,把数组变成字符串打印(也可以写入到指定文件里)
             System.out.println(new String(b1,0,len));
             fos.write(b1);//写出数据
         }
         //关闭资源
         finput.close();
         fos.close();
     } catch (FileNotFoundException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }
    

    }
    }
    图片复制
    思路:

图片复制挺简单的,核心思想就是一读一写。

利用FileInputStream类里的read()方法读取本地指定的文件内容,

这里读取的是图片(也可以是其它的文件)。

然后把读取的数据流,使用FileOutputStream类里的write()方法输出到指定的硬盘位置。

package com.itheima.demo01.OutputStream;

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

/*

  • 练习:图片复制

  • */
    public class CopyImage {
    public static void main(String[] args) throws IOException {
    //开始时间
    long s=System.currentTimeMillis();
    //1创建流对象
    //指定数据源
    FileInputStream fis=new FileInputStream("F:\虚拟机共享文件\Stream\timg.jfif");
    //指定目的地
    FileOutputStream fos=new FileOutputStream("F:\虚拟机共享文件\Stream\image\ksh.jpg");
    //2读写数据
    //定义有效数据标记
    int len;
    //定义字节数组,用于封装字节和数据暂存。
    byte[] b=new byte[1024];
    //读取数据
    while ((len=fis.read(b))!=-1){
    //写出数据
    fos.write(b,0,len);
    }

      //3释放资源
      fos.close();
      fis.close();
      long e=System.currentTimeMillis();
      System.out.println("复制用时"+(e-s)+"毫秒");
    

    }
    }

posted @ 2021-01-04 10:18  康世行  阅读(50)  评论(0编辑  收藏  举报