22.文件读写:字节流

1.什么是字节流

字节流最大的特点是,每次调用read或write读入或写出的数据是以字节为单位的,而有的字符需要两个字节去存储,所以字节流读取数据会发生读到的数据不准确的情况。

1.1 字节数组流

输入输出流的源 和 目的地除了可以是“文件”(硬盘)外,还可以是计算机内存,我们也可以使用数组流来将数据输入输出到内存。

1.1.1 字节数组输入流

ByteArrayInputStream是输入流InuptStream的一种实现,它的源只能是字节数组byte[],它支持mark。

1.1.1.1 构造方法

ByteArrayInputStream(byte[] buf);
此构造方法的字节数组流的源是参数buf指定的数组的全部字节单元。
ByteArrayInputStream(byte[] buf ,int offset,int length);
此方法构造的字节数组流的源是buf指定的数组从offset处按顺序取length个字节单元。

1.1.1.2 常用方法

public int read();
该方法可以顺序地从源中读取一个字节,返回读出的字节值。
public int read(byte[] b,int off,int len);
该方法可以顺序地从源中读出参数len指定的字节数,并将读出的字节存放在参数b指定的数组中,参数off指定数组b读出字节的起始位置,返回实际读出的字节个数,若未读出字节read方法返回-1.

示例:

public static void readStudy(){
    //定义字节数组输入流的源
    byte[] bytes = "我是四郎".getBytes(StandardCharsets.UTF_8);
    //根据源创建字节数组输入流
    ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
    //读取源bytes中的数据
    int n;
    while ((n=inputStream.read())!=-1){
        System.out.print((char)n);
    }
}

在这里插入图片描述

1.1.2 字节数组输出流

ByteArrayOutputStream是输出流的一种实现,它的目的地只能是字节数组byte[],它支持mark。

1.1.2.1 构造方法

ByteArrayOutputStream();
该方法构造的字节数组输出空间指向一个默认大小为32字节的缓冲区,若输出流向缓冲区写入的字节个数大于缓冲区时,缓冲区的容量会自动增加。
ByteArrayOutputStream(int size);
此方法构造的字节数组输出流指向的缓冲区的初始大小由参数size指定,若输出流向缓冲区写入的字节个数大于缓冲区时,缓冲区的容量会自动的增加。

1.1.2.2 常用方法

public void write(int b);
字节数组输出流可调用该方法顺序地向缓冲区写入一个字节。
public void write(byte[] b, int off, int len);
该方法可以将参数b中指定的len个字节顺序地写入缓冲区,参数off指定从b中写出的字节的起始位置。
public byte[] toByteArray();
该方法可以返回输出流写入到缓冲区的全部字节,通过它我们可以获取写出的数据。

示例:

public static void toByteArrayStudy() throws IOException {
    byte[] result;
    byte[] bytes = "我是四郎".getBytes(StandardCharsets.UTF_8);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    outputStream.write(bytes);
    result = outputStream.toByteArray();
    for (byte a:bytes){
        System.out.print(a);
    }
    System.out.println();
    for (byte b:result){
        System.out.print(b);
    }
}

在这里插入图片描述

1.2 字节数据流

数据流能让我们读取或写出指定类型的数据,它是字节流的一种增强。

1.2.1数据输入流

由DataInputStream类创建的对象称为数据输入流。
它们允许程序按着机器无关的风格读取java原始数据,也就是说,当读取一个数值时,不必再关心这个数值应当是多少字节。它算是对其他字节输入流的一种增强,但是也有一定的局限,比如用它读取readChar只能读取编码为UTF-16的文件,读取其他文件将会乱码。

1.2.1.1 构造方法

DataInputStream(InputStream in);
此构造方法创建的数据输入流指向一个由参数in指定的底层输入流。

1.2.1.2 常用方法

close();关闭流。
readBoolean();读取一个布尔值。
readByte();读取一个字节。
readChar();读取一个字符。
readDouble();读取一个双精度浮点值。
readFloat();读取一个单精度浮点值。
readInt();读取一个整型值。
readLong();读取一个长整型值。
readShort();读取一个短整型值。
readUnsignedByte();读取一个无符号字节。
readUnsignedShort();读取一个无符号短整型值。
readUTF();读取一个UTF字符串。

实例

public static void main(String[] args) throws IOException {
    DataInputStream inputStream = new DataInputStream(
            new FileInputStream("麻子.txt"));
    StringBuilder builder = new StringBuilder();
    while(true){
        try{
           builder.append(new Character(inputStream.readChar()));
        }catch (Exception e){
            inputStream.close();
            break;
        }
    }
    System.out.println(builder.toString());
}

在这里插入图片描述

1.2.2 数据输出流

用法和输入流大同小异,它是字节输出流的一种增强。

1.2.2.1 关键方法

writeDouble(double v)
writeInt(int v)
writeUTF(String v)等。

实例:

public static void main(String[] args) throws IOException {
    DataOutputStream outputStream = new DataOutputStream
            (new FileOutputStream("四郎.txt"));
    String str = "我是四郎,我爱死麻子了!!";
    outputStream.writeUTF(str);
}

在这里插入图片描述

1.3 字节对象流

用ObjectInputStream和ObjectOutputStream类创建的对象称为对象输入(出)流。
对象输入(出)流可以将一个对象写入到一个文件中(或从文件读取一个对象到内存中)。
这个对象IO流比较常用,它可以将对象状态保存到磁盘中或通过网络发送出去,接收方只需要用相同的机制在需要的时候重新加载,相当于深拷贝了。

1.3.1 对象输入流

ObjectInputStream(InputStream in);
此方法是对象输入流的构造方法。
readObject();
此方法读取一个对象到程序中。

1.3.2 对象输出流

ObjectOutputStream(OutputStream out);
此方法是对象输出流的构造方法。
writeObject(object obj);
此方法可以将obj写入一个文件中。

实例:
首先使用对象输出流将对象写入磁盘中:

public static void main(String[] args) throws IOException {
    ObjectOutputStream outputStream = new ObjectOutputStream
    (new FileOutputStream("四郎"));
    List<String> a = new ArrayList<>();
    a.add("我是四郎,我爱死麻子了");
    outputStream.writeObject(a);
}

在这里插入图片描述

然后使用对象输入流重新加载:

public static void main(String[] args) throws IOException, ClassNotFoundException {
    ObjectInputStream inputStream = new ObjectInputStream
    (new FileInputStream("四郎"));
    List<String> a  = (List<String>) inputStream.readObject();
    System.out.println(a);
}

在这里插入图片描述

1.3 随机IO流

在java中,我们也可以建立一个流,通过该流既能读文件,也能写文件。
那就是RandomAccessFile类创建的随机流。
RandomAccessFile类创建的流的指向既可以作为流的源,也可以作为流的目的地。
随机IO流读取字符是以字节为单位的。

1.3.1 使用方法

1.3.1.1 构造方法

RandomAccessFile(String name,String mode);
RandomAccessFile(File file ,String mode);
参数name用来确定一个文件名,给出创建的流的源(也是目的地)。参数mode取r(只读)或rw(可读写),决定创建流对文件的访问权利。

注意:随机流指向文件,不刷新文件。

1.3.1.2 常用方法

close();关闭文件。
getFilePointer();获取当前读写的位置。
length();获取文件的长度。
read();从文件中读取一个字节的数据。
readBoolean();从文件中读取一个布尔值,0代表false,其他代表true。
readByte();从文件中读取一个字节。
readChar();从文件中读取一个字符。(两个字节)
readDouble(); 从文件读取一个双精度浮点值(8个字节)
readFloat(); 从文件读取一个单精度浮点值(4个字节)
readFully(byte b[]); 读b.length字节放入数组b,完全填满该数组
readInt();从文件中读取一个int值(4个字节)
readLine();从文件中读取一个文本行
readLong();从文件中读取一个长整型值(8个字节)
readShort();从文件中读取一个短型值(2个字节)
readUnsignedByte();从文件读取一个无符号字节(1个字节)
readUnsignedShort();从文件读取一个无符号短型值(2个字节)
readUTF();从文件中读取一个UTF字符串
seek(long position);定位读写位置
setLength(long newlength);设置文件的长度。
skipBytes(int n);在文件中跳过给定数量的字节。
write(byte b[]);写b.length个字节到文件
writeBoolean(boolean v);把一个布尔值作为单字节值写入文件
writeByte(int v);向文件写入一个字节
writeByte(String s);向文件写入一个字符串
writeChar(char c);向文件写入一个字符
writeChars(String s);向文件写入一个作为字符数据的字符串
writeDouble(double v);向文件写入一个双精度浮点值
writeFloat(float v);向文件写入一个单精度浮点值
writeInt(int v);向文件写入一个int值
writeLong(long v);向文件写入一个长整型值
writeShort(int v);向文件写入一个短整型值
writeUTF(String s);向文件写入一个UTF字符串

1.3.1.3 使用实例
public class RandomAccessFileStudy {

    public static void main(String[] args) throws IOException {
        RandomAccessFile randomAccessFile = new RandomAccessFile("麻子.txt","rw");
        while (true){
               String s = randomAccessFile.readLine();
               if(s==null) break;
               System.out.println(s);
        }
        randomAccessFile.write("\n你好,我是四郎".getBytes(StandardCharsets.UTF_8));
    }
}

在这里插入图片描述
在这里插入图片描述

代码地址:
Java基础学习/src/main/java/Progress/exa22 · 严家豆/Study - 码云 - 开源中国 (gitee.com)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员小牧之

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值