Java中字节流的相关内容

字节流(Byte Streams):用于读写二进制数据,以字节为单位

1.1 InputStream 和 OutputStream

InputStream和OutputStream是Java中最基本的字节流,它们分别是所有字节输入流和字节输出流的基类。

1.InputStream:

  • 从输入流中读取一个字节:int read() throws IOException
  • 从输入流中读取字节数组:int read(byte[] b) throws IOException
  • 从输入流中读取指定长度的字节数组:int read(byte[] b, int off, int len) throws IOException
  • 跳过指定的字节数:long skip(long n) throws IOException
  • 返回输入流中可读取的字节数:int available() throws IOException
  • 关闭输入流:void close() throws IOException

2.outputStream:

  • 将一个字节写入输出流:void write(int b) throws IOException
  • 将字节数组写入输出流:void write(byte[] b) throws IOException
  • 将指定长度的字节数组写入输出流:void write(byte[] b, int off, int len) throws IOException
  • 刷新输出流:void flush() throws IOException
  • 关闭输出流:void close() throws IOException

1.2 FileInputStream 和 FileOutputStream:用于读写文件的字节流。

FileInputStream:用于读取文件的字节数据,其构造函数可以接受一个File对象或者一个字符串作为参数,表示要读取的文件路径。
File file = new File("test.txt");
InputStream inputStream = new FileInputStream(file);

FileOutputStream用于写入文件的字节数据,其构造函数可以接受一个File对象或者一个字符串作为参数,表示要写入的文件路径。
File file = new File("test.txt");
OutputStream outputStream = new FileOutputStream(file);

读取文件:
FileInputStreamread()方法可以从文件中读取一个字节,返回值为读取到的字节,如果已经读取到文件的末尾则返回-1File file = new File("test.txt");
InputStream inputStream = new FileInputStream(file);
int data = inputStream.read(); // 读取一个字节

FileInputStreamread(byte[] b)方法可以从文件中读取指定长度的字节数组,返回值为实际读取的字节数,如果已经读取到文件的末尾则返回-1File file = new File("test.txt");
InputStream inputStream = new FileInputStream(file);
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer); // 读取字节数组

FileInputStreamread(byte[] b, int off, int len)方法可以从文件中读取指定长度的字节数组,返回值为实际读取的字节数,如果已经读取到文件的末尾则返回-1File file = new File("test.txt");
InputStream inputStream = new FileInputStream(file);
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer, 0, 1024); // 读取1024个字节到字节数组中

写入文件:
FileOutputStreamwrite(int b)方法可以向文件中写入一个字节。

File file = new File("test.txt");
OutputStream outputStream = new FileOutputStream(file);
outputStream.write(65); // 写入一个字节

FileOutputStreamwrite(byte[] b)方法可以向文件中写入字节数组。

File file = new File("test.txt");
OutputStream outputStream = new FileOutputStream(file);
byte[] buffer = "hello world".getBytes();
outputStream.write(buffer); // 写入字节数组

FileOutputStreamwrite(byte[] b, int off, int len)方法可以向文件中写入指定长度的字节数组。

File file = new File("test.txt");
OutputStream outputStream = new FileOutputStream(file);
byte[] buffer = "hello world".getBytes();
outputStream.write(buffer, 0, 5); // 写入前5个字节

关闭流:
FileInputStreamFileOutputStreamclose()方法可以关闭输入流和输出流,释放相关的资源。

File file = new File("test.txt");
InputStream inputStream = new FileInputStream(file);
inputStream.close();


File file = new File("test.txt");
OutputStream outputStream = new FileOutputStream(file);
outputStream.close();

1.3 ByteArrayInputStream 和 ByteArrayOutputStream:

用于读写内存中的字节数据的流。

ByteArrayInputStream用于在内存中读取字节数组,其构造函数可以接受一个byte数组作为参数,表示要读取的字节数组。
byte[] buffer = "hello world".getBytes();
InputStream inputStream = new ByteArrayInputStream(buffer);

使用ByteArrayInputStreamread()方法可以从字节数组中读取一个字节,返回值为读取到的字节,如果已经读取到数组的末尾则返回-1byte[] buffer = "hello world".getBytes();
InputStream inputStream = new ByteArrayInputStream(buffer);
int data = inputStream.read(); // 读取一个字节

使用ByteArrayInputStreamread(byte[] b)方法可以从字节数组中读取指定长度的字节数组,返回值为实际读取的字节数,如果已经读取到数组的末尾则返回-1byte[] buffer = "hello world".getBytes();
InputStream inputStream = new ByteArrayInputStream(buffer);
byte[] data = new byte[1024];
int length = inputStream.read(data); // 读取字节数组

使用ByteArrayInputStreamread(byte[] b, int off, int len)方法可以从字节数组中读取指定长度的字节数组,返回值为实际读取的字节数,如果已经读取到数组的末尾则返回-1byte[] buffer = "hello world".getBytes();
InputStream inputStream = new ByteArrayInputStream(buffer);
byte[] data = new byte[1024];
int length = inputStream.read(data, 0, 1024); // 读取1024个字节到字节数组中
  
ByteArrayOutputStream用于在内存中写入字节数组,其构造函数不需要参数。
OutputStream outputStream = new ByteArrayOutputStream();

使用ByteArrayOutputStreamwrite(int b)方法可以向字节数组中写入一个字节。
OutputStream outputStream = new ByteArrayOutputStream();
outputStream.write(65); // 写入一个字节

使用ByteArrayOutputStreamwrite(byte[] b)方法可以向字节数组中写入字节数组。
OutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = "hello world".getBytes();
outputStream.write(buffer); // 写入字节数组

使用ByteArrayOutputStreamwrite(byte[] b, int off, int len)方法可以向字节数组中写入指定长度的字节数组。
OutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = "hello world".getBytes();
outputStream.write(buffer, 0, 5); // 写入前5个字节

使用ByteArrayOutputStreamtoByteArray()方法可以获取当前字节数组的值。
OutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = "hello world".getBytes();
outputStream.write(buffer, 0, 5);
byte[] data = ((ByteArrayOutputStream) outputStream).toByteArray(); // 获取当前字节数组的值

使用ByteArrayOutputStreamreset()方法可以重置字节数组。
OutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = "hello world".getBytes();
outputStream.write(buffer, 0, 5);
((ByteArrayOutputStream) outputStream).reset(); // 重置字节数组

1.4 DataInputStream 和 DataOutputStream:用于读写基本数据类型的字节流。

DataInputStream继承自FilterInputStream,可以从任何一个输入流中读取基本类型数据和字符串,其构造函数需要一个InputStream对象作为参数。
InputStream inputStream = new FileInputStream("data.txt");
DataInputStream dataInputStream = new DataInputStream(inputStream);

使用DataInputStreamreadBoolean()方法可以从输入流中读取一个布尔值,返回值为读取到的布尔值。
boolean value = dataInputStream.readBoolean();

使用DataInputStreamreadByte()方法可以从输入流中读取一个字节,返回值为读取到的字节。
byte value = dataInputStream.readByte();

使用DataInputStreamreadShort()方法可以从输入流中读取一个短整型数据,返回值为读取到的短整型数据。
short value = dataInputStream.readShort();

使用DataInputStreamreadInt()方法可以从输入流中读取一个整型数据,返回值为读取到的整型数据。
int value = dataInputStream.readInt();

使用DataInputStreamreadLong()方法可以从输入流中读取一个长整型数据,返回值为读取到的长整型数据。
long value = dataInputStream.readLong();

使用DataInputStreamreadFloat()方法可以从输入流中读取一个单精度浮点数,返回值为读取到的单精度浮点数。
float value = dataInputStream.readFloat();

使用DataInputStreamreadDouble()方法可以从输入流中读取一个双精度浮点数,返回值为读取到的双精度浮点数。
double value = dataInputStream.readDouble();

使用DataInputStreamreadChar()方法可以从输入流中读取一个字符,返回值为读取到的字符。
char value = dataInputStream.readChar();

使用DataInputStreamreadUTF()方法可以从输入流中读取一个UTF-8编码的字符串,返回值为读取到的字符串
String value = dataInputStream.readUTF();


DataOutputStream继承自FilterOutputStream,可以向任何一个输出流中写入基本类型数据和字符串,其构造函数需要一个OutputStream对象作为参数。
OutputStream outputStream = new FileOutputStream("data.txt");
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);

使用DataOutputStreamwriteBoolean(boolean v)方法可以向输出流中写入一个布尔值。
boolean value = true;
dataOutputStream.writeBoolean(value);

使用DataOutputStreamwriteByte(int v)方法可以向输出流中写入一个字节。
byte value = 100;
dataOutputStream.writeByte(value);

使用DataOutputStreamwriteShort(int v)方法可以向输出流中写入一个短整型数据。
short value = 1000;
dataOutputStream.writeShort(value);

使用DataOutputStreamwriteInt(int v)方法可以向输出流中写入一个整型数据。
int value = 100000;
dataOutputStream.writeInt(value);
使用DataOutputStreamwriteLong(long v)方法可以向输出流中写入一个长整型数据

1.5 BufferedInputStream 和 BufferedOutputStream:提供了缓冲功能的字节流。

BufferedInputStream继承自FilterInputStream,可以从任何一个输入流中读取字节数据,并提供了缓存读取功能,其构造函数需要一个InputStream对象作为参数。
InputStream inputStream = new FileInputStream("data.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

使用BufferedInputStreamread()方法可以从输入流中读取一个字节,返回值为读取到的字节,如果读取到文件末尾返回-1int value = bufferedInputStream.read();

使用BufferedInputStreamread(byte[] b)方法可以从输入流中读取指定长度的字节数据并存储到一个字节数组中,返回值为读取到的字节数,如果读取到文件末尾返回-1byte[] buffer = new byte[1024];
int length = bufferedInputStream.read(buffer);

BufferedOutputStream
BufferedOutputStream继承自FilterOutputStream,可以向任何一个输出流中写入字节数据,并提供了缓存写入功能,其构造函数需要一个OutputStream对象作为参数。

OutputStream outputStream = new FileOutputStream("data.txt");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);

使用BufferedOutputStreamwrite(int b)方法可以向输出流中写入一个字节。
byte value = 100;
bufferedOutputStream.write(value);

使用BufferedOutputStreamwrite(byte[] b)方法可以向输出流中写入一个字节数组。
byte[] buffer = new byte[]{1,2,3,4,5};
bufferedOutputStream.write(buffer);

使用BufferedOutputStreamflush()方法可以将缓存中的数据立即写入输出流中,可以确保数据被及时写入。
bufferedOutputStream.flush();

1.6 ObjectInputStream 和 ObjectOutputStream:用于读写 Java 对象的字节流。

ObjectInputStreamObjectOutputStreamJava中用于读写对象的高级流,可以将对象序列化为字节序列并写入输出流中,也可以从输入流中读取字节序列并反序列化为对象。这两个流通常用于在不同的Java应用程序之间传输对象或将对象保存到文件中。

以下是一个简单的示例,演示如何使用ObjectOutputStream将对象序列化并写入文件中,然后使用ObjectInputStream从文件中读取字节序列并反序列化为对象。


import java.io.*;

public class ObjectStreamExample {
    public static void main(String[] args) {
        // 创建一个Person对象
        Person person = new Person("Tom", 20);

        // 将对象写入文件中
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            oos.writeObject(person);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 从文件中读取对象
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
            Person newPerson = (Person) ois.readObject();
            System.out.println(newPerson);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

// 定义一个可序列化的Person类
class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
在这个示例中,我们创建了一个可序列化的Person类,然后创建了一个Person对象,并使用ObjectOutputStream将它写入到一个名为"person.ser"的文件中。接着,我们使用ObjectInputStream从文件中读取字节序列,并将其反序列化为一个新的Person对象。最后,我们打印出新的Person对象。

【注意】序列化是指将一个Java对象转换成字节序列的过程,以便将其存储到文件、数据库或网络中,或在不同的Java应用程序之间传输。序列化可以理解为一种将对象持久化的方式,将一个对象的状态转换为字节流的形式,可以将其保存到磁盘或通过网络传输到远程系统。

在Java中,要将一个对象序列化,需要让该对象所属的类实现java.io.Serializable接口,该接口没有任何方法,只是一个标记接口,表明实现该接口的类可以被序列化。当对象被序列化时,Java会将对象的状态(也就是它的属性)转换成一连串字节,可以使用ObjectOutputStream将字节序列写入到文件、数据库或网络中。

反序列化是指将字节序列转换成Java对象的过程,以便重新创建对象。当接收到字节序列时,可以使用ObjectInputStream从文件、数据库或网络中读取字节序列,并将其反序列化为Java对象。在反序列化的过程中,Java会根据字节流中的信息,重新构造出原来的对象,并将其状态还原到对象中,从而重新获得该对象的实例。

需要注意的是,在序列化和反序列化的过程中,需要保证对象的属性是可序列化的,也就是说,它们必须是基本数据类型、字符串或实现了java.io.Serializable接口的对象。如果某个对象包含一个不可序列化的属性,则序列化该对象时会抛出java.io.NotSerializableException异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/5573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【linux】基于阻塞队列的生产者消费者模型(条件变量)

文章目录一、引入二、生产者消费者模型2.1 三者关系2.2 生产者消费者模型基本原则2.3 生产者消费者模型的好处三、基于阻塞队列的生产者消费者模型3.1 原理3.2 代码实现3.3 pthread_cond_wait的第二个参数3.4 pthread_cond_wait伪唤醒四、总结一、引入 举个例子,比…

基于springboot实现结合疫情情况的婚恋系统演示【附项目源码】

基于springboot实现结合疫情情况的婚恋系统演示B/S的系统是通过能上网的电脑就可以使用,它最大的优点是不需要安装专门的软件,首先浏览器向服务器发出请求,然后服务器处理请求把信息再返回给浏览器。不需要再次对数据进行存取与计算数据&…

php mysql网络考试系统dzkf8994

2.管理员 系统管理员登陆系统后主要进行四类操作: (1)考题维护,考试信息维护,用户维护和个人信息维护管理员可以往题中添加考题,修改错误试题和删除无用试题,考题维护包括单选题管理(单选题添加…

DFS+记忆化剪枝--[NOIP2017 普及组] 棋盘

[NOIP2017 普及组] 棋盘 题目背景 NOIP2017 普及组 T3 题目描述 有一个mmm \times mmm的棋盘,棋盘上每一个格子可能是红色、黄色或没有任何颜色的。你现在要从棋盘的最左上角走到棋盘的最右下角。 任何一个时刻,你所站在的位置必须是有颜色的&#…

启动Hadoop报错【Error: JAVA_HOME is not set and could not be found.】

当用了一下午从0安装上Hadoop兴奋的启动的时候! Error: JAVA_HOME is not set and could not be found. 他告诉我JAVA_HOME 没被找到? 我明明安装了java的,为什么找不到? java -version看了下发现是没问题的 解决: 后…

JUnit5用户手册~并行执行

两种运行模式 SAME_THREAD:默认的,测试方法在同一个线程CONCURRENT:并行执行,除非有资源锁junit-platform.properties配置参数配置所有测试方法都并行 junit.jupiter.execution.parallel.enabled true junit.jupiter.execution.…

全栈声明式可观测:KubeVela 开箱即用且灵活定制的云原生应用洞察

作者介绍:殷达,KubeVela Maintainer,阿里云高级工程师,深度参与了 KubeVela 混合云多集群管理、可扩展工作流、可观测等核心能力体系的建设 KubeVela [ 1] 是一个开箱即用的现代化应用交付与管理平台,它通过统一的应用…

蓝桥杯嵌入式--实战模拟题

前言在蓝桥杯省赛举办之前,学校组织了一场模拟赛,基于第十三届的省赛题,但是难度略高于省赛,这篇博客记录一下解题的过程,其思路可供大家参考。详细工程目前先联系我获取。题目详情实现思路分析花个十几分钟把题目好好…

《花雕学AI》05:令人惊奇的ChatGPT,一个能够与人类对话的人工智能

今天是周末,4月2日,早上五点就起床了,没有去打羽毛球。 我平时在手机上喜欢看今日头条,了解各种时事新闻,发现今年来频繁出现的单词就是:ChatGPT,通过简单搜索,我逐步接受了这个概念…

[Java] synchronized的锁优化机制

目录 一 . 锁膨胀(锁升级) 二 . 锁消除 三 . 锁粗化 附加 : Callable 接口 ReentrantLock ReentrantLock 与 synchronized 的区别 Semaphore (信号量) CountDownLatch 多线程下使用哈希表 1. HashTable 2 .ConcurrentHashMap ConcurrentHashMap 优点 CopyOnWri…

Java 8 - Lambda 表达式

1. 函数式接口 当一个接口中只有一个非 default 修饰的方法,这个接口就是一个函数式接口用 FunctionalInterface 标注 1)只有一个抽象方法 FunctionalInterface public interface MyInterface {void print(int x); } 2)只有一个抽象方法和…

【gitlab部署】centos8安装gitlab(搭建属于自己的代码服务器)

这里写目录标题部署篇序言要求检查系统是否安装OpenSSH防火墙问题准备gitlab.rb 配置坑点一忘记root密码重置使用篇gitlab转换成中文git关闭注册入口创建用户部署篇 序言 在团队开发过程中,想要拥有高效的开发效率,选择一个好的代码开发工具是必不可少的…

我的天哪, 什么是SOA架构

SOA架构是一种面向服务的架构,主要由服务、服务注册表、服务总线和服务编排器等组成。 下面是一个简单的SOA架构图示,用于说明SOA架构的基本组件和交互方式: ----------------------- ----------------------- |…

【Linux】进程控制(创建、终止、等待)

环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux】进程理解与学习Ⅰ-进程概念 【Linux】进程理解与学习Ⅱ-进程状态 【Linux】进程理解与学…

网络编程socket(下)

目录 一、TCP网络程序 1.1 服务端初始化 1.1.1 创建套接字 1.1.2 服务端绑定 1.1.3 服务端监听 1.2 服务端启动 1.2.1 服务端获取连接 1.2.2 服务端处理请求 1.3 客户端初始化 1.4 客户端启动 1.4.1 发起连接 1.4.2 发起请求 1.5 网络测试 1.6 单执行流服务端的…

非科班应届生培训Java能就业吗?

想要学习Java开发的同学们,不要再太过纠结非科班可以学Java吗?学历低能学Java开发吗?Java开发怎么才能学得好?没有计算机基础能学习Java开发吗?这些问题了。想的再多都不如行动,大胆努力认真踏实地学习就好。谁不是一步步来的呢…

GPT-4老板:AI可能会杀死人类,已经出现我们无法解释的推理能力

来源: 量子位 微信号:QbitAI “AI确实可能杀死人类。” 这话并非危言耸听,而是OpenAI CEO奥特曼的最新观点。 而这番观点,是奥特曼在与MIT研究科学家Lex Fridman长达2小时的对话中透露。 不仅如此,奥特曼谈及了近期围绕ChatGPT…

如何同时处理多个聊天

作为跨境电商企业,有没有想过您的客服成员同时处理多个聊天有多大挑战?如果他们在管理多个聊天时犯了错误,或者他们的一个响应提示访问者在获得解决方案之前离开网站怎么办? 是的,毫无疑问,最好的实时支持聊…

微服务_微服务的架构演进之路

目录 一、前言 二、单体架构 三、分布式架构 四、微服务 五、SpringCloud 六、服务拆分 5.1服务拆分原则 5.2服务拆分示例 一、前言 微服务是一种软件开发架构风格,它将单个应用程序拆分成多个小型服务,每个服务都具有自己的特定功能。这些服务…

【开发实践】在线考试系统(三) Sortable实现试题的重排序

一、需求分析 开发一个在线考试系统,在教师组卷功能模块中,需要对已经选择的试题进行重排序,获得所需试题顺序的试卷。 如下是试卷编辑页面,需要在将已经选中的试题重排顺序。 二、技术引入 1、sortable.js sortable.js 官方…
最新文章