文章目录

  • 概述
  • 流的划分
  • 文件流
  • 缓冲流
  • 转换流(字符编码和解码)
  • 序列化
  • 系统输入输出:Scanner、print


概述

  • 全称:inputoutputstream
  • 译名:输入输出流

流的划分

  • 内存为参照,根据数据的流向,可分为:
    输入流(input stream):把数据从其他设备读到内存中的流
    输出流(output stream):把数据从内存写到其他设备上的流
  • 按照数据的类型划分:
    字节流 :以字节为单位,读写数据的流
    字符流 :以字符为单位,读写数据的流
  • 功能划分
    节点流,例如:文件流…
    处理流,例如:缓冲流、转换流…

Java的4个IO抽象基类

输入流

输出流

字节流

InputStream

OutputStream

字符流

Reader

Writer

文件流

文件流

Java类

文件字节输入流

FileInputStream

文件字节输出流

FileOutputStream

文件字符输入流

FileReader

文件字符输出流

FileWriter

python的stream参数 python inputstream_System

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

public class Hello {
    public static void main(String[] args) throws IOException {
        File f = new File("a.txt");

        // 输出流:写数据到文件
        FileOutputStream fO = new FileOutputStream(f);
        // fO.write("abc".getBytes());
        byte[] b = {'a', 'b', 'c'};
        fO.write(b);
        // 关闭资源
        fO.close();

        // 输入流:从文件读数据
        FileInputStream fI = new FileInputStream(f);
        // 循环逐个地读取
        int i;
        while ((i = fI.read()) != -1) {
            System.out.print((char) i);
        }
        // 关闭资源
        fI.close();
    }
}

上面的Java代码≈下面这个Python代码

# 输出
with open('a.txt', 'wb')as fw:
    fw.write(b'abc')
# 输入
with open('a.txt', 'rb')as fr:
    first = fr.read(1)
    while first:
        print(first.decode(), end='')
        first = fr.read(1)

缓冲流

缓冲流

Java类

缓冲字节输入流

BufferedInputStream

缓冲字节输出流

BufferedOutputStream

缓冲字符输入流

BufferedReader

缓冲字符输出流

BufferedWriter

python的stream参数 python inputstream_java_02

import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;

public class Hello {
    public static void main(String[] args) throws IOException {
        // 文件字符输出流
        FileWriter fW = new FileWriter("a.txt");
        // 缓冲字符输出流
        BufferedWriter bW = new BufferedWriter(fW);
        // 按行写数据
        bW.write("落水无花");
        bW.newLine();
        bW.write("落翔无痕");
        // 关闭资源
        bW.close();
        fW.close();

        // 文件字符输入流
        FileReader fR = new FileReader("a.txt");
        // 缓冲字符输入流
        BufferedReader bR = new BufferedReader(fR);
        // 按行读数据
        String line;
        while ((line = bR.readLine()) != null) {
            System.out.println(line);
        }
        // 关闭资源
        bR.close();
        fR.close();
    }
}

上面的Java代码≈下面这个Python代码

# 输出
with open('a.txt', 'w', encoding='utf-8')as fw:
    fw.write('落水无花')
    fw.write('\n')
    fw.write('落翔无痕')
# 输入
with open('a.txt', 'r', encoding='utf-8')as fr:
    for line in fr.read().split('\n'):
        print(line)

转换流(字符编码和解码)

python的stream参数 python inputstream_输出流_03

import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class Hello {
    public static void main(String[] args) throws IOException {
        // 文件字节输出流
        FileOutputStream fOS = new FileOutputStream("a.txt");
        // 转换输出流,设定编码
        OutputStreamWriter oSW = new OutputStreamWriter(fOS, StandardCharsets.UTF_8);
        // 写数据
        oSW.write("落水无花\n拉");
        oSW.write("屎无痕");
        // 关闭资源
        oSW.close();
        fOS.close();

        // 文件字节输入流
        FileInputStream fIS = new FileInputStream("a.txt");
        // 转换输入流
        InputStreamReader bSR = new InputStreamReader(fIS, StandardCharsets.UTF_8);
        // 读数据
        int read;
        while ((read = bSR.read()) != -1) {
            System.out.print((char) read);
        }
        // 关闭资源
        bSR.close();
        fIS.close();
    }
}

对比Python的编码方式

s = 'si落无花'
se = s.encode('utf-8')
print(se)  # b'si\xe8\x90\xbd\xe6\x97\xa0\xe8\x8a\xb1'
sd = se.decode('utf-8')
print(sd)  # si落无花

序列化

  • 序列化:将对象的状态信息转换为可存储或传输的形式的过程
  • 跨进程通信时,需要序列化
import java.io.*;

class Student implements Serializable {
    @Override
    public String toString() {
        return "学生";
    }
}

public class Hello {
    public static void main(String[] args) {
        // 创建可序列化对象
        Student s0 = new Student();
        // 文件
        File f = new File("xjj");
        // 写对象
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream((f)));
            oos.writeObject(s0);
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 读对象
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
            Student s1 = (Student) ois.readObject();
            System.out.println(s1);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

系统输入输出:Scanner、print

一个简单的文本扫描器,可以使用正则表达式解析基本类型和字符串

python的stream参数 python inputstream_java_04

import java.util.Scanner;

public class Hello {
    public static void main(String[] args) {
        // 创建扫描器
        Scanner input = new Scanner(System.in);
        // 获取字符串
        System.out.print("请输入一个字符串:");
        String string = input.nextLine();
        System.out.println(string);
        // 获取整数
        System.out.print("请输入一个整数:");
        Integer integer = input.nextInt();
        System.out.println(integer);
    }
}
效果

python的stream参数 python inputstream_java_05