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方法来关闭流。
目录
相关文章
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
67 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
1月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
35 1
|
1月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
76 1
|
30天前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
46 0
|
2月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
1月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
35 0
|
2月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
3月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
46 2