首页 > 编程语言 >Java I/O (Input/Output)——文件字节流

Java I/O (Input/Output)——文件字节流

时间:2024-09-06 12:53:07浏览次数:5  
标签:文件 Java 读取 new try Output FileInputStream Input CPU

Java I/O 简介

       Java I/O(输入/输出)是 Java 程序中用于处理数据输入和输出的重要部分。


输入流(Input Streams):用于从数据源读取数据。常见的输入流包括FileInputStream(从文件读取)、BufferedInputStream(提高读取效率)等。


输出流(Output Streams):用于将数据写入到目的地。例如FileOutputStream(向文件写入)、BufferedOutputStream(提高写入效率)。


字符流(Reader 和 Writer):处理字符数据,更适合处理文本。如FileReader和FileWriter。


缓冲流(Buffered Streams):通过缓冲区来减少实际的 I/O 操作次数,提高性能。


对象流(Object Streams):用于实现对象的序列化和反序列化,如ObjectInputStream和ObjectOutputStream。


       在实际编程中,根据具体的需求选择合适的 I/O 流可以提高程序的效率和可读性。


计算机总线结构:  

       那么为什么会有I/O呢?其实I/O无时无刻不在我们身边,比如读取硬盘上的文件,网络文件的传输,鼠标键盘输入,也可以是接受单片机发回的数据,而能够支持这些操作的设备就是I/O设备。


我们可以大致看一下整个计算机的总线结构:




       最核心的是CPU,CPU像计算机的大脑一样,是计算机的核心部件,几乎所有的计算都是靠这个CPU来进行的,CPU懂的比较多,它可以对各种类型进行计算,但是随着时代的发展对图形的要求越来越高,CPU就略显乏力;于是就出现了GPU(显卡),显卡就是专门对于图形进行计算。


       通过北桥芯片连接到内存,这样CPU就可以对内存进行操作;南桥芯片是用于读取U盘或者硬盘内的数据 。


       常见的I/O设备一般是鼠标、键盘这类通过USB进行传输的外设或者是通过Sata接口或是M.2连接的硬盘。一般情况下,这些设备是由CPU发出指令通过南桥芯片间接进行控制,而不是由CPU直接操作。


       而我们在程序中,想要读取这些外部连接的!O设备中的内容,就需要将数据传输到内存中。而需要实现这样的操作,单单凭借一个小的程序是无法做到的,而操作系统(如:Windows/inux/MacOS)就是专门用于控制和管理计算机硬件和软件资源的软件,我们需要读取一个IO设备的内容时,就可以向操作系统发出请求,由操作系统帮助我们来和底层的硬件交互以完成我们的读取/写入请求。


       JDK提供了一套用于IO操作的框架,为了方便我们开发者使用,就定义了一个像水流一样,根据流的传输方向和读取单位,分为字节流InputStream和OutputStream以及字符流Reader和Writer的IO框架,当然,这里的流指的是数据流,通过流,我们就可以一直从流中读取数据,直到读取到尽头,或是不断向其中写入数据,直到我们写入完成,而这类IO就是我们所说的BIO。


文件字节流:

       字节流一次读取一个字节,也就是一个 byte 的大小,而字符流顾名思义,就是一次读取一个字符,也就是一个 char 的大小(在读取纯文本文件的时候更加适合)。


文件输入流:

在 Java 中,文件输入流(FileInputStream)用于从文件中读取数据。FileInputStream 允许程序以字节为单位读取文件的内容。


创建方式:

通常通过指定要读取的文件路径来创建文件输入流对象。例如:


try {

   FileInputStream fis = new FileInputStream("your_file_path");

   // 后续的读取操作

} catch (FileNotFoundException e) {

   e.printStackTrace();

}

       但是这种方式需要处理各种可能的异常,比如 FileNotFoundException 异常和 IOException 异常,并且需要手动关闭文件,完整代码如下:


public class Hello_World {

   public static void main(String[] args) { // 想读取一个文件  创建一个文件输入流   使用完把流关闭掉 释放掉 close

       FileInputStream stream = null;

       try {

           stream = new FileInputStream("绝对路径/相对路径");

//            stream.close();

       } catch (FileNotFoundException e) {

           throw new RuntimeException(e);

       } finally {

           if (stream != null) {

               try {

                   stream.close();

               } catch (IOException e) {

                   throw new RuntimeException(e);

               }

           }

       }

   }

}

       仅仅是取得文件就如此费劲,不合乎常理。所以有了try-with-resources 语句这种简便方式,try-with-resources 语句是一种用于更方便、更安全地管理资源(如输入流、输出流、数据库连接等)的机制。


优点:


自动资源管理:无需显式地调用 close 方法来关闭资源,避免了因忘记关闭资源而导致的资源泄漏问题。

简洁的代码:减少了样板代码,使代码更简洁、更易读。

语法格式:


try (Resource res = new Resource()) {

   // 使用资源的操作

} catch (Exception e) {

   // 异常处理

}

       对于以上示例的完整代码转成try-with-resources 语句如下:


public class Hello_World {

   public static void main(String[] args) {

       try(FileInputStream inputStream = new FileInputStream("路径")){ // 直接在try()中定义要在完成之后释放的资源

       } catch (IOException e){ // 这里变成IOException是因为调用close()可能会出现,而FileNotFoundException是继承自IOException的

           e.printStackTrace();

       }// 无需再编写finally语句块,因为在最后自动帮我们调用了close()。

   }

}

       由此可见,try-with-resources 语句极大地提高了资源管理的便利性和可靠性,使代码更加健壮和易于维护。


标签:文件,Java,读取,new,try,Output,FileInputStream,Input,CPU
From: https://blog.51cto.com/u_16270511/11937313

相关文章

  • Java数据结构---Queue
    队列Queue队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。入队列(Enqueue):进行插入操作的一端称为队尾出队列(Dequeue):进行删除操作的一端称为队头队列具有先进先出的特性大家可以简单理解为日常生活中“排队”这一现象。队列的模拟实现简单想一想,因为Lin......
  • Java中如何实现minio文件上传
    一、导入minio依赖这里还要导入lombok是因为在MinIOConfig类中使用了@Data注解,正常来说导入minio依赖就够了<dependency>   <groupId>io.minio</groupId>   <artifactId>minio</artifactId>   <version>7.1.0</version> </dependency><dependency......
  • 从内存层面分析Java 参数传递机制
    在Java中,理解参数传递机制对于编写高效和可维护的代码至关重要。本文将探讨基本数据类型和引用数据类型的参数传递方式,并介绍System.identityHashCode方法及其作用。我们将结合栈帧的概念,通过示例代码来详细解释这些机制。System.identityHashCode的作用System.ident......
  • SSH框架整合实现Java三层架构实例(一)
    HTML前台发送请求代码:1<tr>2<td>选择收派时间</td>3<td>4<inputtype="text"name="takeTimeId"class="easyui-combobox"required="true"5data-options="url:'../........
  • Java静态代码块、构造代码块执行顺序问题
    packagecom.zxl.staticdemo;publicclassBlockTest{static{System.out.println("BlockTest静态代码块执行");}{System.out.println("BlockTest构造代码块执行");}publicBlockTest(){System.out.......
  • [Java基础]hashcode/equals
    hashcode()/equals()/====当==左右两边是基本类型的时候,比较的是数值是否相等;当==左右两边是对象(引用)类型的时候,比较的是p和p2这两个对象所指向的堆中的对象地址对于==来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是......
  • Java中实现对象和Map之间的转换
    在Java开发中,经常需要将Java对象转换成Map,或者反过来将Map转换成Java对象。这种转换在很多场景下都非常有用,比如在序列化和反序列化过程中、在数据传输和持久化时、或者在进行对象属性的批量操作时。本文将介绍几种不同的方法来实现Java对象和Map之间的相互转换,选择哪种方法取......
  • 基于JAVA 小程序 旅游推荐管理系统,旅行系统
    目录一.研究目的二.系统分析三.系统流程和逻辑四.数据库设计五.页面展示六.源码获取一.研究目的随着互联网技术的快速发展,网络时代的到来,网络信息也将会改变当今社会。各行各业在日常企业经营管理等方面也在慢慢的向规范化和网络化趋势汇合。旅游社交小程序的信息化......
  • JavaScript 中 structuredClone 和 JSON.parse(JSON.stringify()) 克隆对象的区别
    JavaScript中structuredClone和JSON.parse(JSON.stringify())克隆对象的异同点一、什么是structuredClone?1.structuredClone的发展structuredClone是在ECMAScript2021(ES12)标准中引入的,ECMAScript2021规范正式发布于2021年6月自2022年3月起,该功能适用于最......
  • 【Java】【SpringBoot】yml配置文件解析
    yml的常见配置可以详见官方文档。https://docs.spring.io/spring-boot/appendix/application-properties/index.html#appendix.application-properties.server服务器配置server:port:8080#端口servlet:context-path:/#应用程序上下文路径【设置访问路径前缀......