Java IO 操作——个人理解

2024-09-09 04:38
文章标签 java 操作 理解 个人 io

本文主要是介绍Java IO 操作——个人理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。
首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。

    

 

 

数据来源的操作:

来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。

  

 File file = new File("path");

 

字节操作:

将数据从最原始状态转换为字节流。当然要提供字节操作。使用类 InputStream FileInputStreamBufferedInputStream。Java I/O 使用了装饰者模式来实现。以 InputStream 为例,InputStream 是抽象组件,FileInputStream 是 InputStream 的子类,属于具体组件,提供了字节流的输入操作。FilterInputStream 属于抽象装饰者,装饰者用于装饰组件,为组件提供额外的功能,例如 BufferedInputStream 为 FileInputStream 提供缓存的功能。
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

 

字符操作:

来源于上一层,字节流。 InputStreamReader 实现从文本文件的字节流解码成字符流;OutputStreamWriter 实现字符流编码成为文本文件的字节流。它们继承自 Reader 和 Writer。这里操作的是,字节流到字符流之间的转换。
InputStreamReader reader = new InputStreamReader(bis);

 

这里有个问题,字节转字符时,字符是有不同编码的。
GBK 编码中,中文占 2 个字节,英文占 1 个字节;UTF-8 编码中,中文占 3 个字节,英文占 1 个字节;Java 使用双字节编码 UTF-16be,中文和英文都占 2 个字节。
编码就是把字符转换为字节,而解码是把字节重新组合成字符
如果编码和解码过程使用不同的编码方式那么就出现了乱码。
          FileInputStream input=new FileInputStream(file);BufferedInputStream  bis=new BufferedInputStream(input);byte[] byteArray=new byte[1024];int tmp;StringBuilder strBuild=new StringBuilder();while((tmp=bis.read(byteArray))!=-1){strBuild.append(new String (byteArray,0,tmp,"UTF-8"));//设置字符编码 解码}System.out.println(strBuild);
          BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));InputStreamReader reader = new InputStreamReader(bis,"UTF-8");//设置字符编码 String str = "";int ch;while ((ch = reader.read() )!= -1){str +=(char)ch;//解码}System.out.println(str);

对象操作:

序列化就是将一个对象转换成字节序列,方便存储和传输。

序列化:ObjectOutputStream.writeObject()

反序列化:ObjectInputStream.readObject()

序列化的类需要实现 Serializable 接口,它只是一个标准,没有任何方法需要实现。

transient 关键字可以使一些属性不会被序列化。

ArrayList 序列化和反序列化的实现 :ArrayList 中存储数据的数组是用 transient 修饰的,因为这个数组是动态扩展的,并不是所有的空间都被使用,因此就不需要所有的内容都被序列化。通过重写序列化和反序列化方法,使得可以只序列化数组中有内容的那部分数据。

总结:

Java中io操作,使用数据流操作时,思路为,先将文件流转为字节流,再将字节流转换为字符流,或者对象。也就不难理解代码的过程,不同的工具类操作不同数据对象的结果。
因为字节的操作是单个字节,为了弥补高速和面向块的操作,Java还提供了 新的输入/输出 (NIO) 。(资料)
https://developer.ibm.com/zh/articles/j-lo-javaio/

 

这篇关于Java IO 操作——个人理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150182

相关文章

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD