java中的IO流

简介: java中的IO流

java中的IO流 讲解超详细版

一、初始IO流

1.输入输出是任何程序设计语言都提供的功能,java语言从一开始就支持IO,最初是 通过java.io.*包中的类和接口提供的。

2.IO流中的 I:input;O :output ;流:stream

3.IO流的分类

第一种方式:以内存或者程序作为参考:将磁盘(硬盘)上的文件读入(输入)内存(程序)中的流就叫输入流,或者叫read;从内存或者程序中出来的就叫输出流,或者叫write。

第二种方式:按照数据的类型分,数据流又可以分为二进制流和文本流,其中二进制流也被称为字节流,一次读入一个字节,也就是8个比特位(一次读入8个二进制),这种流是万能的什么流都可以读取,包括文本文件、图像、音频和视频文件等等…。文本流也被称为字符流,这种流一次读取一个字符,这种流是针对文本文件存在的,不能读取图片、音频和视频等文件只能读取纯文本文件,文件扩展名为.txt,连word文件也不能读取。它们处理信息的基本单位分别是字节和字符。

假设文件file1.txt 中有 a中国bc

采用字节流的方式去读:

第一次读:读一个字节,正好读到’a’

第二次读:读一个字节,正好读到’中’的一半

第三次读:读一个字节,正好读到’中’的另一半

采用字符流的方式去读:

第一次读:读一个字符’a’字符('a’字符在windows系统中占用一个字节)

第二次读:'中’字读('中’字符在windows系统中占两个字节)

注意:

在Windows系统中,一个字母通常占用1个字节,使用ASCII编码表示,包括英文字母和一些常见的符号。而一个汉字在Windows系统中通常占用2个字节,使用UTF-16编码表示。UTF-16编码使用16位表示字符,对于基本的拉丁字符(如英文字母)和常见的汉字,每个字符通常占用2个字节。

Java 使用 Unicode 字符集来表示字符,而 Unicode 采用了变长编码方案,其中基本的拉丁字符和常见的汉字等字符通常使用 2 个字节(16位)表示。因此,在 Java 中,无论是一个字母还是一个汉字,字符类型 char 都占用 2 个字节。

  • IO流原理的初步图形化认识

java中IO流的基本原理:

二、java中需要重点掌握的java.io.*包中的流

有十六个:

文件专属:(可以观察出文件专属的输入输出流的类名都有File)

java.io.FileInputStream (字节流/输入流)

java.io.FileOutputStream (字节流/输出流)

java.io.FileReader (字符流/输入流)

java.io.FileWriter (字符流/输出流)

转换流(将字节转换成字符流)

java.io.InputStreamReader (以reader为后缀属于字符流/输入流)

java.io.OutputStreamWriter (以writer为后缀属于字符流/输出流)

缓冲流专属: (buffered 翻译为 adj.缓冲的,v.缓冲 ,buffer的过去分词 )

java.io.BufferedReader 字符流/输入流

java.io.BufferedWriter 字符流/输出流

java.io.BufferedInputStream 字节流/输入流

java.io.BufferedOutputStream 字节流/输出流

数据流专属:

java.io.DateInputStream (字节流/输入流)

java.io.DateOutputStream (字节流/输出流)

标准输出流:

java.io.PrintWriter (字符流)

java.io.PrintStream (字节流)

三、输入输出流分别实现什么接口?有什么特点?

1、在 Java 的 java.io 包中,几乎所有的输入和输出流都实现了 Closeable 接口或其子接口 AutoCloseable。这意味着这些流都具有关闭功能,并且可以使用 close 方法来显式关闭流。

在使用流时,特别是对于涉及到底层资源(如文件、网络连接等)的流,最好在使用完毕后显式地调用 close 方法来关闭流,以确保资源的正确释放和回收。通常会使用 try-with-resources 语句块来自动关闭流,该语句块会在代码执行完毕或发生异常时自动关闭流,无需手动调用 close 方法。

需要注意的是,并非所有的流都是可关闭的。一些特殊的流,如 ByteArrayInputStreamByteArrayOutputStream 等内存流,不会占用底层资源,因此不需要显式地关闭。此外,一些流实现类可能会在其内部自动关闭底层资源,无需用户手动操作。

2、关闭流的原因

  • 资源回收:许多流操作会涉及底层资源,如文件、网络连接、数据库连接等。关闭流可以确保这些资源在使用完毕后被及时释放,避免资源泄漏和浪费。
  • 数据完整性:某些流操作可能需要将数据缓冲或刷新到目标位置,例如将数据写入文件或发送到网络。在关闭流之前,通过调用相应的刷新方法,可以确保数据被正确写入或发送,避免数据丢失或不完整。
  • 避免文件锁定:在某些情况下,如果流没有被关闭,底层资源(如文件)可能会保持锁定状态,这可能导致其他进程无法访问或修改该资源。通过关闭流,可以释放对资源的锁定,使其它进程能够正常操作相关文件或资源。
  • 提高性能:打开的流可能占用系统资源,如果不关闭它们,会导致资源的浪费和系统负担。通过及时关闭流,可以释放这些资源,提高系统性能和效率。
    关闭流是一种良好的编程习惯,可以保证资源的正确释放和回收,确保数据的完整性,避免文件锁定问题,并提高系统性能。尽量在不需要使用流时及时关闭,可以使用try-with-resources语句块自动关闭流,或者在适当的地方显式调用流的close方法来关闭流。
目录
相关文章
|
11天前
|
Oracle NoSQL 关系型数据库
实时计算 Flink版操作报错之报错:java.lang.ClassNotFoundException: io.debezium.connector.common.RelationalBaseSourceConnector,如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
3天前
|
存储 Java API
Java语言IO(输入/输出)编程技术深度解析
Java语言IO(输入/输出)编程技术深度解析
|
4天前
|
存储 监控 Java
Java nio非阻塞io
Java nio非阻塞io
|
7天前
|
存储 Java API
Java IO流
Java IO流
23 2
|
10天前
|
存储 Java
Java IO流:深入解析与技术应用
Java IO流:深入解析与技术应用
257 1
|
11天前
|
存储 Java 编译器
Java文件IO操作基础
Java文件IO操作基础
8 0
|
12天前
|
存储 Java API
【JAVA学习之路 | 进阶篇】IO流及流的分类
【JAVA学习之路 | 进阶篇】IO流及流的分类
|
19天前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
19 2
|
19天前
|
Java 开发者
Java一分钟之-Java IO流:文件读写基础
【5月更文挑战第10天】本文介绍了Java IO流在文件读写中的应用,包括`FileInputStream`和`FileOutputStream`用于字节流操作,`BufferedReader`和`PrintWriter`用于字符流。通过代码示例展示了如何读取和写入文件,强调了常见问题如未关闭流、文件路径、编码、权限和异常处理,并提供了追加写入与读取的示例。理解这些基础知识和注意事项能帮助开发者编写更可靠的程序。
27 0
|
19天前
|
存储 缓存 Java
Java IO 流详解
Java IO 流详解
19 1