Java基础--->IO流(1)【IO基础】

这篇具有很好参考价值的文章主要介绍了Java基础--->IO流(1)【IO基础】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java中的IO

Java中的IO是一种用于读写文件、网络连接数据等功能的I/O(输入/输出)系统。它主要由java.io包提供,并且功能丰富,支持各种文件格式和网络协议。

在Java中,可以使用字节流和字符流来读写数据。字节流以字节为单位读写数据,而字符流以字符为单位读写数据,并且支持 Unicode 字符编码。Java中的I/O流可以分为输入流和输出流两种,输入流用于从文件或其他数据源读取数据,而输出流用于将数据写入文件或其他数据接收端。

Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

Java中的常用I/O类包括File、FileReader、FileWriter、BufferedReader、InputStreamReader、PrintStream等。例如,使用File类可以方便地创建、删除或重命名文件和目录;BufferedReader可以提高读取文件的效率;PrintStream则可以将数据直接输出到控制台或文件中。

使用File创建的对象只可以获取计算机硬盘上的文件信息或者目录,创建文件,删除文件但是不能对文件中的数据进行操作

File常用方法

 //通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。  
File fi = new File("C:\\Users\\qq\\Desktop\\demo.txt");

	System.out.println(fi.canExecute());
    System.out.println(fi.canRead())
    System.out.println(fi.canWrite());
    System.out.println(fi.exists());//文件是否存在
    System.out.println("-----------------------------------------");
    System.out.println(fi.getAbsoluteFile() );//返回此抽象路径名的绝对形式。
    System.out.println(fi.getAbsolutePath() );//返回此抽象路径名的绝对路径名字符串
    System.out.println(fi.getParentFile() );//返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录

    System.out.println(fi.getName());//返回由此抽象路径名表示的文件或目录的名称
    System.out.println(fi.getParent());//返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null

    System.out.println("------------------------------------------");
    System.out.println(fi.isAbsolute());//路径名是否是绝对的
    System.out.println(fi.isDirectory());//是否为目录/文件夹
    System.out.println(fi.isFile());//是否为普通文件
    System.out.println(fi.isHidden());//是否为隐藏文件

    System.out.println("--------------------------------------------");
    System.out.println(new Date(fi.lastModified()));//最后修改时间
    System.out.println(fi.length());//文件内容长度

        fi.mkdir();//创建单级文件夹
        fi.mkdirs();//创建多级文件夹
        fi.createNewFile();//创建一个文件

​ IO即Input/Output,也就是输入和输出。数据输入到计算机的过程,就是输入,反之输出到外部存储(数据库,文件,远程主机)的过程为输出。数据传输过程类似与水流,因此称为IO流。数据处理的方式分为字节流和字符流。

​ JavaIO流的40多个类都是从如下四个抽象类中派生出来的,

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流

InputStream(字节输入流)

​ 用于从源头(通常是文件)读取数据(字节信息)到内存中,java.io.InputStream抽象类是所有字节输入流的父类

InputStream常用方法:

  • read(),read(byte b[]), read(byte b[], int off, int len), skip(long n), available(), close(),

从Java9开始,InputStream新增了多个实用方法:

  • readAllBytes(), readNBytes(byte[] b, int off, int len), transferTo(OutputStream out),

FileInputStream是一个比较常见的字节输入流对象,可直接指定文件路径,可以直接读取单字节数据,也可以读取至字节数组中。

FileInputStream通常配合BufferedInputStream(字节缓冲输入流)使用

  • 通过readAllBytes()读取输入流所有字节并将其直接赋值给一个String对象。
  • DataInputStream 用于读取指定类型数据,不能单独使用,必须结合 FileInputStream
//使用方式
FileInputStream fileInputStream = new FileInputStream("input.txt");
//必须将fileInputStream作为构造参数才能使用
DataInputStream dataInputStream = new DataInputStream(fileInputStream);
//可以读取任意具体的类型数据
dataInputStream.readBoolean();
dataInputStream.readInt();
dataInputStream.readUTF();

  • ObjectInputStream 用于从输入流中读取 Java 对象(反序列化),ObjectOutputStream 用于将对象写入到输出流(序列化)。

OutputStream(字节输出流)

OutputStream用于将数据(字节信息)写入到目的地(通常是文件),java.io.OutputStream抽象类是所有字节输出流的父类

OutputStream常用方法:

  • write(int b), write(byte b[ ]), write(byte[] b, int off, int len), flush(), close(),

FileOutputStream是最常见的字节输出流对象,可以直接指定文件路径,可以直接输出单字节数据,也可以输出指定的字节数组。

类似于 FileInputStreamFileOutputStream 通常也会配合 BufferedOutputStream(字节缓冲输出流)来使用。

FileOutputStream fileOutputStream = new FileOutputStream("output.txt");
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream)

DataOutputStream 用于写入指定类型数据,不能单独使用,必须结合 FileOutputStream

// 输出流
FileOutputStream fileOutputStream = new FileOutputStream("out.txt");
DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
// 输出任意数据类型
dataOutputStream.writeBoolean(true);
dataOutputStream.writeByte(1);

ObjectInputStream 用于从输入流中读取 Java 对象(ObjectInputStream,反序列化)ObjectOutputStream将对象写入到输出流(ObjectOutputStream,序列化)。


为什么I/O流操作要分为字节流操作和字符流操作?

字节流操作是以字节为基本单位进行操作的,在数据传输过程中,不考虑字符编码和字符集,只是简单地传输二进制数据。因此,字节流操作适用于任何类型的数据,包括图片、声音、视频等二进制文件,以及文本文件等。但是在处理文本数据时需要做字符编码和字符集的转换,如果操作不当,就可能会出现乱码等问题。

而字符流操作是以字符为基本单位进行操作的,会考虑字符编码和字符集的影响。不同的字符编码会导致不同的字节序列表示同一个字符,因此使用字符流操作可以更好地处理字符数据,如文本文件等。

Reader(字符输入流)

Reader用于从源头(通常是文件)读取数据(字符信息)到内存中,java.io.Reader抽象类是所有字符输入流的父类。

Reader 用于读取文本, InputStream 用于读取原始字节。

Reader 常用方法:

  • read() : 从输入流读取一个字符。
  • read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中,等价于 read(cbuf, 0, cbuf.length)
  • read(char[] cbuf, int off, int len):在read(char[] cbuf) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字符数)。
  • skip(long n):忽略输入流中的 n 个字符 ,返回实际忽略的字符数。
  • close() : 关闭输入流并释放相关的系统资源。

InputStreamReader 是字节流转换为字符流的桥梁,其子类 FileReader 是基于该基础上的封装,可以直接操作字符文件。

Writer(字符输出流)

Writer用于将数据(字符信息)写入到目的地(通常是文件),java.io.Writer抽象类是所有字符输出流的父类。

Writer 常用方法:

  • write(int c) : 写入单个字符。
  • write(char[] cbuf):写入字符数组 cbuf,等价于write(cbuf, 0, cbuf.length)
  • write(char[] cbuf, int off, int len):在write(char[] cbuf) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字符数)。
  • write(String str):写入字符串,等价于 write(str, 0, str.length())
  • write(String str, int off, int len):在write(String str) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字符数)。
  • append(CharSequence csq):将指定的字符序列附加到指定的 Writer 对象并返回该 Writer 对象。
  • append(char c):将指定的字符附加到指定的 Writer 对象并返回该 Writer 对象。
  • flush():刷新此输出流并强制写出所有缓冲的输出字符。
  • close():关闭输出流释放相关的系统资源。

OutputStreamWriter 是字符流转换为字节流的桥梁,其子类 FileWriter 是基于该基础上的封装,可以直接将字符写入到文件。

字节缓冲流

字节缓冲流是以字节为单位读写数据,它们内部维护了一个缓冲区,从而能够提高IO操作的效率。

当我们使用 BufferedInputStream 读取数据时,它不会一个字节一个字节读取,它会一次性从底层 InputStream 中读取一部分数据到内部缓存中,并从内部缓存中单独读取字节,这样可以减少访问磁盘的次数,提高读取效率。

BufferedInputStream 内部维护了一个缓冲区,这个缓冲区实际就是一个字节数组。

使用 BufferedOutputStream 写入数据时,它不会一个字节一个字节的写入,它也会将数据缓存到内部的缓存区中,等到缓冲区满了之后从内部缓冲区中单独写入字节。这样可以减少写入操作的次数,提高写入效率。

字符缓冲流

字符缓冲流(字符缓冲输入/输出流) 类似于字节缓冲流,内部都维护了一个字节数组作为缓冲区。不过字符缓冲流主要是用来操作字符信息。

字符缓冲流是以字符为单位读写数据,它们同样也内部维护了一个缓冲区。BufferedReaderBufferedWriter 在读写数据时都会使用内部缓存区,从而减少IO操作次数,提高读写效率。当使用 BufferedReader 读取数据时,它会一次性读取一定量的字符到缓冲区中,然后逐个读取,直到缓冲区中数据全部读取完毕,这样可以减少访问数据源的次数提高读入效率。当 BufferedWriter 写数据时,它的操作类似,会先将数据写入缓冲区,等到缓冲区写满之后再一次性写出到目标文件中,这样可以减少写操作次数,提高写入效率。

打印流

System.out.print("Hello!");
System.out.println("Hello!");

System.out 实际是用于获取一个 PrintStream 对象,print方法实际调用的是 PrintStream 对象的 write 方法。

PrintStream 属于字节打印流,与之对应的是 PrintWriter (字符打印流)。PrintStreamOutputStream 的子类,PrintWriterWriter 的子类。文章来源地址https://www.toymoban.com/news/detail-460010.html

到了这里,关于Java基础--->IO流(1)【IO基础】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一种用于态势评估的安全数据处理系统(JSP+java+springmvc+mysql+MyBatis)

    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。   在复杂多变的安全环境中,对各种安全数据进行实时有效的态势评估对于保障国家安全、社会稳定和人民生命财产安全具有重要意义。然而,传统的安全数据处理系统往往存在

    2024年04月14日
    浏览(35)
  • 探索Java通信面试的奥秘:揭秘IO模型、选择器和网络协议,了解面试中的必备知识点!

    TCP(Transmission Control Protocol)是一种面向连接的可靠的传输协议。类似于打电话,它通过建立一个连接和保证数据的可靠传输来提高通信的可靠性。然而,由于要确保数据的可靠性,TCP协议会增加网络负担,效率相对较低。 UDP(User Datagram Protocol)是一种无连接、不可靠的传输

    2024年02月15日
    浏览(37)
  • ModDrop++:一种具有受试者内部协同训练的动态滤波网络,用于具有缺失模态的多发性硬化病变分割

    多发性硬化症(MS)是一种慢性神经炎症性疾病,多模态MRI通常用于监测MS病变。已经开发了许多自动MS病变分割模型,并且已经达到了人类水平的性能。然而,大多数已建立的方法需要在假设训练期间使用的MRI模态在测试期间也可用,这在临床实践中无法保证。此前,一种称

    2024年02月07日
    浏览(23)
  • Linux CentOs7 监控CPU 内存 硬盘IO读写,网络负载,CPU温度等

    一般我们都知道TOP命令可以加载服务器的负载详情,但界面不太友好。因此用到htop 我们开发的软件服务需要在服务器上运行,所以服务器性能代表了软件的性能上限,因此服务器性能调优是个十分重要的环节,然而大部分同学对服务器性能调优关注的较少,今天从3个部分对

    2024年02月07日
    浏览(37)
  • 【Java基础教程】(四十五)IO篇 · 中:转换流、内存流和打印流(探索装饰设计模式与PrintStream类的进阶),文件操作案例实践、字符编码问题~

    掌握内存操作流、转换流、打印流的使用; 掌握文件复制操作; 掌握字符的主要编码类型以及乱码问题产生的原因; 虽然字节流与字符流表示两种不同的数据流操作,但是这两种流彼此间是可以实现互相转换的,而要实现这样的转换可以通过 InputStreamReader 、 OutputStreamWrit

    2024年02月16日
    浏览(30)
  • Linux中的基础IO

    目录 1、关于C语言中的文件操作符 1.1 C语言中写文件 1.2 C语言读文件 1.3 往显示器上输出信息 1.4 stdin stdout stderr 1.5 打开文件的方式 2、系统文件IO 2.1 写操作文件 2.2 读操作文件、 2.3 open open函数的返回值 2.4 文件描述符 0 1 2 文件描述符的分配规则 2.5 重定向和dup2  3、缓冲区相

    2024年02月10日
    浏览(31)
  • Java基础--->IO流(1)【IO基础】

    Java中的IO是一种用于读写文件、网络连接数据等功能的I/O(输入/输出)系统。它主要由java.io包提供,并且功能丰富,支持各种文件格式和网络协议。 在Java中,可以使用字节流和字符流来读写数据。字节流以字节为单位读写数据,而字符流以字符为单位读写数据,并且支持

    2024年02月06日
    浏览(33)
  • 4.1 网络基础之网络IO

    下面介绍一个最最简单的服务程序的编写流程,先按照顺序介绍各个函数的参数和使用。然后在第三节用一对简单的程序对客户端与服务端通信过程进行演示。下面所有代码均在linux平台实现,所以可能与windows上的编程有所区别,主要是相关头文件、编译方式上。 这里简单介

    2024年02月08日
    浏览(17)
  • html5提供的FileReader是一种异步文件读取文件中的数据

    前言:FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件。 input:file 在介绍FileReader之前,先简单介绍input的file类型。 input type=\\\"file\\\" id=\\\"file\\\" input的file类型会渲染为一个按钮和一段文字。点击按钮可打开文件选择窗口,文字表示对文件的描述(大部分情

    2024年02月11日
    浏览(34)
  • 【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向

    作者:დ旧言~ 座右铭:松树千年终是朽,槿花一日自为荣。 目标:了解在Linux下的系统文件IO,知道什么是文件描述符,什么是重定向 毒鸡汤:白日莫闲过,青春不再来。 专栏选自:Linux初阶 望小伙伴们点赞👍收藏✨加关注哟💕💕 最早我们在C语言中学习关于如何用代码

    2024年04月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包