JAVA_18
1.IO流
- IO流(Input/Output stream)是用于在程序和外部设备(如文件、网络等)之间进行数据传输的机制。它是Java中处理输入和输出操作的一种抽象方式。
- 概念:
输入流(Input Stream):用于从外部设备(如文件、网络等)读取数据到程序中的
流。
输出流(Output Stream):用于将程序中的数据写入外部设备(如文件、网络等)的流。 - 作用:
通过使用IO流,程序可以与外部环境进行数据交换,从而实现数据的读取和写入。
IO流提供了一种统一的方式来处理不同类型的数据源和目标,使得程序的编写更加灵活和可扩展。
IO流可以处理各种不同类型的数据,包括文本、二进制、对象等。
IO流提供了一些高级功能,如缓冲、字符编码转换、对象序列化等,使数据传输更高效、安全和可靠。 - 在Java中,IO流分为字节流和字符流两种类型。
字节流:字节流以字节为单位进行数据传输。它们适用于处理二进制数据(如图像、音频等)或与外部设备进行底层交互(如读写文件、网络通信)。
字符流:字符流以字符为单位进行数据传输。它们适用于处理文本数据,提供了更方便的字符处理方法,可以自动进行字符编码转换。 - Java提供了一组I0流类来处理不同的输入和输出需求,例如:
字节流:InputStream、OutputStream、FilelnputStream、FileOutputStream等。
字符流:Reader、Writer、FileReader、FileWriter等。 - 通过使用这些类,可以实现从文件读取数据、向文件写入数据、与网络进行数据交互等操作。
总而言之,IO流在Java中扮演着重要的角色,它们提供了一种方便、灵活和可靠的方式来处理输入和输出操作,使得Java程序可以与外部环境进行数据交换和通信。
2.JAVA_IO流
- 在Java中,IO流根据数据的类型进行分类,主要分为字节流(ByteStreams)和字符流(Character Streams)。
字节流(Byte Streams):字节输入流(InputStream):用于从数据源(如文件、网络)读取字节数据。它以字节为单位进行读取,适用于处理二进制数据(如图像、音频等)或与底层设备进行交瓦。
字节输出流(OutputStream):用于将字节数据写入目标(如文件、网络)。它以字节为单位进行写入,适用于向文件或网络发送二进制数据。@字符流(Character Streams):
字符输入流(Reader):用于从数据源读取字符数据,并提供字符处理的能力。它
以字符为单位进行读取,适用于处理文本数据。
字符输出流(Writer):用于将字符数据写入目标,并提供字符处理的能力。它以字符为单位进行写入,适用于向文件或网络发送文本数据。
字节流和字符流的区别在于处理的数据类型和提供的功能。字节流以字节为单位进行读取和写入,适用于处理二进制数据和底层设备交豆。字符流以字符为单位进行读取和写入,提供了更方便的字符处理方法,适用于处理文本数据。
在使用IO流时需要根据数据的特性选择合适的流类型。如果处理的是二进制数据,如图像或音频文件,则使用字节流。如果处理的是文本数据,如读取文本文件或与用户交互,则使用字符流。
Java提供了一系列字节流和字符流的类,如FilelnputStream、FileOutputStream、FileReader、FileWriter等,开发者可以根据需求选择合适的流类进行数据的读取和写入操作。此外,还可以通过转换流(如InputStreamReader和OutputStreamWriter)在字节流和字符流之间进行转换。
2. 字节流与字符流
InputStream和OutputStream是Java中用于处理字节流的抽象类。它们提供了一组用于读取和写入字节数据的方法。下面详细介绍这两个类的使用:
① InputStream类:
InputStream是抽象类,不能直接实例化,但有许多具体的子类可用。
常见的InputStream子类包括FileInputStream(从文件读取)ByteArrayInputStream(从字节数组读取)、SocketlnputStream(从网络套接字读取)等。
通过调用子类的构造函数,可以创建相应的InputStream对象。Inputstream提供了以下常用方法:
int read():从流中读取一个字节数据,并返回读取的字节值(0-255),若已到达流的未尾,则返回-1。
intreadlbyte[] bufen) :从流中最多读取buffer长度的字节数据,并将其存储到给定的字节数组中,返回实际读取的字节数。
void close0 :关闭流并释放相关的系统资源。
② OutputStream类:
OutputStream也是抽象类,不能直接实例化,但有多个具体的子类可用。
常见的OutputStream子类包括FileOutputStream(写入文件)ByteArrayOutputStream(写入字节数组)SocketOutputStream(写入网络套接字)等。
通过调用子类的构造函数,可以创建相应的OutputStream对象。
OutputStream提供了以下常用方法
void write(intb):将指定的字节写入流中。
void write(byteūbufer):将给定字节数组中的数据写入流中。
void close(): 关闭流并释放相关的系统资源。
void nush0: 刷新流,将缓冲区中的数据立即写入目标。
请注意,在使用InputStream和OutputStream时,需要正确处理I0异常并在不再需要流时及时关闭流以释放资源。为了确保流的自动关闭,可以使用Java 7引入的try-with-resources语句,它会自动处理资源的关闭操作。
3. Reader和Writer类的功能和用法
Reader和Writer是]ava中用于处理字符流的抽象类。它们提供了一组用于读取和写入字符数据的方法。下面详细介绍这两个类的功能和用法
① Reader类:
Reader是抽象类,不能直接实例化,但有多个具体的子类可用。
常见的Reader子类包括FileReader(从文件读取字符数据)、StringReader(从字符串读取字符数据)、BufferedReader(提供缓冲功能)、InputStreamReader(将字节流转换为字符流)等。
通过调用子类的构造函数,可以创建相应的Reader对象。
Reader提供了以下常用方法:
int read():从流中读取一个字符,并返回读取的字符的Unicode值,若已到达流的末尾,则返回-1。
int read(char[] bufen):从流中最多读取buffer长度的字符数据,并将其存储到给定的字符数组中,返回实际读取的字符数。
void close():关闭流并释放相关的系统资源,
② Writer类:
Writer也是抽象类,不能直接实例化,但有多个具体的子类可用。
常见的Writer子类包括FileWriter(写入文件)、StringWriter(写入字符串)、BufferedWriter(提供缓冲功能)、OutputStreamWriter(将字节流转换为字符流)等。
通过调用子类的构造函数,可以创建相应的Writer对象。
Writer提供了以下常用方法:
void write(int c):将指定的字符写入流中。
void write(char[] buffer):将给定字符数组中的数据写入流中
void write(String data):将给定字符串写入流中。
void close():关闭流并释放相关的系统资源。
void flush():刷新流,将缓冲区中的数据立即写入目标。
同样地,在使用Reader和Writer时,需要正确处理I0异常并在不再需要流时及时关闭流以释放资源。也可以使用try-with-resources语句来自动关闭流。
值得注意的是,Reader和Writer处理的是字符数据,因此适用于处理文本文件或与用户交互的场景,而不适用于处理二进制数据。如果需要处理二进制数据,请使用InputStream和OutputStream类。
3. 文件读写
在Java中,可以使用File类来创建和删除文件。
BufferedInputStream和BufferedOutputStream类的优势
BufferedInputStream和BufferedOutputStream是Java中用于提供缓冲功能的流类,它们是对InputStream和OutputStream的包装。它们具有以下优势:
① 提高读写效率:BufferedInputStream和BufferedOutputStream使用内部缓冲区,可以减少与底层输入输出流的直接交互次数,从而提高读写效率。相对于直接使用底层流,使用缓冲流可以减少对底层存储设备的频繁访问,减少读写操作的开销。
② 减少系统调用次数:缓冲流在底层流的基础上引入了缓冲区,可以一次性读取或写入较大的数据块。这减少了底层系统调用的次数,降低了系统开销,提高了读写性能。
③ 自动缓冲处理:BufferedlnputStream和BufferedOutputStream类自动处理数据的缓冲,无需手动管理缓冲区。它们提供了一组读写方法,将数据从底层流读入缓冲区或将数据从缓冲区写入底层流,开发者无需手动编写循环读取和写入的代码。
④ 适用于文本和二进制数据:缓冲流既适用于处理文本数据,也适用于处理二进制数据。无论是读取或写入文本文件,还是读取或写入二进制文件(如图像、音频文件),都可以使用缓冲流来提高读写效率。
3.标准输入输出
- System.in和System.out是]ava中的标准输入流和标准输出流,它们提供了与命令行界面进行交互的功能。
System.in:
System.in是标准输入流,用于从控制台(通常是命令行界面)读取用户的输入。
System.in是一个InputStream对象,可以使用InputStream的方法来读取用户的输入。
通过System.in,程序可以等待用户的输入,并将输入的数据用于程序的处理。
System.out:
System.out是标准输出流,用于向控制台输出程序的结果、提示信息等
System.out是一个PrintStream对象,可以使用PrintStream的方法将数据输出到控制台。
通过System.out,程序可以将结果、信息等输出到控制台,以供用户观看.
使用Scanner类可以方便地从标准输入(如控制台)获取用户的输入。
4.对象序列化
Serializable接口的作用:
Serializable接口是]ava中的一个标记接口(MarkerInterface),它没有定义任何方法,只是作为一个标识,用于表朗类的对象可以被序列化和反序列化。
序列化是将对象转换为字节序列,以便在网络传输或将对象存储到文件系统中。而反序列化则是将字节序列恢复为对象。
Serializable接口的作用如下:
① 对象持久化:通过实现Serializable接口,可以使类的对象可以被序列化,即可以将其保存到文件、数据库等持久化存储介质中。这样,在程序终止后,对象的状态可以被保留下来,下次程序运行时可以重新加载对象。
② 网络通信:在网络通信中,将对象序列化后发送给其他计算机,接收方可以将字节流反序列化为对象。这样可以方便地进行分布式计算、远程方法调用等操作。
③ 分布式系统:在分布式系统中,各个节点之间需要传递数据和对象,通过序列化和反序列化,可以在不同的节点间传输和共享对象。
④ 对象深拷贝:通过将对象序列化然后再反序列化,可以实现对象的深拷贝,即创建一个全新的对象,与原对象完全独立。
要实现Serializable接口,只需在类的声明上加上mmdlemenrs senaleo,并且不需要实现任何方法。需要注意的是,被序列化的类的所有非瞬态(ansient)字段都会被序列化,因此应谨慎选择需要序列化的字段
需要注意的是,Serializable接口并不建议用于敏感数据、密码、安全密钥等信息的序列化,因为序列化的数据可以在网络上传输或存储在不受信任的环境中。在这种情况下,应考虑其他安全手段,如加密、签名等来保护数据的安全性。
总而言之,Serializable接口为Java对象的序列化和反序列化提供了支持,使对象在持久化、网络通信和分布式系统中的传输和共享更加便捷。
使用0bjectOutputstream和ObjectlnputStream类可以对Java对象进行序列化和反序列化。
5.字符编码与字符集
- 字符编码的概念和重要性
字符编码是一种将字符映射为二进制数据的规则或方案。它定义了字符与二进制数据之间的对应关系,使计算机能够处理和存储文本数据。字符编码在计算机系统中起着重要的作用。
概念:
字符集(Character Set):字符集是一组字符的集合,每个字符都有一个唯一的标识符。常见的字符集包括ASCI1、Unicode等
编码方案(EncodingScheme):编码方案定义了字符集中的字符如何映射为二进制数据。它规定了字符的表示形式和编码方式。
重要性:
文本处理:字符编码使得计算机能够处理和表示文本数据。通过字符编码,可以在计算机中存储、传输和处理各种语言的文本,包括英语、中文、日语等。不同的字符编码方案支持不同的字符集和语言。
兼容性和互操作性:字符编码的标准化有助于实现不同计算机系统、操作系统和应用程序之间的兼容性和互操作性。统一的字符编码方案使得文本数据可以在不同的环境中无缝传递和处理。
多语言支持:Unicode是一种广泛使用的字符编码标准,它支持几乎所有的语言和符号。Unicode的出现解决了传统字符编码方案的局限性,使得多语言文本处理变得更加便捷。
国际化和本地化:字符编码对于实现软件的国际化和本地化非常重要。通过选择适当的字符编码,软件可以适应不同语言和地区的需求,支持多语言界面、本地化的日期、时间和数字格式等。
常见的字符编码方案包括ASCI、UTF-8、UTF-16、GBK、ISO-8859-1等。选择合适的字符编码方案要考虑数据的特点、传输和存储需求、目标环境等因素。在处理文本数据时,确保正确的字符编码非常重要,否则可能导致乱码、字符丢失或无法正确解析文本。
当需要处理不同字符编码方式的文本时,可以使用Java中的InputstreamReader 和Outputstreamwriter 类来进行转换和处理。
6.异常处理和资源关闭
- IO流中的常见异常并提供解决方案
在IO流操作中,常见的异常包括IOException 及其子类。以下是几个常见的IO流异常和解决方案:
① FileNotFoundException(文件未找到异常):当尝试打开或读取一个不存在的文件时抛出。
解决方案:
确保文件路径和文件名的正确性。
检查文件是否存在,可以使用 File.exists( 方法。
确保具有足够的权限来访问文件。
如果需要创建文件,可以使用 File.createNewFile( 方法。
② IOException(输入输出异常):当读取或写入数据时发生错误时抛出。
解决方案:
检查输入和输出流是否正确初始化和关闭。.
确保在使用流之前检查流的状态,例如通过 inputstream.availabe()方法检查是否有可读数据。
检查文件和目录的权限,确保有适当的读取和写入权限。
处理异常情况,例如使用 ty-catch 语句捕获和处理 I0Exception 。
原文地址:https://blog.csdn.net/Q95470/article/details/142927762
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!