Java IO/NIO多种读写文件方式
Java对文件的读写分为了基于阻塞模式的IO和非阻塞模式的NIO,将列举一些常用语读写文件的方式。
通常读写文件都是使用的阻塞模式,对应的是java.io.FileSystem。java.io.FileInputStream
类提供了对文件的读取功能。Java的其他读取文件的方法基本上都是封装了java.io.FileInputStream
类,如:java.io.FileReader
。
FileInputStream
使用FileInputStream实现文件读取Demo
package com.anbai.sec.filesystem;
import java.io.*;
public class FileInutStreamDemo {
public static void main(String[] args) throws IOException {
File file = new File("c:\\Windows\\win.ini");
// 打开文件对象并创建文件输入流
FileInputStream fis = new FileInputStream(file);
// 定义每次输入流读取到的字节数对象
int a = 0;
// 定义缓冲区大小
byte[] bytes = new byte[1024];
//创建二进制输出流对象
ByteArrayOutputStream out = new ByteArrayOutputStram();
// 循环读取文件内容
while ((a = fis.read(bytes)) != -1) {
//截取缓冲区数组中的内容,(bytes, 0, a)其中的0标识从bytes数组的下标0开始截取
//a标识输入流read到的字节数。
out.wirte(byte(bytes, 0, a);)
}
System.out.println(out.toString());
}
}
FileOutputStream
使用FileOutStream实现写文件Demo:
package com.anbai.sec.filesystem;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo {
public static void mian(String[] args) throws IOException {
//定义写入文件路径
File file = new File("E:\\1.txt");
//定义待写入文件内容
String content = "hello World.";
// 创建FileOutputstream对象
FileOutputStream fos = new FileOutputStream(file);
//写入二进制到文件
fos.write(content.getBytes());
fos.flush();
fos.close();
}
}
RandomAccessFile
java.io.RandomAccessFile
顾名思义,就是任意文件内容访问
特点:类似java.io.FileInputStream
一样读取文件,而且还可以写文件。
package com.anbai.sec.filesystem;
import java.io.*;
public class RandomAccessFileDemo {
public static void main(String[] args) {
File file = new File("/etc/passwd");
try {
// 创建RandomAccessFile对象,r表示以只读模式打开文件,一共有:r(只读)、rw(读写)、
// rws(读写内容同步)、rwd(读写内容或元数据同步)四种模式。
RandomAccessFile raf = new RandomAccessFile(file, "r");
// 定义每次输入流读取到的字节数对象
int a = 0;
// 定义缓冲区大小
byte[] bytes = new byte[1024];
// 创建二进制输出流对象
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 循环读取文件内容
while ((a = raf.read(bytes)) != -1) {
// 截取缓冲区数组中的内容,(bytes, 0, a)其中的0表示从bytes数组的
// 下标0开始截取,a表示输入流read到的字节数。
out.write(bytes, 0, a);
}
System.out.println(out.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileSystemProvider
JDK7新增的NIO.2的java.nio.FileSystemProvider
,利用FileSystemProvider
,可以利用支持异步的通道(channel
)模式读取文件内容。
package com.anbai.sec.filesystem;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FilesDemo {
public static void main(String[] args) {
// 通过File对象定义读取的文件路径
// File file = new File("/etc/passwd");
// Path path1 = file.toPath();
// 定义读取的文件路径
Path path = Paths.get("/etc/passwd");
try {
byte[] bytes = Files.readAllBytes(path);
System.out.println(new String(bytes));
} catch (IOException e) {
e.printStackTrace();
}
}
}