【Java 基础篇】Java字节字符流详解:轻松读写文本与二进制数据

在这里插入图片描述

在Java编程中,对文件和数据的读写操作是非常常见的任务。为了满足不同需求,Java提供了多种流类来处理输入和输出。本篇博客将详细介绍Java中的字节流和字符流,以及它们的使用方法,帮助初学者更好地理解和运用这些流来处理文件和数据。

字节流和字符流的区别

在开始之前,我们需要了解字节流和字符流的基本区别。这两者都是用于文件和数据的读写,但有一些重要的不同点:

  • 字节流:字节流主要用于处理二进制数据,如图像、音频、视频文件等。它们以字节为单位进行读写,适合处理任何类型的数据,包括文本数据。字节流通常使用InputStreamOutputStream类。

  • 字符流:字符流用于处理文本数据,以字符为单位进行读写。它们在内部使用编码方式来处理字符数据,可以很好地处理各种字符集。字符流通常使用ReaderWriter类。

接下来,我们将详细介绍这两种流的使用。

字节流操作

使用FileInputStreamFileOutputStream

FileInputStreamFileOutputStream是最基本的字节流,用于读取和写入文件。以下是一个读取文件并将其复制到另一个文件的示例:

import java.io.*;public class FileInputStreamExample {public static void main(String[] args) {try (FileInputStream input = new FileInputStream("input.txt");FileOutputStream output = new FileOutputStream("output.txt")) {int data;while ((data = input.read()) != -1) {output.write(data);}System.out.println("File copied successfully!");} catch (IOException e) {e.printStackTrace();}}
}

使用BufferedInputStreamBufferedOutputStream

BufferedInputStreamBufferedOutputStream提供了缓冲功能,可以提高读写文件的效率。下面是一个使用缓冲流的示例:

import java.io.*;public class BufferedStreamExample {public static void main(String[] args) {try (BufferedInputStream input = new BufferedInputStream(new FileInputStream("input.txt"));BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream("output.txt"))) {int data;while ((data = input.read()) != -1) {output.write(data);}System.out.println("File copied successfully!");} catch (IOException e) {e.printStackTrace();}}
}

使用DataInputStreamDataOutputStream

DataInputStreamDataOutputStream用于读写基本数据类型(如整数、浮点数)和字符串。以下是一个使用它们的示例:

import java.io.*;public class DataStreamExample {public static void main(String[] args) {try (DataOutputStream output = new DataOutputStream(new FileOutputStream("data.txt"))) {output.writeInt(42);output.writeDouble(3.14);output.writeUTF("Hello, World!");System.out.println("Data written successfully!");} catch (IOException e) {e.printStackTrace();}}
}

使用ObjectInputStreamObjectOutputStream

ObjectInputStreamObjectOutputStream允许您将对象序列化为字节流并将其反序列化回对象。这对于保存和恢复对象状态非常有用。以下是一个示例:

import java.io.*;class Person implements Serializable {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class ObjectStreamExample {public static void main(String[] args) {try (ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("person.dat"));ObjectInputStream input = new ObjectInputStream(new FileInputStream("person.dat"))) {Person person = new Person("Alice", 30);output.writeObject(person);System.out.println("Object written successfully!");Person loadedPerson = (Person) input.readObject();System.out.println("Loaded person: " + loadedPerson);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

这些是一些用于字节流的基本操作和示例。字节流适用于处理各种文件和数据,但对于文本数据,字符流更加方便。下面我们将介绍字符流的操作。

字符流操作

使用FileReaderFileWriter

FileReaderFileWriter是用于读写文件的字符流。它们非常适合处理文本文件。

import java.io.*;public class FileReaderWriterExample {public static void main(String[] args) {File inputFile = new File("input.txt");File outputFile = new File("output.txt");try (FileReader reader = new FileReader(inputFile);FileWriter writer = new FileWriter(outputFile)) {int character;while ((character = reader.read()) != -1) {writer.write(character);}System.out.println("File copied successfully!");} catch (IOException e) {e.printStackTrace();}}
}

使用BufferedReaderBufferedWriter

BufferedReaderBufferedWriter提供了缓冲功能,可以提高文件读写的效率。

import java.io.*;public class BufferedReaderWriterExample {public static void main(String[] args) {File inputFile = new File("input.txt");File outputFile = new File("output.txt");try (BufferedReader reader = new BufferedReader(new FileReader(inputFile));BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {String line;while ((line = reader.readLine()) != null) {writer.write(line);writer.newLine(); // 添加换行符}System.out.println("File copied successfully!");} catch (IOException e) {e.printStackTrace();}}
}

这些是一些用于字符流的高级操作和示例。字符流适用于处理文本数据,特别是需要考虑字符编码的情况。

字节字符流的更多操作

在前面的部分,我们介绍了Java中字节字符流的基本操作。现在让我们深入探讨一些更高级的用法和操作。

1. 复制文件夹

有时候,我们需要将一个文件夹及其内容复制到另一个位置。下面是一个使用字节流来复制文件夹的示例:

import java.io.*;public class CopyFolderExample {public static void main(String[] args) {File sourceFolder = new File("sourceFolder");File destinationFolder = new File("destinationFolder");if (!destinationFolder.exists()) {destinationFolder.mkdirs();}copyFolder(sourceFolder, destinationFolder);System.out.println("Folder copied successfully!");}private static void copyFolder(File source, File destination) {if (source.isDirectory()) {if (!destination.exists()) {destination.mkdir();}String[] files = source.list();if (files != null) {for (String file : files) {File srcFile = new File(source, file);File destFile = new File(destination, file);copyFolder(srcFile, destFile);}}} else {try (InputStream in = new FileInputStream(source);OutputStream out = new FileOutputStream(destination)) {byte[] buffer = new byte[1024];int length;while ((length = in.read(buffer)) > 0) {out.write(buffer, 0, length);}} catch (IOException e) {e.printStackTrace();}}}
}

2. 压缩文件

你可以使用字节流来压缩和解压缩文件。在Java中,可以使用ZipOutputStreamZipInputStream来实现这一目标。以下是一个压缩文件的示例:

import java.io.*;
import java.util.zip.*;public class FileCompressionExample {public static void main(String[] args) {String sourceFile = "source.txt";String compressedFile = "compressed.zip";try (FileOutputStream fos = new FileOutputStream(compressedFile);ZipOutputStream zipOut = new ZipOutputStream(fos);FileInputStream fis = new FileInputStream(sourceFile)) {ZipEntry zipEntry = new ZipEntry(sourceFile);zipOut.putNextEntry(zipEntry);byte[] bytes = new byte[1024];int length;while ((length = fis.read(bytes)) >= 0) {zipOut.write(bytes, 0, length);}zipOut.closeEntry();System.out.println("File compressed successfully!");} catch (IOException e) {e.printStackTrace();}}
}

3. 文件加密和解密

字节流也可以用于文件的加密和解密操作。你可以对文件的内容进行加密,以确保数据的安全性。以下是一个简单的文件加密和解密示例:

import java.io.*;
import javax.crypto.*;
import javax.crypto.spec.*;public class FileEncryptionExample {public static void main(String[] args) {String inputFile = "input.txt";String encryptedFile = "encrypted.txt";String decryptedFile = "decrypted.txt";try {// 生成密钥KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");SecretKey secretKey = keyGenerator.generateKey();// 创建Cipher对象并初始化为加密模式Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 加密文件try (FileInputStream fis = new FileInputStream(inputFile);FileOutputStream fos = new FileOutputStream(encryptedFile);CipherOutputStream cos = new CipherOutputStream(fos, cipher)) {byte[] buffer = new byte[1024];int length;while ((length = fis.read(buffer)) != -1) {cos.write(buffer, 0, length);}}// 解密文件cipher.init(Cipher.DECRYPT_MODE, secretKey);try (FileInputStream fis = new FileInputStream(encryptedFile);CipherInputStream cis = new CipherInputStream(fis, cipher);FileOutputStream fos = new FileOutputStream(decryptedFile)) {byte[] buffer = new byte[1024];int length;while ((length = cis.read(buffer)) != -1) {fos.write(buffer, 0, length);}}System.out.println("File encryption and decryption successful!");} catch (IOException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException e) {e.printStackTrace();}}
}

这些是字节字符流的更多高级操作示例。通过这些操作,你可以更灵活地处理文件和数据,并实现一些高级功能。请根据你的需求选择适合的操作方式。希望这些示例有助于你更好地理解和使用Java中的字节字符流。如果你有任何问题或建议,请随时在下面的评论中提出。

字节字符流的注意事项

在使用Java中的字节字符流时,有一些注意事项需要特别关注,以确保代码的可靠性和性能。以下是一些常见的注意事项:

1. 关闭流

确保在使用完流后关闭它们。流是有限的资源,如果不关闭,可能会导致资源泄漏。使用try-with-resources语句可以确保在退出代码块时自动关闭流。

try (FileInputStream fis = new FileInputStream("input.txt");FileOutputStream fos = new FileOutputStream("output.txt")) {// 使用流进行读写操作
} catch (IOException e) {e.printStackTrace();
}

2. 处理异常

在处理文件IO时,要适当地处理异常。这包括捕获和处理可能出现的异常,以及根据需要抛出自定义异常。

3. 字符编码

当使用字符流时,要注意字符编码。默认情况下,字符流使用平台默认的字符编码。如果需要使用不同的字符编码,可以在构造流时指定。

FileInputStream fis = new FileInputStream("input.txt");
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);

4. 缓冲流

使用缓冲流可以提高IO性能。BufferedInputStreamBufferedOutputStream用于字节流,而BufferedReaderBufferedWriter用于字符流。

BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));

5. 大文件处理

处理大文件时,应该使用适当的缓冲大小,以免消耗过多的内存。根据需要调整缓冲大小以平衡性能和内存消耗。

6. 异常处理

不要忽视异常处理。在IO操作期间,可能会发生各种异常,如IOExceptionFileNotFoundException等。正确处理这些异常对于代码的稳定性非常重要。

7. 文件路径

在处理文件时,确保指定的文件路径是正确的。如果文件不存在,可能会引发FileNotFoundException异常。

8. 线程安全性

注意多线程环境下的线程安全性。如果多个线程同时访问文件,必须谨慎处理以避免竞争条件。

9. 清理资源

在不再需要流时,确保调用close()方法释放资源。否则,可能会导致资源泄漏和性能下降。

遵循这些注意事项可以帮助你更好地编写和管理Java中的字节字符流代码。这些最佳实践有助于提高代码的可维护性和可靠性,同时确保你的应用程序能够高效地处理文件和数据。

总结

本篇博客详细介绍了Java中的字节流和字符流,以及它们的基本操作和示例。无论是处理文本数据还是二进制数据,Java提供了丰富的流类来满足各种需求。希望本文对初学者有所帮助,使他们更好地理解和运用Java中的流操作。

如果你有任何问题或建议,请随时在下面的评论中提出。谢谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv形状目标检测

1.圆形检测 OpenCV图像处理中“找圆技术”的使用-图像处理-双翌视觉OpenCV图像处理中“找圆技术”的使用,图像处理,双翌视觉https://www.shuangyi-tech.com/news_224.htmlopencv 找圆心得,模板匹配比霍夫圆心好用 - 知乎1 相比较霍夫找直线算法, 霍夫找…

RabbitMQ常见问题

一、RabbitMQ如何保证消息不丢失? 这是面试时最喜欢问的问题,其实这是个所有MQ的一个共性的问题,大致的解 决思路也是差不多的,但是针对不同的MQ产品会有不同的解决方案。而RabbitMQ 设计之处就是针对企业内部系统之间进行调用设…

【Linux入门】---Linux权限管理详解

文章目录 1.shell命令以及运行原理2.linux用户分类su指令切换用户 3.Linux权限管理3.1Linux文件访问者3.2文件类型和访问权限3.3文件权限值的表示方法3.4文件访问权限的相关设置方法chmod指令--权限修改方法①chmod指令--权限修改方法②chown指令chgrp指令umask指令file指令 4.…

基于SpringBoot的电影购票系统

基于SpringBootVue的电影购票系统、影视商城管理系统,前后端分离 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/Ecilpse、Navicat、Maven 【主要功能】 管理员:个人…

Unity 安装及运行MLAgents

1、下载ML-Agents 下载地址 GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinfo…

Linux基础指令(四)

目录 前言1. find & which 指令1.1 find1.2 which1.3 alias1.4 where 2、grep 指令3、xargs 指令结语: 前言 欢迎各位伙伴来到学习 Linux 指令的 第四天!!! 在上一篇文章 Linux基本指令(三) 当中,我们学会了通过…

CDH集群初始化oozie失败表结构不存在

文章目录 1. 背景2. 初始化数据库2.1 生成表结构2.2 初始化数据库 3. CDH管理页面始化 oozie 服务 1. 背景 安装CDH 6.3.2 版本时初始化集群服务过程中出现oozie server启动失败的情况,第一次创建集群成功,第二次失败了,分析日志信息 SERVER…

使用ElementPlus实现内嵌表格和内嵌分页

前言 有时遇到这样的需求,就是在表格里面嵌入一个表格,以及要求带有分页,这样在ElementPlus中很好实现。以下使用Vue2语法实现一个简单例子,毕竟Vue3兼容Vue2语法,若想要Vue3版本例子,简单改改就OK了。 一…

快递、外卖、网购自动定位及模糊检索收/发件地址功能实现

概述 目前快递、外卖、团购、网购等行业 :为了简化用户在收发件地址填写时的体验感,使用辅助定位及模糊地址检索来丰富用户的体验 本次demo分享给大家;让大家理解辅助定位及模糊地址检索的功能实现过程,以及开发出自己理想的作品…

IDEA中创建Java Web项目方法2

以下过程使用IntelliJ IDEA 2021.3 一、创建Maven项目 1. File -> New -> Projects... 2. 选择Maven,点击Next 3. 输入项目名称,Name: WebDemo3。点击 Finish,生成新的项目 二、添加框架支持 1. 在项目名上右键,选择 A…

云服务部署:AWS、Azure和GCP比较

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

线性代数基础-矩阵

八、矩阵的基础概念 1.矩阵 我们忘掉之前行列式的一切,列一种全新的数表,虽然长得很像,但是大不相同,首先一个区别就是矩阵不能展开成一个值,这里不讨论矩阵的空间意义 { a 11 x 1 a 12 x 2 a 13 x 3 . . . a 1…

【C#】【源码】直接可用的远程桌面应用

【背景】 封闭环境无法拷贝外来的远程桌面软件,所以就直接自己用C#写一个。 【效果】 【说明】 本篇会给出完整的编程步骤,照着写就能拥有你自己的远程桌面应用,直接可以运行在局域网。 如果不想自己敲代码,也可以选择直接下载…

Redis环境配置

【Redis解压即可】链接:https://pan.baidu.com/s/1y4xVLF8-8PI8qrczbxde9w?pwd0122 提取码:0122 【Redis桌面工具】 链接:https://pan.baidu.com/s/1IlsUy9sMfh95dQPeeM_1Qg?pwd0122 提取码:0122 Redis安装步骤 1.先打开Redis…

OPENCV实现DNN图像分类

使用步骤1 使用步骤2 使用步骤3 使用步骤4 使用步骤5 使用步骤6 完整代码如下: import numpy as np

线程的方法(未完成)

线程的方法 1、sleep(long millis) 线程休眠:让执行的线程暂停一段时间,进入计时等待状态。 static void sleep(long millis):调用此方法后,当前线程放弃 CPU 资源,在指定的时间内,sleep 所在的线程不会获得可运行的机…

解决MySQL8.0本地计算机上的MySQL服务启动后停止没有报告任何错误

1.启动MySQL的错误信息如下 (1)“本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。” (2)又在PowerShell中运行"net start MySQL",服务启动失败。“MySQL 服务无法启…

MyBatis初级

文章目录 一、mybatis1、概念2、JDBC缺点2.1、之前jdbc操作2.2 、原始jdbc操作的分析 3、mybatis的使用3.1、导入maven依赖3.2、新建表3.3、实体类3.4、编写mybatis的配置文件3.5、编写接口 和 映射文件3.6、编写测试类3.7、注意事项 4、代理方式开发5、mybatis和spring整合5.1…

二进制 Deploy Kubernetes v1.23.17 超级详细部署

文章目录 1. 预备条件2. 基础配置2.1 配置root远程登录2.2 配置主机名2.3 安装 ansible2.4 配置互信2.5 配置hosts文件2.6 关闭防firewalld火墙2.7 关闭 selinux2.8 关闭交换分区swap2.9 修改内核参数2.10 安装iptables2.11 开启ipvs2.12 配置limits参数2.13 配置 yum2.14 配置…

什么是 BSD 协议?

BSD开源协议是一个给于使用者很大自由的协议。可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。当你发布使用了BSD协议的代码,或者以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件&…