Java基础_16 | Java中的输入输出系统(字节流、字符流)

1. Java中的I/O流(input/output)

流是在计算机的输入、输出操作中流动的数据序列,Java的输入输出是以流(stream)的方式进行处理的。

在Java中,流的分类主要按照流的数据单位分:

  • 字节流(Byte Streams): 用于向字节流读写8位二进制的字节,主要用于读写诸如图象或声音等的二进制数据
  • 字符流(Character Streams):字符流类用于向字符流读写16位二进制字符

Java 提供了专用于输入输出功能的包Java.io ,其中所有常用的类都是继承了以下四个基本抽象类

字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer

2. 字节流

输入流类 InputStream 和输出流 OutputStream 是两个最基本的输入输出抽象类,用于处理字节流,需要注意,这两个类都是抽象类,不能直接创建对象

InputStream(抽象类)

InputStream 子类对象继承InputStream 类的如下方法:

  • ① 创建流(构造方法)
FileInputStream(File file);	  
FileInputStream(FileDescriptor fdObj);
FileInputStream(String name);
  • ② 从流中读取一字节数据
public int read();	

每次执行时都从输入流的当前位置处读入一个字节的二进制数据,读数作为低字节,高字节配全零,合成为一个16位整型量返回,若输入流当前位置无数据返回 -1。

  • ③ 关闭流
close();

InputStream类的常用子类有:

  • FileInputStream:用于从文件File中将诸如图像数据之类的原始字节的数据流读出;
  • ByteArrayInputStream:此类实现了一个输出流,从一个 byte 数组中读出数据;
  • ObjectInputStream:实现对象的持久存储,从 OutputStream读入Java 对象的基本数据类型和图形;

OutputStream(抽象类)

OutputStream子类对象继承OutputStream类的如下方法:

  • ① 创建流(构造函数)
FileOutputStream(File file);	  
FileOutputStream(FileDescriptor fdObj);
FileOutputStream(String name);
  • ② 向流中写入一字节数据
public void write(int c);	//将参数c对应的字符写入输出流
public void write(char array[]);	//将字符数组array中全部字符顺序写入到输出流

每次执行时都从输入流的当前位置处读入一个字节的二进制数据,读数作为低字节,高字节配全零,合成为一个16位整型量返回,若输入流当前位置无数据返回 -1。

  • ③ 关闭流
close();

OutputStream类的常用子类有:

  • FileOutputStream:用于将诸如图像数据之类的原始字节的数据流写入 File;
  • ByteArrayOutputStream:此类实现了一个输出流,数据被写入一个 byte 数组;
  • ObjectOutputStream:实现对象的持久存储,将 Java 对象的基本数据类型和图形写入 OutputStream;
  • PipedOutputStream:将管道输出流连接到管道输入流来创建通信管道;

示例代码

import java.io.*;

public class FileCopyTest {
    public static void main(String[] args) {
        try {
            //创建数据流
            FileInputStream fin = new FileInputStream("E://Logo.jpg");
            FileOutputStream fout = new FileOutputStream("E://Logo_copy.jpg");

            //读取/写入数据流
            int temp = 0;
            while((temp = fin.read()) != -1) {
                fout.write(temp);
            }

            //关闭流
            fin.close();
            fout.close();
        }
        catch (FileNotFoundException e) {
            System.out.println("文件未找到,请检查是否存在!");
        }
        catch (SecurityException e) {
            System.out.println("文件不能正常打开,请检查是否有安全保护!");
        }
        catch (IOException e) {
            System.out.println("发生读写异常!");
        }
        finally {
            System.out.println("finish!");
        }
    }
}

执行效果如下:

3. 字符流

输入流类 Reader和输出流 Writer是两个最基本的输入输出抽象类,用于处理字符流,需要注意,这两个类都是抽象类,不能直接创建对象

Reader

Reader子类对象继承Reader类的如下方法:

  • ① 创建流(构造方法)
InputStreamReader(InputStream in) 
BufferedReader(Reader in);
FileReader(String fileName);
  • ② 从流中读取字符数据
int read(char[ ] b, int offset, int length)

每次执行时都从输入流的当前位置处读入一个字符并返回,若输入流当前位置无数据返回 -1。

  • ③ 关闭流
void close();

Reader类的常用子类有:

  • BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取,并且可以指定缓冲区的大小;
  • InputStreamReader:字节流通向字符流的桥梁:它使用指定的 charset 读取
    字节并将其解码为字符;
  • FileReader:用来读取字符文件的类;

Writer

Writer子类对象继承Writer类的如下方法:

  • ① 创建流(构造方法)
OutputStreamWriter(OutputStream out);
BufferedWriter(Writer out);
FileWriter(String fileName, boolean append);	//append表示是否附加写入的数据
  • ② 从流中写入字符数据
void write(char[] b, int offset, int length);
void flush();		 //强制清空缓冲区

每次执行时都从输入流的当前位置处写入字符数据。

  • ③ 关闭流
void close();

Writer类的常用子类有:

  • BufferedWriter:将文本写入字符输出流,缓冲各个字符,并且可以指定缓冲区的大小;
  • OutputStreamWriter:字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节;
  • FileWriter:用来写入字符文件的类;
  • PrintWriter:向文本输出流打印对象的格式化表示形式;

4. 基本流

Java中预先定义好3个流对象,分别表示标准输出设备、标准输入设备和标准错误设备。

分别是:

  • System.in :用于程序的输入,对应外设为键盘
  • System.out:用于一般输出,对应外设为屏幕
  • System.err: 用于显示出错信息,对应外设为屏幕

System 类的所有属性都是静态static的,调用时以类名System为前缀

接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』

发布了210 篇原创文章 · 获赞 565 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/Mculover666/article/details/104352824