Java IO/NIO多种读写文件方式

Java对文件的读写分为了基于阻塞模式的IO和非阻塞模式的NIO,将列举一些常用语读写文件的方式。

通常读写文件都是使用的阻塞模式,对应的是java.io.FileSystem。
java.io.FileInputStream类提供了对文件的读取功能。Java的其他读取文件的方法基本上都是封装了java.io.FileInputStream类,如:java.io.FileReader

FileInputStream

使用FileInputStream实现文件读取Demo

  1. package com.anbai.sec.filesystem;
  2. import java.io.*;
  3. public class FileInutStreamDemo {
  4. public static void main(String[] args) throws IOException {
  5. File file = new File("c:\\Windows\\win.ini");
  6. // 打开文件对象并创建文件输入流
  7. FileInputStream fis = new FileInputStream(file);
  8. // 定义每次输入流读取到的字节数对象
  9. int a = 0;
  10. // 定义缓冲区大小
  11. byte[] bytes = new byte[1024];
  12. //创建二进制输出流对象
  13. ByteArrayOutputStream out = new ByteArrayOutputStram();
  14. // 循环读取文件内容
  15. while ((a = fis.read(bytes)) != -1) {
  16. //截取缓冲区数组中的内容,(bytes, 0, a)其中的0标识从bytes数组的下标0开始截取
  17. //a标识输入流read到的字节数。
  18. out.wirte(byte(bytes, 0, a);)
  19. }
  20. System.out.println(out.toString());
  21. }
  22. }

FileOutputStream

使用FileOutStream实现写文件Demo:

  1. package com.anbai.sec.filesystem;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. public class FileOutputStreamDemo {
  6. public static void mian(String[] args) throws IOException {
  7. //定义写入文件路径
  8. File file = new File("E:\\1.txt");
  9. //定义待写入文件内容
  10. String content = "hello World.";
  11. // 创建FileOutputstream对象
  12. FileOutputStream fos = new FileOutputStream(file);
  13. //写入二进制到文件
  14. fos.write(content.getBytes());
  15. fos.flush();
  16. fos.close();
  17. }
  18. }

RandomAccessFile

java.io.RandomAccessFile 顾名思义,就是任意文件内容访问
特点:类似java.io.FileInputStream一样读取文件,而且还可以写文件。

  1. package com.anbai.sec.filesystem;
  2. import java.io.*;
  3. public class RandomAccessFileDemo {
  4. public static void main(String[] args) {
  5. File file = new File("/etc/passwd");
  6. try {
  7. // 创建RandomAccessFile对象,r表示以只读模式打开文件,一共有:r(只读)、rw(读写)、
  8. // rws(读写内容同步)、rwd(读写内容或元数据同步)四种模式。
  9. RandomAccessFile raf = new RandomAccessFile(file, "r");
  10. // 定义每次输入流读取到的字节数对象
  11. int a = 0;
  12. // 定义缓冲区大小
  13. byte[] bytes = new byte[1024];
  14. // 创建二进制输出流对象
  15. ByteArrayOutputStream out = new ByteArrayOutputStream();
  16. // 循环读取文件内容
  17. while ((a = raf.read(bytes)) != -1) {
  18. // 截取缓冲区数组中的内容,(bytes, 0, a)其中的0表示从bytes数组的
  19. // 下标0开始截取,a表示输入流read到的字节数。
  20. out.write(bytes, 0, a);
  21. }
  22. System.out.println(out.toString());
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }

FileSystemProvider

JDK7新增的NIO.2的java.nio.FileSystemProvider,利用FileSystemProvider,可以利用支持异步的通道(channel)模式读取文件内容。

  1. package com.anbai.sec.filesystem;
  2. import java.io.IOException;
  3. import java.nio.file.Files;
  4. import java.nio.file.Path;
  5. import java.nio.file.Paths;
  6. public class FilesDemo {
  7. public static void main(String[] args) {
  8. // 通过File对象定义读取的文件路径
  9. // File file = new File("/etc/passwd");
  10. // Path path1 = file.toPath();
  11. // 定义读取的文件路径
  12. Path path = Paths.get("/etc/passwd");
  13. try {
  14. byte[] bytes = Files.readAllBytes(path);
  15. System.out.println(new String(bytes));
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }