IO流

  • 数据传输是需要通道的,而IO流就是数据传输的通道。
  • IO流可以形象的比喻为运送货物的传输带。

IO流的分类

  • 根据操作的数据类型的不同可以分为 :字节流与字符流。
  • 根据数据的流向分为:输入流与输出流,程序(内存)作为参照物,

    • 程序从外部读取称为输入(Input),
    • 程序向外部写数据成为输出(Output)。

字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:

  • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
  • 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
  • 字节流:一次读入或读出是8位二进制。
  • 字符流:一次读入或读出是16位二进制。

设备上的数据无论是图片或者视频,文字,它们都以二进制存储的。二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节。意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。

字节输入流

  • InputStream 是所有的输入字节流的父类,它是一个抽象类。
  • ByteArrayInputStreamStringBufferInputStreamFileInputStream 是三种基本的介质流,它们分别从Byte 数组StringBuffer、和本地文件中读取数据。
  • PipedInputStream是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。
  • ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。

构造方法

构造方法

  FileInputStream(File)

  FileInputStream(String filename)

常用方法 

  read:读取一个字节,返回该字节的值,如果到达文件的末尾,则返回-1。需要注意:read()方法和迭代器一样,会自动下移的

  read(byte[ ])从输入流中读取至多一个数组长度的内容,到达文件末尾,则返回-1。

字节输入流的循环读取

在项目根目录新建一个123.txt,填入kenvie

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

public class demo {
    public static void main(String[] args) throws IOException{
        File file = new File("123.txt");
        FileInputStream fis = new FileInputStream(file);
        int result;
        while((result = fis.read())!= -1) {
            System.out.print(result+"\t");
        }
    }
}

运行结果:

打印的是kenvie每个字母对应的Ascii码

image.png

字符流的读取方法

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

public class demo {
    public static void main(String[] args) throws IOException{
        File file = new File("123.txt");
        FileInputStream fis = new FileInputStream(file);
        byte[] bt = new byte[1024];
        int num;
        while((num=fis.read(bt))!=-1) {
            String string = new String(bt,0,num);
            System.out.println(string);
        }
    }
}

运行结果:

image.png

字节输出流

  • OutputStream 是所有的输出字节流的父类,它是一个抽象类。
  • ByteArrayOutputStreamFileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。
  • PipedOutputStream 是向与其它线程共用的管道中写入数据。
  • ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。

构造方法

构造方法:

   FileOutputStream(File file) / FileOutputStream(String name)

  注意:如果父目录不存在,会报FileNotFoundException异常,如果父目录存在,会创建一个新的文件,如果此时已经有文件存在,会覆盖原文件

   FileOutputStream(File file,boolean flag)/ FileOutputStream(String name,boolean flag)

  注意:如果当前文件需要从文件末尾进行插入(接着文件里的内容继续写),必须将第二个参数设置为true,默认不写为false,会覆盖原文件

常用方法:

  write(int)向文件中写入一个字节的值

  write(byte[]) 向文件中写入一个数组的数据。

  write(byte[] offset len) 将 偏移量为 offset 的索引位置的长度为 len 的数据,写入到输出流中。

字节输出

1、会在项目根目录新建一个1234.txt文件,往文件中输入kenvie.com

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

public class demo {
    public static void main(String[] args) throws IOException {
        File file=new File("1234.txt");
        FileOutputStream fos=new FileOutputStream(file);

        fos.write("kenvie.com".getBytes());
    }
}

2、将1.txt的内容复制到2.txt

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

public class demo {
    public static void main(String[] args) throws IOException {
        File file = new File("1.txt");
        FileInputStream fis = new FileInputStream(file);
        FileOutputStream fos = new FileOutputStream(new File("2.txt"));
        byte[] bt = new byte[1024];
        int num;
        while((num = fis.read(bt))!=-1) {
            fos.write(bt,0,num);
        }
        fis.close();
        fos.close();
    }
}
最后修改:2021 年 08 月 09 日
如果觉得我的文章对你有用,请随意赞赏