一、什么是IO流?
IO(Input/Output)即输入与输出,Java中的IO流是用来处理文件与数据流的机制。Java将流定义为一个连续的字符序列和字节序列。在Java中,流是用于读写操作的,数据流向被读取,也可以流向被写入。IO流通常分为字节流和字符流。字节流用于处理二进制数据,例如处理图像和音频文件;字符流则用于处理文本数据,例如处理文本文件。Java中的IO流主要有三个途径:File类、流式传输API、NIO。
public class IOStreamDemo {
public static void main(String[] args) {
try {
File file = new File("test.txt");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line;
while((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
isr.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、JAVA IO流的分类
Java的IO流可以根据数据传输方式划分为字节流和字符流,可以根据操作的数据单位划分为节点流和处理流。
1. 字节流和字符流
字节流主要由InputStream和OutputStream构成,其中InputStream是抽象类,可以根据具体数据类型采取相应的输入流,如FileInputStream;OutputStream也是抽象类,可以根据具体数据类型采取相应的输出流,如FileOutputStream。
字符流主要由Reader和Writer构成,其中Reader是抽象类,可以根据具体数据类型采取相应的读取字符流,如FileReader;Writer也是抽象类,可以根据具体数据类型采取相应的写入字符流,如FileWriter。
import java.io.*;
public class ByteStreamDemo {
public static void main(String[] args) {
try {
File file = new File("test.txt");
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[1024];
int len;
while ((len = fis.read(b)) != -1) {
System.out.println(new String(b,0,len, "UTF-8"));
}
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 节点流和处理流
节点流负责数据的读写,处理流则利用节点流进行数据读写的过程中添加相应的处理方式。节点流可以直接操作文件,但是处理流不能单独存在,它必须依托于其他的节点流的基础之上。常见的例子是BufferedReader和文件的结合。
import java.io.*;
public class ReaderDemo {
public static void main(String[] args) {
try {
File file = new File("test.txt");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line;
while((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
isr.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、Java IO流的常用类
1. FileInputStream 和 FileOutputStream类
FileInputStream和FileOutputStream用于读取和输出文件数据。这两个类是字节流的标准类型,它们通过简单的InputStream和OutputStream类进行包装实现。
import java.io.*;
public class FileStreamDemo {
public static void main(String[] args) {
File file = new File("test.txt");
try {
FileOutputStream fos = new FileOutputStream(file);
String data = "这是Java IO流的使用指南";
byte[] b = data.getBytes("UTF-8");
fos.write(b);
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[(int) file.length()];
fis.read(b);
System.out.println(new String(b, "UTF-8"));
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. Reader和Writer类
Reader和Writer类是用于读取和输出字符数据的类,它提供了直观的读写接口,适合于处理文本类型数据。
import java.io.*;
public class FileWriterDemo {
public static void main(String[] args) {
File file = new File("test.txt");
try {
FileWriter fw = new FileWriter(file);
fw.write("这是Java IO流的使用指南");
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileReader fr = new FileReader(file);
char[] b = new char[(int) file.length()];
fr.read(b);
System.out.println(new String(b));
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. BufferedReader 和 BufferedWriter类
BufferedReader和BufferedWriter是高效的读取和输出字符数据的类,它们提供了缓冲读写接口,可以提高IO效率。
import java.io.*;
public class BufferedWriterDemo {
public static void main(String[] args) {
File file = new File("test.txt");
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
bw.write("这是Java IO流的使用指南");
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、Java NIO介绍
NIO(New IO)是JDK1.4版本引入的一组带有新功能的IO API。NIO支持面向缓冲的,基于通道的IO操作。 NIO是一种基于缓存的IO方式,主要是为了解决BIO(Blocking IO)多线程读取数据的问题,在NIO中可以设置一个或多个缓存装满需要传输的内容,然后再操作缓存中的内容。
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.nio.file.*;
public class NIODemo {
public static void main(String[] args) {
try {
Path path = Paths.get("test.txt");
String input = "这是Java NIO的使用指南";
Files.write(path, input.getBytes(), StandardOpenOption.CREATE);
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
Charset charset = Charset.forName("UTF-8");
FileChannel fileChannel = FileChannel.open(path);
int bytesRead = fileChannel.read(byteBuffer);
while (bytesRead != -1){
byteBuffer.flip();
while(byteBuffer.hasRemaining()) {
System.out.print(charset.decode(byteBuffer));
}
byteBuffer.clear();
bytesRead = fileChannel.read(byteBuffer);
}
fileChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/239278.html
微信扫一扫
支付宝扫一扫