03 Java BIO java.io流;InputStream 字节输入流;OutputStream 字节输出流;BufferedInputStream,BufferedOutputStream

java io 流

Java IO流是既可以从中读取,也可以写入到其中的数据流。流通常会与数据源、数据流向目的地相关联,比如文件、网络等等

流和数组不一样,不能通过索引读写数据。在流中,你也不能像数组那样前后移动读取数据,
除非使用RandomAccessFile 处理文件。流仅仅只是一个连续的数据流。

某些类似PushbackInputStream 流的实现允许你将数据重新推回到流中,以便重新读取。然而你只能把有限的数据推回流中,并且你不能像操作数组那样随意读取数据。
流中的数据只能够顺序访问。

Java IO流通常是基于字节或者基于字符的。

字节流通常以“stream”命名,比如InputStream和OutputStream。
除了DataInputStream 和DataOutputStream 还能够读写int, long, float和double类型的值以外,其他流在一个操作时间内只能读取或者写入一个原始字节。

字符流通常以“Reader”或者“Writer”命名。字符流能够读写字符(Unicode字符)。 Readers and Writers获取更多关于字符流输入输出的信息。

InputStream 字节输入流

java.io.InputStream类是所有Java IO输入流的基类

输入流中的read()方法读取数据。read()方法返回一个整数,代表了读取到的字节的内容(0 ~ 255)。当达到流末尾没有更多数据可以读取的时候,read()方法返回-1。

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

public class InputStreamTest {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("D:/Sunxy_workspace/readme.txt");

        int data = inputStream.read();
        while (data != -1){
            System.out.print((char)data);
            data=inputStream.read();
        }
        inputStream.close();
    }
}

输出

inputStream
Process finished with exit code 0

OutputStream 字节输出流

java.io.OutputStream是Java IO中所有输出流的基类.将内存中的字节数组输出到目标媒介中。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

public class OutStreamTest {
    public static void main(String[] args) throws IOException {
        OutputStream outputStream = new FileOutputStream("D:/Sunxy_workspace/readme.txt");
        outputStream.write("write Hello to readme.txt".getBytes(StandardCharsets.UTF_8));
        outputStream.close();
    }
}

OutputStream 构造函数 决定输出内容覆盖或者追加

输出内容 追加到readme.txt文本内容最后一行
OutputStream output = new FileOutputStream("D:/Sunxy_workspace/readme.txt", true); 

输出内容 覆盖原文本
OutputStream output = new FileOutputStream("D:/Sunxy_workspace/readme.txt", false); 

BufferedInputStream,BufferedOutputStream 字节缓冲流

InputStream,OutputStream 每次读取/写入一个字节是很慢的;

BufferedInputStream 字节缓冲区输入流,可以从磁盘中一次读取一大块数据,然后再从读到的数据块中获取字节。

BufferedOutputStream 字节缓冲区输出流,实现将大块数据批量地写入到磁盘(或者相应的流)中。

默认缓冲区大小8 * 1024B 即8KB

import java.io.*;
import java.nio.charset.StandardCharsets;

public class BufferedStream {
  public static void main(String[] args) throws IOException {
    // 字节缓冲区大小为 8KB   
    InputStream bis = new BufferedInputStream(new FileInputStream("D:/Sunxy_workspace/readme.txt"),8 * 1024);
    int data = bis.read();
    while (data != -1) {
      System.out.println((char) data);
      data = bis.read();
    }
    bis.close();

    OutputStream bos = new BufferedOutputStream(new FileOutputStream("D:/Sunxy_workspace/readme.txt"),8 * 1024);
    bos.write("我爱北京天安门".getBytes(StandardCharsets.UTF_8));
    bos.close();
  }
}

DataInputStream DataOutputStream

DataInputStream可以从输入流中读取Java基本类型数据,而不必每次读取字节数据。

把InputStream包装到DataInputStream中,可以从此输入流中读取基本类型数据

DataOutputStream可以往输出流中写入Java基本类型数据

import java.io.*;
import java.nio.charset.StandardCharsets;

public class DataStreamT {
  public static void main(String[] args) throws IOException {
    DataInputStream input = new DataInputStream(new FileInputStream("D:/Sunxy_workspace/readme.txt"));
    int read = input.read();
    char c = input.readChar();
    boolean b = input.readBoolean();
    float v = input.readFloat();
    double d = input.readDouble();
    input.close();

    DataOutputStream output = new DataOutputStream(new FileOutputStream("D:/Sunxy_workspace/readme.txt"));
    output.write("我不做大哥好多年".getBytes(StandardCharsets.UTF_8));
    output.writeBoolean(true);
    output.writeDouble(3.1415926);
    output.writeFloat(6.6f);
    output.writeChars("Type String");
    output.close();
  }
}

Java IO: 序列化Serializable与ObjectInputStream、ObjectOutputStream

类能够序列化和反序列化,必须实现Serializable接口

ObjectInputStream,ObjectOutputStream

ObjectInputStream能够让你从输入流中读取Java对象,而不需要每次读取一个字节.

ObjectOutputStream能够让你把对象写入到输出流中,而不需要每次写入一个字节

import java.io.*;

public class ObjectStreamT {


    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Person person = new Person();
        person.setAge("18");
        person.setName("小虎");

        ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("D:/Sunxy_workspace/object.txt"));
        output.writeObject(person);
        output.close();


        ObjectInputStream input = new ObjectInputStream(new FileInputStream("D:/Sunxy_workspace/object.txt"));
        Person p = (Person)input.readObject();
        System.out.println(p.getName());
    }
}


// 内部类
class Person implements Serializable {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EngineerForSoul

你的鼓励是我孜孜不倦的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值