Java IO流的基本概念和使用,包括文件读写、序列化等

Java 输入输出(IO)系统提供了一套丰富的类和接口,用于处理文件读写、网络通信、数据序列化等各种数据操作。

IO 操作在任何编程语言中都扮演着重要角色,而 Java 的 IO 系统以其强大的灵活性和扩展性,成为开发者进行数据操作的得力工具。

1. 基本概念
1.1 流(Stream)

流是一个抽象概念,表示数据的有序集合。流分为输入流和输出流:

  • 输入流:从数据源(如文件、网络连接)读取数据。
  • 输出流:向数据目标(如文件、网络连接)写入数据。

Java 中的流大致分为以下几种类型:

  • 字节流(Byte Streams):用于处理原始的字节数据,常用于二进制文件。
  • 字符流(Character Streams):用于处理字符数据,适合处理文本文件。
  • 缓冲流(Buffered Streams):提供缓冲机制,提高 IO 操作效率。
  • 数据流(Data Streams):用于读写 Java 原始数据类型。
  • 对象流(Object Streams):用于对象序列化和反序列化。
1.2 字节流

字节流类主要包括 InputStream 和 OutputStream,它们是所有字节流类的基类。

  • InputStream:所有字节输入流的超类,常用的子类有 FileInputStream、BufferedInputStream 等。
  • OutputStream:所有字节输出流的超类,常用的子类有 FileOutputStream、BufferedOutputStream 等。
1.3 字符流

字符流类主要包括 Reader 和 Writer,它们是所有字符流类的基类。

  • Reader:所有字符输入流的超类,常用的子类有 FileReader、BufferedReader 等。
  • Writer:所有字符输出流的超类,常用的子类有 FileWriter、BufferedWriter 等。
2. 文件读写
2.1 字节流文件读写

文件读写是最基本的 IO 操作,下面是使用字节流进行文件读写的示例:

文件读取:

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

public class ByteStreamReadExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("example.txt")) {
            int data;
            while ((data = fis.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

文件写入:

import java.io.FileOutputStream;
import java.io.IOException;

public class ByteStreamWriteExample {
    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("example.txt")) {
            String content = "Hello, World!";
            fos.write(content.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2.2 字符流文件读写

字符流处理的是字符数据,更适合用于文本文件的读写。

文件读取:

import java.io.FileReader;
import java.io.IOException;

public class CharStreamReadExample {
    public static void main(String[] args) {
        try (FileReader fr = new FileReader("example.txt")) {
            int data;
            while ((data = fr.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

文件写入:

import java.io.FileWriter;
import java.io.IOException;

public class CharStreamWriteExample {
    public static void main(String[] args) {
        try (FileWriter fw = new FileWriter("example.txt")) {
            String content = "Hello, World!";
            fw.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
3. 缓冲流

缓冲流通过增加缓冲区来提高 IO 操作的效率。缓冲区可以减少对底层操作系统的访问频率,从而提升性能。

缓冲字节流:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class BufferedByteStreamReadExample {
    public static void main(String[] args) {
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("example.txt"))) {
            int data;
            while ((data = bis.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

缓冲字符流:

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

public class BufferedCharStreamReadExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4. 数据流

数据流用于读写 Java 的基本数据类型(如 int、double、boolean)和字符串,适合进行数据的存储和传输。

数据输出流:

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataStreamWriteExample {
    public static void main(String[] args) {
        try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.dat"))) {
            dos.writeInt(123);
            dos.writeDouble(45.67);
            dos.writeBoolean(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

数据输入流:

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class DataStreamReadExample {
    public static void main(String[] args) {
        try (DataInputStream dis = new DataInputStream(new FileInputStream("data.dat"))) {
            int intValue = dis.readInt();
            double doubleValue = dis.readDouble();
            boolean booleanValue = dis.readBoolean();

            System.out.println("Integer: " + intValue);
            System.out.println("Double: " + doubleValue);
            System.out.println("Boolean: " + booleanValue);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5. 对象流

对象流用于对象的序列化和反序列化。序列化是指将对象的状态转换为字节流,以便保存到文件或通过网络传输;反序列化是将字节流恢复为对象。

对象序列化:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

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 + "}";
    }
}

public class ObjectStreamWriteExample {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30);

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {
            oos.writeObject(person);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

对象反序列化:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectStreamReadExample {
    public static void main(String[] args) {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
            Person person = (Person) ois.readObject();
            System.out.println(person);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
6. 其他 IO 操作
6.1 文件复制

文件复制是常见的 IO 操作,使用缓冲流可以提高效率。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopyExample {
    public static void main(String[] args) {
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("source.txt"));
             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("destination.txt"))) {

            byte[] buffer = new byte[1024];
            int length;
            while ((length = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
6.2 读取文件行数

使用 BufferedReader 可以方便地逐行读取文件内容。

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

public class LineCountExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
            int lineCount = 0;
            while (br.readLine() != null) {
                lineCount++;
            }
            System.out.println("Total lines: " + lineCount);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
6.3 查找文件中的某个单词

可以结合 BufferedReader 和 String 的 contains 方法实现简单的文本搜索。

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

public class WordSearchExample {
    public static void main(String[] args) {
        String searchWord = "Java";
        try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            int lineNumber = 0;
            while ((line = br.readLine()) != null) {
                lineNumber++;
                if (line.contains(searchWord)) {
                    System.out.println("Found " + searchWord + " at line " + lineNumber);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Java 的 IO 系统通过提供丰富的类和接口,使得开发者可以方便地进行各种数据操作。字节流适用于处理二进制数据,字符流适用于处理文本数据,缓冲流提高了 IO 操作的效率,数据流便于处理基本数据类型,对象流支持对象的序列化和反序列化。此外,Java IO 还提供了许多实用的方法和工具类,简化了文件操作、数据传输等任务。

黑马程序员免费预约咨询

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

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

相关文章

【全开源】Fastflow工作流系统(FastAdmin+ThinkPHP)

🚀Fastflow工作流系统:高效协作,流程无忧​ 一款基于FastAdminThinkPHP开发的可视化工作流程审批插件,帮助用户基于企业业务模式和管理模式自行定义所需的各种流程应用,快速构建企业自身的流程管控体系,快…

短剧cps系统搭建开发,热门短剧推广分销系统。短剧分销是怎么操作的?

目录 前言: 二、短剧是怎么推广分销的? 二、 短剧分销系统有什么功能? 三、怎么搭建? 总结: 前言: 短剧分销项目目前的现状是多元化且充满活力的。随着短剧市场的快速发展和观众接受度的提高&#xff0…

浏览器打不开网页是什么原因?这里有详细解答!

在日常使用电脑的过程中,我们经常需要通过浏览器访问各种网站。然而,有时会遇到浏览器无法打开网页的情况,这可能导致工作中断或者无法获取所需的信息。那么浏览器打不开网页是什么原因呢?其实浏览器无法打开网页的原因可能有很多…

stm32-DMA转运数据

在配置前要记得先定义一下DMA转运的源端数组和目标数组两个数组哦。 接下来我们就开始准备配置吧 配置 初始化 1.RCC开启时钟(开启DMA的时钟) void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) 作用:开启时…

JUC 笔记 8

1. Semaphore 信号量 基本使用 [ˈsɛməˌfɔr] 信号量&#xff0c;用来限制能同时访问共享资源的线程上限。 public static void main(String[] args) {// 1. 创建 semaphore 对象Semaphore semaphore new Semaphore(3);// 2. 10个线程同时运行for (int i 0; i < 10; …

一款史上最强的智能优化算法软件,MATLAB APP Designer开发

很久没有整理干货了&#xff0c;原因是最近一直在精心打磨一款智能优化算法APP&#xff0c;前前后后改了很多次&#xff0c;今天终于完工了&#xff01;接下来跟我一起来看看这款软件吧&#xff01; 目录 引言 01 单个算法测试介绍 02多种算法对比介绍 03软件安装及一些限…

深入解析ETL与ELT架构:数据集成技术的演进与发展

摘要&#xff1a;随着大数据时代的到来&#xff0c;数据集成成为企业信息化建设的重要环节。本文将深入探讨ETL与ELT两种架构&#xff0c;分析它们在数据处理、性能、可扩展性等方面的差异&#xff0c;为企业数据集成提供技术指导。 一、引言 在大数据时代&#xff0c;企业需要…

slf4j等多个jar包冲突绑定的排查方法使用IDEA的maven help解决

1.安装 2.使用maven help解决&#xff0c;找到对应包存在的冲突 使用exclude直接解决即可

HTML跨年烟花

目录 写在前面 关于小编 HTML简介 程序设计 系列文章 写在后面 写在前面 学会了这个html烟花秀&#xff0c;跨年就不缺文案喽~ 关于小编 平易近人&#xff0c;慈眉善目&#xff0c;爱交朋友&#xff0c;舍己为人&#xff0c;和蔼可亲&#xff0c;能说会道&#xff0c;…

解决 Mac Django 连接Mysql 出现 image not found 问题

最近在使用 Django 框架&#xff0c;因为升级到4.2版本了&#xff0c;对应的本机 Mysql 5.7 就不适用了&#xff0c;于是升级到了 Mysql 8.0&#xff0c;写好代码之后出现如下错误&#xff1a; 仔细分析一下错误的描述&#xff1a; ImportError: dlopen(/Library/Frameworks/P…

【安装笔记-20240529-Windows-Electerm 终端工具】

安装笔记-系列文章目录 安装笔记-20240529-Windows-Electerm 终端工具 文章目录 安装笔记-系列文章目录安装笔记-20240529-Windows-Electerm 终端工具 前言一、软件介绍名称&#xff1a;electerm主页官方介绍功能特性 二、安装步骤测试版本&#xff1a;electerm-1.39.35-win-x…

Pixi绘制地图和小车

之前已经用Pixi绘制出了各种图形以及通过图片绘制精灵&#xff0c;这节用pixi绘制网格地图&#xff0c;并通过图片制作一个Sprite&#xff0c;让这个Sprite在网格地图上运动。首先需要在页面中添加一个div用来后期展示canvas的画布&#xff0c;并将此div实例化为PIXI的Applicat…

Doris 少数SQL在Datagrip无法执行,而在DorisUI或程序调用可以执行的问题

问题&#xff1a;Doris 少数SQL在Datagrip无法执行&#xff0c;而在DorisUI或程序调用可以执行 解决&#xff1a;Datagrip 执行SQL切分异常&#xff0c;设置默认执行语句方式&#xff0c;将分句改为整句执行 但是 支持多SQL批量分开执行更好用

茶树三维基因组-文献精读19

The high-resolution three-dimensional (3D) chromatin map of the tea plant (Camellia sinensis) 茶树&#xff08;Camellia sinensis&#xff09;的高分辨率三维染色质图&#xff0c;还记得茶属的转录组分析嘛~ 比较转录组分析揭示了116种山茶属(Camellia)植物的深层系统…

IDEA下项目发送到Gitee

一、首先在Gitee创建一个仓库&#xff08;什么都不选&#xff0c;这是最简单的方式&#xff0c;否则需要 pull push等一些操作&#xff0c;我嫌麻烦&#xff09; 二、按图点击&#xff08;创建存储区&#xff0c;选择你要上传的项目&#xff09; 三、按图点击后正常文件名会变绿…

ChatTTS 如何安装可视化操作

可视化一键安装下载地址&#xff1a; 百度网盘 Download from GitHub 从 GitHub 下载代码。 git clone https://github.com/2noise/ChatTTS 下载地址 Install Dependencies 在开始之前&#xff0c;请确保已安装必要的软件包。如果您尚未安装它们&#xff0c;可以使用 pip …

51种企业应用架构模式详解

01 什么是企业应用 我的职业生涯专注于企业应用&#xff0c;因此&#xff0c;这里所谈及的模式也都是关于企业应用的。&#xff08;企业应用还有一些其他的说法&#xff0c;如“信息系统”或更早期的“数据处理”。&#xff09;那么&#xff0c;这里的“企业应用”具体指的是什…

芯片验证分享1 —— 开篇及名词解释

大家好&#xff0c;我是谷公子的藏经阁&#xff0c;今天和大家很高兴能和大家分享的是芯片验证中的一些内容&#xff0c;希望对大家的日常工作有所帮助&#xff0c;如果这些内容有帮助到大家的话&#xff0c;那么此次的分享就很值得。另外&#xff0c;对于这个课题&#xff0c;…

Vue2里CSS动画实际应用之transform属性和animation属性的使用

最近项目需要做个简单的动画&#xff0c;如上图&#xff0c;框出来的图片需要上下浮动在Y轴上来回循环的移动&#xff0c;这个要用到如下css代码&#xff1a; .active-image-7 {animation: 5s float7 linear infinite normal;}keyframes float7{0% {transform: translateY(0px…

毫米波雷达阵列天线设计综合1(MATLAB仿真)

1 天线设计目标 毫米波雷达探测目标的距离、速度和角度&#xff0c;其中距离和角度和天线设计相关性较强。天线增益越高&#xff0c;则根据雷达方程可知探测距离越远&#xff1b;天线波束越窄&#xff0c;则角度分辨率越高&#xff1b;天线副瓣/旁瓣越低&#xff0c;则干扰越少…