JAVA IO
- java io可以让我们用标准的读写操作来完成对不同设备的读写数据工作.
- java将IO按照方向划分为输入与输出,参照点是我们写的程序.
- 输入:用来读取数据的,是从外界到程序的方向,用于获取数据.
- 输出:用来写出数据的,是从程序到外界的方向,用于发送数据.
java将IO比喻为"流",即:stream. 就像生活中的"电流","水流"一样,它是以同一个方向顺序移动的过程.只不过这里流动的是字节(2进制数据).所以在IO中有输入流和输出流之分,我们理解他们是连接程序与另一端的"管道",用于获取或发送数据到另一端.
Java定义了两个超类(抽象类):
- java.io.InputStream:
所有字节输入流的超类,其中定义了读取数据的方法.因此将来不管读取的是什么设备(连接该设备的流)都有这些读取的方法,因此我们可以用相同的方法读取不同设备中的数据
- java.io.OutputStream:
所有字节输出流的超类,其中定义了写出数据的方法.
java将流分为两类:节点流与处理流:
- 节点流:
也称为低级流.节点流的另一端是明确的,是实际读写数据的流,读写一定是建立在节点流基础上进行的.
- 处理流:
也称为高级流.处理流不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对数据进行加工处理来简化我们对数据的该操作.
实际应用中,我们可以通过串联一组高级流到某个低级流上以流水线式的加工处理对某设备的数据进行读写,这个过程也成为流的连接,这也是IO的精髓所在.
文件流
文件流是一对低级流,用于读写文件数据的流.用于连接程序与文件(硬盘)的"管道".负责读写文件数据.
文件输出流:java.io.FileOutputStream
package io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* JAVA IO Input&Output 输入和输出
* java程序与外界交换数据是基于IO完成的,这里输入与输出一个负责读一个负责写
* 输入:是从外界到我们写的程序的方向,是用来从外界获取信息的。因此是"读"操作
* 输出:是从我们写的程序到外界的方向,是用来向外界发送信息的。因此是"写"操作
*
* java将IO比喻为"流",可以理解为是程序与外界连接的"管道",内部流动的是字节,并且
* 字节是顺着同一侧方向顺序移动的。
*
* java.io.InputStream 输入流,这个类是所有字节输入流的超类,规定了所有字节输入
* 流读取数据的相关方法。
* java.io.OutputStream 输出流,这个类是所有字节输出流的超类,规定了所有字节输出
* 流写出数据的相关方法。
*
* 实际应用中,我们连接不同的设备,java都专门提供了用于连接它的输入流与输出流,而
* 这些负责实际连接设备的流称为节点流,也叫低级流。是真实负责读写数据的流。
* 与之对应的还有高级流,高级流可以连接其他的流,目的是当数据流经它们时,对数据做某
* 种加工处理,用来简化我们的操作。
*
*
* 文件流
* java.io.FileInputStream和FileOutputStream
* 这是一对低级流,继承自InputStream和OutputStream。用于读写硬盘上文件的流
*
*/
public class FOSDemo {
public static void main(String[] args) throws IOException {
//向当前目录下的demo.dat文件中写入数据
/*
FileOutputStream提供的常用构造器
FileOutputStream(String path)
FileOutputStream(File file)
*/
//文件流创建时,如果该文件不存在会自动将其创建(前提是该文件所在目录必须存在!)
FileOutputStream fos = new FileOutputStream("./demo.dat");
/*
void write(int d)
向文件中写入1个字节,写入的内容是给定的int值对应的2进制的"低八位"
int值 1: vvvvvvvv
二进制:00000000 00000000 00000000 00000001
demo.dat文件内容:
00000000
*/
fos.write(1);
/*
vvvvvvvv
00000000 00000000 00000000 00000010
demo.dat文件内容
00000001 00000010
*/
fos.write(2);
fos.close();
System.out.println("执行完了!");
}
}
文件输入流FileInputStream
package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* end 结尾
* read 读
*
*
* 文件字节输入流,用于从文件中读取字节
*/
public class FISDemo {
public static void main(String[] args) throws IOException {
/*
fos.dat文件内容
00000001 00000011
*/
FileInputStream fis = new FileInputStream("fos.dat");
/*
int read()
读取一个字节,并一int型返回。返回的整数中读取的字节部分在该整数2进制的最后8位上
如果返回值为整数-1,则表示流读取到了末尾。对于读取文件而言就是EOF(end of file
文件末尾)
第一次调用read():
int d = fis.read();
fos.dat文件内容
00000001 00000011
^^^^^^^^
读取该字节
返回int值时,2进制样子:
00000000 00000000 00000000 00000001
^^^^^^^^
|-----补充24个0(3字节)-----| 读取的字节
返回的int值d就是上述内容
*/
int d = fis.read();
System.out.println(d);
/*
第二次调用read()
d = fis.read();
fos.dat文件内容
00000001 00000011
^^^^^^^^
读取该字节
返回int值时,2进制样子:
00000000 00000000 00000000 00000011
^^^^^^^^
|-----补充24个0(3字节)-----| 读取的字节
返回的int值d就是上述内容
*/
d = fis.read();
System.out.println(d);
/*
第三次调用read()
d = fis.read();
fos.dat文件内容
00000001 00000011
^^^^^^^^
文件末尾了
返回int值时,2进制样子:
11111111 11111111 11111111 11111111
^^^^^^^^
|-----补充32个1(4字节,来表示-1)-----|
返回的int值d就是上述内容
*/
d = fis.read();
System.out.println(d);
fis.close();
}
}
总结:
Java中的IO(Input/Output)是指处理输入和输出数据的机制。通过IO,可以将数据从一个地方发送到另一个地方,如从文件读取数据,或将数据写入到文件中。Java提供了丰富的IO类和接口来支持各种IO操作。
Java的IO库可以分为两个大类:基于字节流的IO和基于字符流的IO。
基于字节流的IO:
- InputStream和OutputStream是所有字节流的父类,分别用于从源读取字节和将字节写入目标。
- FileInputStream和FileOutputStream用于从文件中读取字节和将字节写入文件。
- BufferedInputStream和BufferedOutputStream提供了缓冲的功能,加快IO的速度。
- ByteArrayInputStream和ByteArrayOutputStream用于读取和写入内存中的字节数组。
- DataInputStream和DataOutputStream用于以特定的格式读取和写入基本数据类型。
- ObjectInputStream和ObjectOutputStream可以将对象序列化和反序列化,实现对象的读写。
基于字符流的IO:
- Reader和Writer是所有字符流的父类,分别用于从源读取字符和将字符写入目标。
- FileReader和FileWriter用于从文件中读取字符和将字符写入文件。
- BufferedReader和BufferedWriter提供了缓冲的功能,加快IO的速度。
- CharArrayReader和CharArrayWriter用于读取和写入内存中的字符数组。
- InputStreamReader和OutputStreamWriter用于将字节流转换为字符流。
- StringReader和StringWriter用于将字符串作为字符流进行读写。
另外,Java还提供了一些特殊的IO类和接口,如:
- RandomAccessFile可以随机访问文件,既可以读取文件的任意位置,也可以在任意位置写入数据。
- PrintStream和PrintWriter提供了方便的打印功能,可以将数据格式化后写入目标。
- BufferedReader和Scanner可以用于从输入流中逐行读取数据。
- FileOutputStream和FileInputStream可以用于读写文件的元数据,如文件权限、创建时间等。