Java I/O操作

引言

在Java编程中,输入和输出(I/O)操作是必不可少的部分。Java I/O通过一系列流(Stream)类和方法,支持文件操作、控制台输入输出、网络I/O等多种I/O操作。本文将详细介绍Java I/O的基础概念、文件操作、字符流与字节流的区别、序列化与反序列化以及新的I/O(NIO)等内容,并通过表格进行总结和示范。

Java I/O基础概念

流的概念

流(Stream)是指数据的流动,是一个顺序读写数据的抽象。Java定义了两种基本类型的流:

  • 字节流:用于处理字节数据,最基础的类是InputStreamOutputStream
  • 字符流:用于处理字符数据,最基础的类是ReaderWriter

流的分类

Java I/O流可以按照数据类型分类为字节流和字符流,也可以按照数据流向分为输入流和输出流。

类型输入流输出流
字节流InputStreamOutputStream
字符流ReaderWriter

文件与目录操作

文件类(File)

File类表示文件或目录,可以对其进行创建、删除、获取信息等操作。

import java.io.File;
import java.io.IOException;public class FileExample {public static void main(String[] args) {// 创建一个File对象File file = new File("example.txt");try {// 创建新文件if (file.createNewFile()) {System.out.println("File created: " + file.getName());} else {System.out.println("File already exists.");}// 获取文件信息System.out.println("Absolute path: " + file.getAbsolutePath());System.out.println("Writable: " + file.canWrite());System.out.println("Readable: " + file.canRead());System.out.println("File size in bytes: " + file.length());} catch (IOException e) {System.out.println("An error occurred.");e.printStackTrace();}}
}

文件与目录操作方法表

方法描述示例
createNewFile()创建一个新的文件file.createNewFile();
delete()删除文件或目录file.delete();
exists()判断文件或目录是否存在file.exists();
getAbsolutePath()获取文件的绝对路径file.getAbsolutePath();
canWrite()判断文件是否可写file.canWrite();
canRead()判断文件是否可读file.canRead();
length()获取文件大小(字节)file.length();

字符流和字节流

字节流

字节流用于处理字节数据,通过InputStreamOutputStream类及其子类进行输入输出操作。

示例:使用FileInputStreamFileOutputStream进行文件字节操作

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class ByteStreamExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("input.txt");FileOutputStream fos = new FileOutputStream("output.txt")) {int byteData;// 逐字节读取数据while ((byteData = fis.read()) != -1) {// 逐字节写入数据fos.write(byteData);}} catch (IOException e) {e.printStackTrace();}}
}

字符流

字符流用于处理字符数据,通过ReaderWriter类及其子类进行输入输出操作。

示例:使用FileReaderFileWriter进行文件字符操作

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class CharStreamExample {public static void main(String[] args) {try (FileReader fr = new FileReader("input.txt");FileWriter fw = new FileWriter("output.txt")) {int charData;// 逐字符读取数据while ((charData = fr.read()) != -1) {// 逐字符写入数据fw.write(charData);}} catch (IOException e) {e.printStackTrace();}}
}

字符流和字节流的比较表

特性字节流字符流
基本类InputStream 和 OutputStreamReader 和 Writer
数据处理单位字节(8位)字符(16位)
适用场景二进制数据(如图像、音频)文本数据(如文本文件)
典型实现类FileInputStreamFileOutputStreamFileReaderFileWriter

序列化与反序列化

序列化

序列化是将对象转换为字节流并写到文件或网络中的过程。实现Serializable接口的类可以被序列化。

示例:对象序列化

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;class Person implements Serializable {private static final long serialVersionUID = 1L;String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}
}public class SerializationExample {public static void main(String[] args) {Person person = new Person("John", 30);try (FileOutputStream fos = new FileOutputStream("person.ser");ObjectOutputStream oos = new ObjectOutputStream(fos)) {oos.writeObject(person);} catch (IOException e) {e.printStackTrace();}}
}

反序列化

反序列化是将字节流转换为对象的过程。读取序列化文件时使用ObjectInputStream

示例:对象反序列化

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class DeserializationExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("person.ser");ObjectInputStream ois = new ObjectInputStream(fis)) {Person person = (Person) ois.readObject();System.out.println("Name: " + person.name);System.out.println("Age: " + person.age);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

序列化与反序列化的表格总结

概念描述示例
序列化将对象转换为字节流并写到文件或网络中ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.ser")); oos.writeObject(object);
反序列化将字节流转换为对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.ser")); Object obj = ois.readObject();
必需接口需要实现 Serializable 接口class Person implements Serializable { ... }
序列化ID建议定义 serialVersionUID 字段应避免反序列化不兼容private static final long serialVersionUID = 1L;

新的I/O (NIO)

Java的新的I/O(NIO)引入了多个新概念,如缓冲区、通道和选择器。这些概念提供了更高效的I/O处理,特别是在处理大数据和高性能网络应用方面。下面我们将详细介绍这些概念。

缓冲区(Buffer)

缓冲区是NIO数据操作的基础,用于存储和操作数据。Java NIO提供了多种类型的缓冲区,比如ByteBufferCharBuffer等。

示例:使用ByteBuffer

import java.nio.ByteBuffer;public class BufferExample {public static void main(String[] args) {// 创建一个大小为10的字节缓冲区ByteBuffer buffer = ByteBuffer.allocate(10);// 写入数据到缓冲区buffer.put((byte) 1);buffer.put((byte) 2);// 切换到读模式buffer.flip();// 读取缓冲区中的数据while (buffer.hasRemaining()) {byte data = buffer.get();System.out.println(data);}}
}

通道(Channel)

通道是一个连接数据源和缓冲区的通道,数据可以通过通道从数据源读入缓冲区,或从缓冲区写入到数据源。常用的通道有FileChannelSocketChannelServerSocketChannel等。

示例:使用FileChannel

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;public class ChannelExample {public static void main(String[] args) {// 文件路径Path path = Path.of("example.txt");// 使用文件通道写入数据try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {ByteBuffer buffer = ByteBuffer.allocate(64);buffer.put("Hello, NIO!".getBytes());buffer.flip();fileChannel.write(buffer);} catch (IOException e) {e.printStackTrace();}// 使用文件通道读取数据try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) {ByteBuffer buffer = ByteBuffer.allocate(64);fileChannel.read(buffer);buffer.flip();while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}} catch (IOException e) {e.printStackTrace();}}
}

选择器(Selector)

选择器是NIO中的多路复用器,可以用于管理多个通道,特别适用于网络编程。SelectorSelectableChannel配合使用,可以高效地处理非阻塞I/O操作。

示例:使用Selector进行非阻塞I/O

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;public class SelectorExample {public static void main(String[] args) {try {// 打开选择器Selector selector = Selector.open();// 打开服务器套接字通道ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.socket().bind(new InetSocketAddress(8080));serverSocketChannel.configureBlocking(false);// 将通道注册到选择器,并监听接受事件serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);// 循环等待事件while (true) {selector.select();Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectedKeys.iterator();while (iterator.hasNext()) {SelectionKey key = iterator.next();iterator.remove();if (key.isAcceptable()) {// 接受新连接ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();SocketChannel socketChannel = serverChannel.accept();socketChannel.configureBlocking(false);socketChannel.register(selector, SelectionKey.OP_READ);} else if (key.isReadable()) {// 读取数据SocketChannel socketChannel = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(256);socketChannel.read(buffer);buffer.flip();System.out.println("Received: " + new String(buffer.array()).trim());}}}} catch (IOException e) {e.printStackTrace();}}
}

NIO关键概念表格总结

概念描述示例
缓冲区(Buffer)用于存储数据的容器,可以是字节、字符、短整型等ByteBuffer buffer = ByteBuffer.allocate(10);
通道(Channel)用于连接数据源与缓冲区,实现I/O操作FileChannel.open(path, StandardOpenOption.READ);
选择器(Selector)用于管理多个通道,实现非阻塞I/O的多路复用Selector.open(); selector.select();

表格总结

文件与目录操作方法表

方法描述示例
createNewFile()创建一个新的文件file.createNewFile();
delete()删除文件或目录file.delete();
exists()判断文件或目录是否存在file.exists();
getAbsolutePath()获取文件的绝对路径file.getAbsolutePath();
canWrite()判断文件是否可写file.canWrite();
canRead()判断文件是否可读file.canRead();
length()获取文件大小(字节)file.length();

字符流和字节流的比较表

特性字节流字符流
基本类InputStream 和 OutputStreamReader 和 Writer
数据处理单位字节(8位)字符(16位)
适用场景二进制数据(如图像、音频)文本数据(如文本文件)
典型实现类FileInputStreamFileOutputStreamFileReaderFileWriter

序列化与反序列化的表格总结

概念描述示例
序列化将对象转换为字节流并写到文件或网络中ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.ser")); oos.writeObject(object);
反序列化将字节流转换为对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.ser")); Object obj = ois.readObject();
必需接口需要实现 Serializable 接口class Person implements Serializable { ... }
序列化ID建议定义 serialVersionUID 字段以避免反序列化不兼容private static final long serialVersionUID = 1L;

NIO关键概念表格总结

概念描述示例
缓冲区(Buffer)用于存储数据的容器,可以是字节、字符、短整型等ByteBuffer buffer = ByteBuffer.allocate(10);
通道(Channel)用于连接数据源与缓冲区,实现I/O操作FileChannel.open(path, StandardOpenOption.READ);
选择器(Selector)用于管理多个通道,实现非阻塞I/O的多路复用Selector.open(); selector.select();

总结

本文详细介绍了Java I/O操作,包括文件和目录操作、字符流与字节流的区别、序列化与反序列化、新的I/O(NIO)等内容。通过示例代码和表格总结,帮助您更好地理解和应用Java中的I/O操作,提高程序的读取和写入效率。

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

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

相关文章

FPGA专项课程即将开课,颁发AMD官方证书

社区成立以来&#xff0c;一直致力于为广大工程师提供优质的技术培训和资源&#xff0c;得到了众多用户的喜爱与支持。为了满足用户需求&#xff0c;我们特别推出了“基于Vitis HLS的高层次综合及图像处理开发”课程。 本次课程旨在帮助企业工程师掌握前沿的FPGA技术&#xff…

携程任我行礼品卡怎么用?

前两天我用积分兑了张携程卡&#xff0c;但是最近有没有假期&#xff0c;这张携程卡又不知道咋用 最后朋友告诉我可以在收卡云上转让&#xff0c; 去收卡云看了一眼&#xff0c;携程卡现在99.1折&#xff0c;果断出了&#xff0c;到账速度好快啊

Java多线程编程与并发处理

引言 在现代编程中&#xff0c;多线程和并发处理是提高程序运行效率和资源利用率的重要方法。Java提供了丰富的多线程编程支持&#xff0c;包括线程的创建与生命周期管理、线程同步与锁机制、并发库和高级并发工具等。本文将详细介绍这些内容&#xff0c;并通过表格进行总结和…

IntelliJ IDEA 用maven创建web项目

前言 已经安装并配置好Tomcat。具体步骤&#xff1a;Tomcat安装及环境变量配置(一看就会)-CSDN博客​编辑https://blog.csdn.net/longyongyyds/article/details/135825647 具体步骤 1.新建一个maven项目 2&#xff0c;配置好tomcat服务器 3.运行测试一下 maven教程&#xf…

使用PHP对接企业微信审批接口的流程和基本接口(一)

在现代企业中&#xff0c;审批流程是非常重要的一环&#xff0c;它涉及到企业内部各种业务流程的规范和高效运转。而随着企业微信的流行&#xff0c;许多企业希望将审批流程整合到企业微信中&#xff0c;以实现更便捷的审批操作。本文将介绍如何使用PHP对接企业微信审批接口&am…

鸿蒙轻内核A核源码分析系列四(3) 虚拟内存

4.2 函数LOS_RegionAlloc 函数LOS_RegionAlloc用于从地址空间中申请空闲的虚拟地址区间。参数较多&#xff0c;LosVmSpace *vmSpace指定虚拟地址空间&#xff0c;VADDR_T vaddr指定虚拟地址&#xff0c;当为空时&#xff0c;从映射区申请虚拟地址&#xff1b;当不为空时&#…

WebSocket 详解--spring boot简单使用案例

一、什么是WebSocket WebSocket 是一种网络通信协议&#xff0c;专为在单个 TCP 连接上进行全双工通信而设计。WebSocket 允许客户端和服务器之间的消息能够实时双向传输。这与传统的 HTTP 请求-响应模式有很大的不同。 二、WebSocket 的关键特性 双向通信&#xff1a;WebSocke…

【StableDiffusion】Prompts 提示词语法;高阶用法;写作顺序是什么,先写什么后写什么

Prompt 写作顺序 第一步&#xff1a;画质词画风词 第一步先写“画质词”和“画风词” 画质词如下&#xff1a; 画风词如下&#xff1a; 第二步&#xff1a;画面主体描述 人物性别、年龄、发型、发色、情绪表情、衣服款式、衣服颜色、动作、饰品、身材、五官微调 第三步&…

多表联查小情景例子

这里有个需求&#xff1a; 需要给定套餐表setmeal 的 id 查询这个套餐内的所有菜品 dish 实际上如果可能&#xff0c;只需要查询套餐菜品表(setmeal_dish)&#xff0c;查看一个套餐内包含包含的所有菜品&#xff0c;然后把这些菜品全部取出即可。 看一下setmeal_dish 表&…

ZnO电阻片在低电场区域的泄漏电流及其电阻的负温度系数

在低电场区域,流过ZnO非线性电阻的泄漏电流小于1mA.泄漏电流不仅与施加的电压幅值有关,而且与温度高低有关。图2.6表示温度对泄漏电流的影响,温度越高,电子在电场作用下定向的运动就越激烈,导致泄漏电流增大。因此温度升高将导致电阳值下降,即ZnO 电阻呈现负温度特性。 一般以…

centos下创建raid6磁盘阵列

在CentOS系统中创建RAID 6阵列&#xff0c;可以使用mdadm工具。 以下是创建RAID 6阵列的基本步骤和示例代码&#xff1a; 安装mdadm工具&#xff08;如果尚未安装&#xff09;&#xff1a; sudo yum install mdadm 假设你有至少四个以上的磁盘设备&#xff08;例如 /dev/sdi…

STM32存储左右互搏 模拟U盘桥接SPI总线FATS读写FLASH W25QXX

STM32存储左右互搏 模拟U盘桥接SPI总线FATS读写FLASH W25QXX STM32的USB接口可以模拟成为U盘&#xff0c;通过FATS文件系统对连接的存储单元进行U盘方式的读写。 这里介绍STM32CUBEIDE开发平台HAL库模拟U盘桥接SPI总线FATS读写W25Q各型号FLASH的例程。 FLASH是常用的一种非易失…

maven archetype项目构架

1、设置环境变量 set MAVEN_HOMED:\SF\java\apache-maven-3.6.3 set path%path%;%MAVEN_HOME%\bin;2、制作archetype mvn -s "D:\SF\java\apache-maven-3.6.3\conf\settings.xml" archetype:create-from-project -DpackageNamecom.demo.esb-s:指定maven的setting文…

LeetCode | 28.找出字符串中第一个匹配项的下标 KMP

这是字符串匹配问题&#xff0c;朴素做法是两重遍历&#xff0c;依次从主串的i位置开始查看是否和模式串匹配&#xff0c;若不匹配就换下一个位置进行判断&#xff0c;直到找到或者遍历完&#xff0c;时间复杂度 O ( m n ) O(m \times n) O(mn) 还可以对主串进行处理&#xff…

vue.js+node.js+mysql在线聊天室源码

vue.jsnode.jsmysql在线聊天室源码 技术栈&#xff1a;vue.jsElement UInode.jssocket.iomysql vue.jsnode.jsmysql在线聊天室源码

单例模式、工厂模式 c++关键字 static

static 关键字的作用&#xff1a; 主要作用在于 控制变量或函数的作用域、生命周期以及它们如何被不同部分的程序访问&#xff0c;从而帮助程序员管理内存、避免命名冲突&#xff0c;并实现特定的设计模式&#xff08;如单例模式&#xff09;。 1. 静态局部变量&#xff1a;当…

区间预测 | Matlab实现EVO-CNN-SVM能量谷算法优化卷积神经网络支持向量机结合核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现EVO-CNN-SVM能量谷算法优化卷积神经网络支持向量机结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现EVO-CNN-SVM能量谷算法优化卷积神经网络支持向量机结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资…

5.3 Python 闭包函数,递归函数,匿名函数

1. 函数对象 Python中所有的数据都是对象, 函数的值也是一个对象, 通过函数名获取函数对象. 使用函数名也就是使用函数对象, 函数对象加上括号立刻执行函数体代码块. 函数名的其它作用: * 1. 函数名可以作为其它变量的值. * 2. 函数名可以作为其它函数的参数. * 3. 函数名可以…

搜索与图论:染色法判别二分图

搜索与图论&#xff1a;染色法判别二分图 题目描述参考代码 题目描述 输入样例 4 4 1 3 1 4 2 3 2 4输出样例 Yes参考代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010, M 200010;int n, m; i…