【Java篇】Java语言的IO流(上)

简介: 【Java篇】Java语言的IO流(上)

知识点1:Java语言的输入输出类库


1.流的概念


  • 流是指计算机各部件之间的数据流动。可以是原始的二进制数据,也可以是编码后的特定数据。

2.流的分类


  • 按照数据的传输方法,流分为输出流和输入流。按照内容区分为字节流和字符流。


3.流的作用


  • 用户可以通过流来读写数据。


输入输出流


Java中把不同的输入输出源(文件,屏幕,键盘等)抽象为流,输入输出的数据称为数据流,数据流是Java程序接收和发送数据的一个通道。把数据从键盘等外设传递到程序称为输入流,输入流只能从其读取数据而不能向其写入数据,输出流类似。

5.1.png


数据的接收和发送都是沿着数据序列顺序进行的,每一个数据都要等待前面的数据读入或者送出才能进行读写。

5.2.png

缓冲流


数据流中的每次操作都是以字节为单位的,为了提高数据传输效率,通常使用缓冲流。缓冲流就是为一个已有的流配上一个缓冲区。例如写入数据时,数据会先发送到缓冲区,当缓冲区满时,在发送到外部设备。

4.输入输出流类库


  • Java语言的输入输出流都封装在java.io包中,使用前要先导包。用户可以选择包里的不同的流类实现各种数据的输入输出。其中字节流每次读取8位二进制数,不能分解,重组和理解这些数据,所以可以恢复到原来有意义的状态。字符流每次读取16位二进制数,将其作为一个字符处理。
  • 字符流的源或目标通常是文本文件,Java语言使用的是Unicode编码,字符流可以实现程序内部格式与文本文件,显示输出等外部格式的转换。
  • 在java.io中有四个类:

5.3.png


  • InputStream等四个类是抽象类,用于数据的输入输出。不能直接使用,因为不能表明具体对应哪一种输入输出设备,更体现了输入输出操作独立与相关设备。File是文件类,用于磁盘文件与文件夹的管理。RandomAccessFile是随机访问文件类,用于实现对磁盘文件的随机读写操作。
  • 字节流类通常被用来读写图片视频等二进制数据,但也可以用来处理文本文件,字符流类通常用来处理文本文件。由于字节流不能直接操作Unicode编码,因此不提倡使用字节流读取文本文件,因为当文件中有汉字时可能会出现乱码。


知识点2:使用InputStream和OutputStream流类


下面流类的构造方法和常用方法参见Java api

1.基本输入输出流


1.InpitStream流类

InputStream流类中包含了一套所有字节输入都需要的方法,可以完成从输入流读入数据的操作。

当程序从键盘磁盘文件等外设读入数据时,要先创建一个子类的对象来与外设连接,再调用该对象继承的read()方法实现输入操作。流中的方法都声明抛出异常,所以程序中调用流方法时要处理异常,否则编译不通过。


2.OutputStream流类

OutputStream类中包含了一套所有字节输出都需要的方法,可以完成从输出流写入数据的操作。

当程序向屏幕磁盘文件等外设输入数据时,要先创建一个子类对象来与外设连接,再调用该对象继承的write()方法实现输出操作。


2.输入输出流的应用


InputStream类和OutputStream类时抽象类,具体实现输入输出操作时要派生出不同的子类,用于不同情况数据的输入输出操作。一起来学习这些类趴:

2.1文件输入输出流


  • FileInputStream和FileOutputStream流负责本地磁盘的文件的顺序输入输出操作。
  • FileInputStream类的对象表示文件字节输入流,从中可以读取数据。 在生成该类的对象时若找不到指定文件,则一定会抛出FileNotFoundException异常。该异常必须捕获或者声明抛出。
  • FileOutputStream类的对象表示文件字节输出流,可向流中写入数据。在生成该类的对象时若找不到文件则创建一个新文件,若已存在,则清除原文件的内容。在进行文件读写操作时会产生IOException异常,该异常必须捕获或声明抛出。
  • 其中File是java.io包中的类,每个File对象表示一个磁盘文件或者文件夹,其中属性包含了文件夹的名称长度等信息。
  • 无论哪一个构造方法,在创建文件输入输出流时都可能因为文件名不对,路径不对,属性不对等无法打开文件造成错误,抛出FileNotFoundException异常,执行writer()和reader()方法时因为IO错误抛出IOException异常。所以输入输出流并调用构造方法以及执行读写操作的语句应放在try语句块中,并由相应的catch语句捕获异常。
  • FileDescriptor是该包中的另一个类,不能实例化。其中有三个静态成员变量in,out,err。分别是标准输入输出流,标准错误流,可以利用它们实现键盘输入屏幕输出。


2.2顺序输入流


  • 顺序输入流SequenceInputStream是将多个输入流顺序连接在一起,形成单一的数据输入流,没有对应的数据输出流。在输入数据时,顺序输入流依次打开每个输入流并读取数据。直到最后一个输入流读取到EOF时为止。


2.3管道输入输出流


  • 管道输入输出流为了实现程序内部线程间的通信或者不同程序的通信,这两个类要结合使用,输入流作为接受端,输出流做为发送端。
  • 管道字节输入流PipedInputStream类和管道字节输出流PipedOutputStream类提供了管道的方式数据输入输出管理类。

2.4过滤输入输出流


  • 过滤字节输入输出流时建立在基本输入输出流之上的,在输入输出数据时可以对数据做类型和格式的转换,即可以对二进制字节数据理解和编码转换。
  • 过滤字节输入流FilterInputStream和过滤字节输出流FilterOutputStream可以在数据读写的同时实现数据操作。是上面两个类的直接子类,也属于抽象类,被DateInputStream和DateOutputStream继承。
  • 有时候我们并不希望数据的传输以字节为基本单位,如一个二进制文件存放的是整型数据,我们希望按照int为基本单位进行数据传输。这两个过滤流可以将基本数据输入输出流转换为基本数据类型的过滤流。

5.4.png


2.5标准输入输出


  • 前面说到的,在一般操作时,要先创建一个输入输出的实例化对象,完成与外设的连接,但是在与标准的输入输出设备连接时不用这样。
  • Java系统实现在java.lang.System包中定义了静态流对象,输入流System.in,一般指键盘。输出流System.out,一般指屏幕。标准错误输出设备System.err使程序运行错误时有日志等固定输出位置。
  • (1)标准输入,System.in是BufferedInputStream的对象,当程序从键盘读入数据时,调用System.in的read方法,从缓冲区读入一个二进制数据。使用时包含在try语句中,并捕获或者抛出异常。
  • (2)标准输出:System.out是打印输出流PrintStream的对象。PrintStream类是过滤字节输出流FilterOutputStream的一个子类,定义了print和println等不同的方法向屏幕输出。
  • (3)标准错误流:System.err用于显示用户错误信息,是由PrintStream派生的类,作用是利用print把错误打印到屏幕上。使用与out同样的方法:
  • 例如System.err.print("错误")。


代码示例:

import java.io.*;
public class A_2 {
    public static void main(String[] args){
        try{
            byte[] b=new byte[128];
            System.out.print("请输入字符:");
            int count=System.in.read(b);
            System.out.print("输入的是:");
            for(int i=0;i<count;i++){
                System.out.print(b[i]+" ");
                System.out.println();
            }
            class InClass=System.in.getClass();
            class OutClass=System.out.getClass();
        }
    }
}


目录
相关文章
|
3月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
4月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
142 0
|
1月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
219 18
|
1月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
84 4
|
1月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
158 1
|
2月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
164 15
|
3月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
3月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
4月前
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
110 2
|
3月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
363 0