一、什么是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(); } } }