【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();
        }
    }
}


目录
相关文章
|
14天前
|
Java Unix Windows
|
2天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
42 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
2天前
|
网络协议 Java 数据库连接
Java语言的特点
【5月更文挑战第7天】Java是一种面向对象的编程语言,强调数据和操作的封装,具备平台独立性,能“一次编写,到处运行”。它有自动垃圾收集机制,消除手动内存管理。Java是强类型语言,注重安全性,并支持多线程编程。其丰富的API库和对网络编程的良好支持增强了功能。此外,Java的可扩展性使其能轻松适应新需求和扩展。
14 4
|
2天前
|
分布式计算 Java 大数据
Java语言主要应用领域
【5月更文挑战第7天】Java在嵌入式系统中以低至130KB的占用展现可靠性,实现“一次编写,到处运行”。在大数据领域,Java通过Hadoop、Hbase、Accumulo和ElasticSearch等工具发挥关键作用。Java也是Eclipse、IntelliJ IDEA和NetBeans等开发工具的基础。广泛应用于电商网站和金融服务器系统,即便在J2ME式微后,仍能在部分低端手机中找到其踪影。
15 4
|
3天前
|
存储 缓存 Java
Java IO 流详解
Java IO 流详解
12 1
|
7天前
|
存储 Java
Java的`java.io`包包含多种输入输出类
Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
16 1
|
8天前
|
存储 Java
java IO接口(Input)用法
【5月更文挑战第1天】Java的`java.io`包包含多种输入输出类。此示例展示了如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着创建一个字节数组存储读取的数据,调用`read()`方法将文件内容填充至数组。然后将字节数组转换为字符串并打印,最后关闭输入流。注意,`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
19 2
|
10天前
|
存储 Java Linux
【Java EE】 文件IO的使用以及流操作
【Java EE】 文件IO的使用以及流操作
|
10天前
|
Java
Java语言---面向对象的三大特征之继承
Java语言---面向对象的三大特征之继承
|
10天前
|
存储 Java
Java语言--->数据类型转化以及运算符
本文讲述了Java中的基本数据类型转换和运算符。在转换中,布尔型除外的8种类型可通过默认或强制转换相互转化,如`byte-&gt;short-&gt;int-&gt;long-&gt;float-&gt;double`。默认转换发生在不同类型运算时,系统会转为更大容量类型。强制转换可能引起精度损失或溢出。运算符包括算术(如+可做加法或字符串拼接)、比较、逻辑和赋值运算符。比较运算符如`==`、`&lt;`等产生`boolean`结果,逻辑运算符`&&`、`||`具有短路效应。赋值运算符如`+=`简化了赋值过程。运算符的优先级也进行了简要说明。