IO教程
什么是IO?
Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。
发展历程
-
BIO(本文主要讲解,一下IO简称默认是BIO) 就是传统的 java.io 包,它是基于流模型实现的,交互的方式是同步、阻塞方式,也就是说在读入输入流或者输出流时,在读写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。它的有点就是代码比较简单、直观;缺点就是 IO 的效率和扩展性很低,容易成为应用性能瓶颈。
-
NIO 是 Java 1.4 引入的 java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层高性能的数据操作方式。
-
AIO 是 Java 1.7 之后引入的包,是 NIO 的升级版本,提供了异步非堵塞的 IO 操作方式,所以人们叫它 AIO(Asynchronous IO),异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
OutputStream与InputStream
stream
流是数据序列。在Java中,流是由字节组成的。它被称为一条小溪,因为它就像一条不断流动的水流。
在Java中,会自动为我们创建3个流。所有这些流都与控制台相连。
1) System.out:标准输出流
2) System.in:标准输入流
3) System.err:标准错误流
让我们看看打印输出的代码和控制台的错误消息。
System.out.println("hello word");
System.err.println("hello word");
获取控制台输入流
int i=System.in.read();//获取console读取流
System.out.println((char)i);//打印
OutputStream与InputStream
- OutputStream
Java应用程序使用输出流将数据写入目的地;它可以是文件、数组、外围设备或套接字。
- InputStream
Java应用程序使用输入流从源读取数据;它可以是文件、数组、外围设备或套接字。
让我们通过下图来了解Java OutputStream和InputStream的工作原理。
OutputStream类详解
OutputStream类是一个抽象类。它是表示字节输出流的所有类的超类。输出流接受输出字节并将它们发送到某个接收器。
- OutputStream的实用方法:
方法 | 说明 |
---|---|
public void write(int)throw IOException | 用于将字节写入当前输出流。 |
public void write(byte[])throw IOException | 用于将字节数组写入当前输出流。 |
public void flush()throw IOException | 刷新当前输出流。 |
| public void close()throw IOException| 用于关闭当前输出流。 |
- OutputStream层次结构
InputStream类详解
InputStream类是一个抽象类。它是表示字节输入流的所有类的超类。
- InputStream类详解的实用方法:
方法 | 说明 |
---|---|
public abstract int read()throw IOException | 从输入流中读取下一个字节的数据。它在文件末尾返回-1。 |
public int available()throw IOException | 返回可从当前输入流读取的字节数的估计值。 |
public void close()throw IOException | 用于关闭当前输入流。 |
- InputStream层次结构
实战演练(文件流)
接一下讲一下最常用FileOutputStream 跟 FileInputStream两种文件IO流使用。
FileOutputStream
public class FileOutputStream extends OutputStream
显然FileOutputStream是OutputStream的一个具体实现类,用户写入文件流的。java中的OutputStream是一个顺序写入流,。
方法 | 说明 |
---|---|
protected void finalize() | 用于清除与文件输出流的连接 |
void write(byte[]ary) | 用于将ary.length字节从字节数组写入文件输出流 |
void write(byte[]ari,int off,int len) | 用于从偏移量off开始将len字节从字节数组写入文件输出流 |
void write(int b) | 用于将指定的字节写入文件输出流 |
FileChannel getChannel() | 用于返回与文件输出流关联的文件通道对象 |
FileDescriptor getFD() | 用于返回与流关联的文件描述符 |
void close() | 关闭文件流 |
import java.io.FileOutputStream;
public class FileOutputStreamExample {
public static void main(String args[]){
try{
FileOutputStream fout=new FileOutputStream("D:\\testout.txt");
fout.write(65);
fout.close();
System.out.println("success...");
}catch(Exception e){System.out.println(e);}
}
}
控制台输出
Success...
此时会发现我们的D盘里被写入了一个testout.txt文件。查看文件内容
A
import java.io.FileOutputStream;
public class FileOutputStreamExample {
public static void main(String args[]){
try{
FileOutputStream fout=new FileOutputStream("D:\\testout1.txt");
String s="hello word";
byte b[]=s.getBytes();
fout.write(b);
fout.close();
System.out.println("success...");
}catch(Exception e){System.out.println(e);}
}
}
控制台输出
Success...
此时会发现我们的D盘里被写入了一个testout1.txt文件。查看文件内容
hello word
FileInputStream
public class FileInputStream extends InputStream
显然FileInputStream是OutputStream的一个具体实现类,用户读取文件流的。
方法 | 说明 |
---|---|
int available() | 用于返回可从输入流读取的估计字节数 |
int read() | 用于从输入流中读取数据字节 |
int read(byte[] b) | 用于从输入流中读取最多为b.length字节的数据 |
int read(byte[]b,int off,int len) | 用于从输入流中读取从off起多达len字节的数据。 |
long skip(long x) | 用于跳过并丢弃输入流中的x字节数据 |
FileChannel getChannel() | 用于返回与文件输入流关联的唯一FileChannel对象 |
FileDescriptor getFD() | 用于返回FileDescriptor对象 |
protected void finalize() | 用于确保在没有更多文件输入流引用时调用close方法 |
void close() | 关闭文件流 |
import java.io.FileInputStream;
public class DataStreamExample {
public static void main(String args[]){
try{
FileInputStream fin=new FileInputStream("D:\\testout.txt");
int i=fin.read();
System.out.print((char)i);
fin.close();
}catch(Exception e){System.out.println(e);}
}
}
输出
A
当读取字符串时候需要一个个字节去读取,当读取不到数据时候会返回给我们index= -1,此时停止读取关闭流。
package com.javatpoint;
import java.io.FileInputStream;
public class DataStreamExample {
public static void main(String args[]){
try{
FileInputStream fin=new FileInputStream("D:\\testout1.txt");
int i=0;
while((i=fin.read())!=-1){
System.out.print((char)i);
}
fin.close();
}catch(Exception e){System.out.println(e);}
}
}
控制台输出
hello word
END
下篇讲解IO缓冲区流
欢迎关注公众号!
公众号回复:入群
,扫码加入我们交流群!