Java io 实战案例总结

一、简介

Java I/O(输入/输出)是Java编程中非常基础且重要的部分,它允许程序与外部世界进行数据交换。Java I/O操作可以分为两大类:字符流和字节流。以下是一些Java I/O应用中的常用操作:

1. 字节流

  • FileInputStream:用于从文件中读取字节数据。
  • FileOutputStream:用于将字节数据写入文件。
  • BufferedInputStream:提供缓冲区的输入流,提高读取效率。
  • BufferedOutputStream:提供缓冲区的输出流,提高写入效率。
  • DataInputStream:提供读取Java基本数据类型的方法。
  • DataOutputStream:提供写入Java基本数据类型的方法。
  1. 字符流
  • FileReader:用于读取字符文件。
  • FileWriter:用于写入字符文件。
  • BufferedReader:提供缓冲区的字符输入流,提高读取效率。
  • BufferedWriter:提供缓冲区的字符输出流,提高写入效率。
  • LineNumberReader:跟踪行号的Reader。
  • PrintWriter:提供了便捷的打印方法。

二、核心方法解析

1.InputStream 和 OutputStream

这两个是Java I/O的基础接口,用于处理字节流。

InputStream:

  • int read(): 读取一个字节的数据,并返回字节值(0-255),如果到达文件末尾则返回-1。
  • int read(byte[] b): 读取最多b.length个字节的数据到字节数组中,并返回实际读取的字节数。
  • void close(): 关闭流并释放与之相关联的系统资源。

OutputStream:

  • void write(int b): 写入一个字节到输出流中。
  • void write(byte[] b): 写入b.length个字节到输出流中。
  • void write(byte[] b, int off, int len): 从偏移量off开始,写入len个字节到输出流中。
  • void close(): 关闭流并释放与之相关联的系统资源。

2. Reader 和 Writer

这两个接口用于处理字符流,是InputStream和OutputStream的字符版本。

Reader:

  • int read(): 读取一个字符并返回其整数值,如果到达文件末尾则返回-1。
  • int read(char[] cbuf): 读取字符到字符数组中。
  • void close(): 关闭流并释放与之相关联的系统资源。

Writer:

  • void write(int c): 写入一个字符到输出流中。
  • void write(char[] cbuf): 写入字符数组到输出流中。
  • void write(char[] cbuf, int off, int len): 写入字符数组的一部分到输出流中。
  • void write(String str): 写入字符串到输出流中。
  • void write(String str, int off, int len): 写入字符串的一部分到输出流中。
  • void close(): 关闭流并释放与之相关联的系统资源。

三、Java 字节流 实际案例

Java中的字节流主要用于处理二进制数据,如图片、音频、视频等文件的读写操作。以下是几个使用字节流处理实际案例的代码示例:

1.图片复制

此案例演示如何使用FileInputStream和FileOutputStream来复制一张图片。

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

public class ImageCopyExample {
    public static void main(String[] args) {
        String sourcePath = "source.jpg";
        String targetPath = "target_copy.jpg";

        try (FileInputStream fis = new FileInputStream(sourcePath);
             FileOutputStream fos = new FileOutputStream(targetPath)) {
			//创建一个大小为 1024 字节的缓冲区。这个缓冲区用于在读取和写入文件时暂		存数据。
			//使用缓冲区可以提高文件复制的效率,因为它减少了与底层系统的交互次数。
            byte[] buffer = new byte[1024];
            
            //定义一个整数变量,用于存储每次从输入流中读取的字节数
            int bytesRead;

            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }

            System.out.println("图片复制完成");

        } catch (IOException e) {
            System.err.println("复制过程中发生错误: " + e.getMessage());
        }
    }
}

通过使用try-with-resources语句,我们不再需要显式地调用close()方法。当try块结束时(无论是正常结束还是因异常退出),资源会自动被关闭,

2. 文件加密/解密(简单示例)

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

public class OptimizedFileEncryption {
	//用于文件加密的偏移量
    private static final int OFFSET = 5;

    public static void encrypt(String source, String encrypted) throws IOException {
        try (FileInputStream fis = new FileInputStream(source);
             FileOutputStream fos = new FileOutputStream(encrypted)) {

            byte[] buffer = new byte[1024];
            int bytesRead;

            while ((bytesRead = fis.read(buffer)) != -1) {
                for (int i = 0; i < bytesRead; i++) {
                    buffer[i] = (byte) (buffer[i] + OFFSET);
                }
                fos.write(buffer, 0, bytesRead);
            }
        }
    }

    public static void decrypt(String encrypted, String decrypted) throws IOException {
        try (FileInputStream fis = new FileInputStream(encrypted);
             FileOutputStream fos = new FileOutputStream(decrypted)) {

            byte[] buffer = new byte[1024];
            int bytesRead;

            while ((bytesRead = fis.read(buffer)) != -1) {
                for (int i = 0; i < bytesRead; i++) {
                    buffer[i] = (byte) (buffer[i] - OFFSET);
                }
                fos.write(buffer, 0, bytesRead);
            }
        }
    }

    public static void main(String[] args) {
        String originalFile = "original.txt";
        String encryptedFile = "encrypted.txt";
        String decryptedFile = "decrypted.txt";

        try {
            encrypt(originalFile, encryptedFile);
            System.out.println("文件加密完成");

            decrypt(encryptedFile, decryptedFile);
            System.out.println("文件解密完成");
        } catch (IOException e) {
            System.err.println("操作过程中发生错误: " + e.getMessage());
        }
    }
}

3.文件下载(简化示例,不涉及网络编程)

import java.io.*;  
  
public class FileDownloadExample {  
    // 假设我们有一个“服务器”上的文件内容(实际情况下,这将是网络数据)  
    private static final byte[] FILE_CONTENT = "This is fake file content for demonstration.".getBytes();  
  
    public static void main(String[] args) {  
        String destinationFilePath = "path/to/downloadedFile.txt";  
  
        try (OutputStream outputStream = new FileOutputStream(destinationFilePath)) {  
            outputStream.write(FILE_CONTENT);  
  
            System.out.println("File downloaded successfully!"); // 注意:这只是一个模拟  
  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

四、Java 字符流实际案例

1.读取文本文件内容

import java.io.*;  
  
public class ReadTextFile {  
    public static void main(String[] args) {  
        String filePath = "example.txt";  
  
        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {  
            String line;  
            while ((line = reader.readLine()) != null) {  
                System.out.println(line);  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

2.复制文本文件

import java.io.*;  
  
public class CopyTextFile {  
    public static void main(String[] args) {  
        String sourceFilePath = "source.txt";  
        String targetFilePath = "target.txt";  
  
        try (  
            BufferedReader reader = new BufferedReader(new FileReader(sourceFilePath));  
            BufferedWriter writer = new BufferedWriter(new FileWriter(targetFilePath))  
        ) {  
            String line;  
            while ((line = reader.readLine()) != null) {  
                writer.write(line);  
                writer.newLine(); // 保持原始文件的行格式  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

3. 修改文本文件内容

import java.io.*;  
import java.nio.file.*;  
  
public class ModifyTextFile {  
    public static void main(String[] args) {  
        String filePath = "example.txt";  
  
        // 使用Java 7的Files类和Paths类来读取文件内容  
        Path path = Paths.get(filePath);  
        List<String> lines = null;  
        try {  
            lines = Files.readAllLines(path);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
        if (lines != null) {  
            for (int i = 0; i < lines.size(); i++) {  
                // 假设我们要将文件中的"old"替换为"new"  
                if (lines.get(i).contains("old")) {  
                    lines.set(i, lines.get(i).replace("old", "new"));  
                }  
            }  
  
            try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {  
                for (String line : lines) {  
                    writer.write(line);  
                    writer.newLine();  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}

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

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

相关文章

30万奖励!2023-2024年度成都市工业企业“小升规”申报对象奖补、材料程序

一、申报对象及奖励标准 &#xff08;一&#xff09;2023年度申报对象及奖励标准。2022年3月1日至2022年12月31日首次进入成都市规模以上工业名录库的企业。2022年营业收入在2000万元&#xff08;含&#xff09;至5000万元的&#xff0c;给予10万元奖励&#xff1b;2022年营业…

4. 分布式链路追踪客户端工具包Starter设计

前言 本文将从零搭建分布式链路追踪客户端工具包的Starter&#xff0c;并将在后续文章中逐步丰富支持的场景。这里首先将搭建一个最基础的Starter&#xff0c;能提供的功能和1. 看完这篇文章我奶奶都懂Opentracing了一文中的示例demo类似。 相关版本依赖如下。 opentracing-…

大模型LLM之SFT微调总结

一. SFT微调是什么 在大模型的加持下现有的语义理解系统的效果有一个质的飞跃&#xff1b;相对于之前的有监督的Pre-Train模型&#xff1b;大模型在某些特定的任务中碾压式的超过传统nlp效果&#xff1b;由于常见的大模型参数量巨大&#xff1b;在实际工作中很难直接对大模型训…

视频剪辑批量转码技巧:如何将MP4视频快速转换为MP3音频的方法

在视频剪辑和音频处理的领域中&#xff0c;经常需要将视频文件转换为音频文件&#xff0c;特别是将MP4视频转换为MP3音频。这样的转换不仅可以减少文件大小&#xff0c;方便传输和存储&#xff0c;还可以在不损失音频质量的情况下&#xff0c;方便在各种设备上播放。下面&#…

AI写的论文AI疑似度太高怎么办?教你一招降低aigc痕迹

随着 AI 技术迅猛发展&#xff0c;各种AI辅助论文写作的工具层出不穷&#xff01; 为了防止有人利用AI工具进行论文代写&#xff0c;在最新的学位法中已经明确规定“已经获得学位者&#xff0c;在获得该学位过程中如有人工智能代写等学术不端行为&#xff0c;经学位评定委员会…

【随笔】Git 高级篇 -- 不带 source 参数的命令 git fetch git push(三十九)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

电脑硬盘故障,这5种情况要了解!

在数字化时代&#xff0c;电脑硬盘作为存储数据的重要设备&#xff0c;其稳定性和安全性直接关系到用户的数据安全和工作效率。然而&#xff0c;硬盘故障却是一个无法完全避免的问题。为什么会出现电脑硬盘故障&#xff1f;出现该问题时应该如何解决&#xff1f;一文带你弄懂答…

【个人博客搭建】(18)使用Quartz.NET 定时备份数据库

Quartz.NET在系统主要承担的一些关键功能&#xff1a; 任务调度&#xff1a;Quartz.NET 允许开发人员创建、调度和管理定时任务&#xff0c;支持简单触发器和Cron表达式等多样化的触发策略。灵活性&#xff1a;Quartz.NET 提供了灵活的任务安排机制&#xff0c;不仅支持基于时间…

数据挖掘(一)数据类型与统计

前言 打算新开一个笔记系列&#xff0c;基于国防科技大学 丁兆云老师的《数据挖掘》 数据挖掘 1、数据类型与统计 数据统计 最大值&#xff0c;最小值&#xff0c;平均值&#xff0c;中位数&#xff0c;位数&#xff0c;方差等统计指标 df.describe() #当调用df.describe(…

电池储能系统的电荷状态预测 | 利用数据驱动机器学习预测锂离子电池储能系统的电荷状态附代码

概述 准确估计电荷状态(SOC)对于保证锂离子电池储能系统的安全性和稳定性至关重要。然而,由于锂离子电池内多个复杂过程的耦合动力学,以及缺乏监测电池内部性能变化的措施,这项任务非常具有挑战性。近年来,随着图形处理器(GPU)计算能力的不断发展,深度学习作为 SOC 估计方…

# 从浅入深 学习 SpringCloud 微服务架构(十四)微服务链路追踪

从浅入深 学习 SpringCloud 微服务架构&#xff08;十四&#xff09;微服务链路追踪 一、微服务的链路追踪概述 1、微服务架构下的问题 在大型系统的微服务化构建中&#xff0c;一个系统会被拆分成许多模块。这些模块负责不同的功能&#xff0c;组合成系统&#xff0c;最终可…

java中的并发编程

1、上下文切换 即使是单核处理器也支持多线程执行代码&#xff0c;CPU通过给每个线程分配CPU时间片来实现 这个机制。这个时间片特别短&#xff0c;一般是几十毫秒&#xff0c;所以会让我们觉得好多任务同时进行。 CPU通过时间片分配算法来循环执行任务&#xff0c;当前任务执…

autolabor(ROS开发笔记)__1

视频链接&#xff1a;ROS机器人 chapter 1 ROS概述与环境搭建 学习步骤&#xff1a; 1.了解该模块的相关概念 是什么&#xff0c;为什么学&#xff0c;前世今生&#xff0c;发展前景 2.安装官方软件包 具备基本的开发环境&#xff0c;简陋notepad 3.搭建集成开发环境(IDE,Int…

打造抖音萌娃账户,一条广告轻松过万,副业兼职最佳选择(实例教程 素材内容)

我特别喜欢简单易操作的新项目&#xff0c;因为过于复杂和门槛高的项目对新手来说可能是毁灭性的&#xff0c;他们往往难以入门&#xff0c;而且付出努力也得不到反馈。 下 载 地 址 &#xff1a; laoa1.cn/1971.html 小宝宝小萌娃账户就相对简单&#xff0c;它类似于电视剧…

文字图形化:UI设计师的必备能力,带你看看为什么要这么做。

在UI设计中&#xff0c;文字尽可能要进行图形化设计的原因有以下几点&#xff1a; 提高识别性&#xff1a; 图形化设计可以通过视觉效果和形状来吸引用户的注意力&#xff0c;从而提高文字的可识别性。这有助于用户更快地理解并记住信息&#xff0c;同时也可以增强品牌的认知…

Python实现一个简单的计算器

简单版本 使用 Python 的 Tkinter 模块来实现一个简单的图形化计算器。以下是一个基本的示例代码 示例效果 代码源码 import tkinter as tkdef button_click(number):current entry.get()entry.delete(0, tk.END)entry.insert(0, current str(number))def button_clear():e…

翼支付——风控场景中图模型的范式变迁

目录 风控图深度学习模型 风控图大模型

ASP.NET校园新闻发布系统的设计与实现

摘 要 校园新闻发布系统是在学校区域内为学校教育提供资源共享、信息交流和协同工作的计算机网络信息系统。随着网络技术的发展和Internet应用的普及&#xff0c;互联网已成为人们获取信息的重要来源。由于现在各大学校的教师和学生对信息的需求越来越高&#xff0c;校园信息…

Redis未授权访问

一、漏洞描述 Redis未授权访问 因配置不当可以未经授权访问&#xff0c;攻击者无需认证就可以访问到内部数据。 1. 导致敏感信息泄露 2. 执行 flushall 可清空所有数据 3. 通过数据备份功能往磁盘写入后门文件&#xff08;webshell、定时任务&#xff09; 4. 如果Redis以…

Swift 集合类型

集合类型 一、集合的可变性二、数组&#xff08;Arrays&#xff09;1、数组的简单语法2、创建一个空数组3、创建一个带有默认值的数组4、通过两个数组相加创建一个数组5、用数组字面量构造数组6、访问和修改数组7、数组的遍历 三、集合&#xff08;Sets&#xff09;1、集合类型…
最新文章