读取文件有多种方式,基于传统的输入流方式或基于nio的Buffer缓冲对象和管道读取方式甚至非常快速的内存映射读取文件。
java中四种读取文件方式:
1、RandomAccessFile:随机读取,比较慢优点就是该类可读可写可操作文件指针
2、FileInputStream:io普通输入流方式,速度效率一般
3、Buffer缓冲读取:基于nio Buffer和FileChannel读取,速度较快
4、内存映射读取:基于MappedByteBuffer,速度最快
RandomAccessFile读取
//RandomAccessFile类的核心在于其既能读又能写
public void useRandomAccessFileTest() throws Exception {
RandomAccessFile randomAccessFile = new RandomAccessFile(new File("e:/nio/test.txt"), "r");
byte[] bytes = new byte[1024];
int len = 0;
while ((len = randomAccessFile.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, len, "gbk"));
}
randomAccessFile.close();
}
FielInputStream读取
//使用FileInputStream文件输入流,比较中规中矩的一种方式,传统阻塞IO操作。
public void testFielInputStreamTest() throws Exception {
FileInputStream inputStream = new FileInputStream(new File("e:/nio/test.txt"));
// 使用输入流读取文件,以下代码块几乎就是模板代码
byte[] bytes = new byte[1024];
int len = 0;
while ((len = inputStream.read(bytes)) != -1) {// 如果有数据就一直读写,否则就退出循环体,关闭流资源。
System.out.println(new String(bytes, 0, len, "gbk"));
}
inputStream.close();
}
Buffer缓冲对象读取
// nio 读取
public void testBufferChannel() throws Exception {
FileInputStream inputStream = new FileInputStream(new File("e:/nio/test.txt"));
FileChannel fileChannel = inputStream.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 以下代码也几乎是Buffer和Channle的标准读写操作。
while (true) {
buffer.clear();
int result = fileChannel.read(buffer);
buffer.flip();
if (result == -1) {
break;
}
System.out.println(new String(buffer.array(), 0, result, "gbk"));
}
inputStream.close();
}
内存映射读取
public void testmappedByteBuffer() throws Exception {
FileInputStream inputStream = new FileInputStream(new File("e:/nio/test.txt"));
FileOutputStream outputStream = new FileOutputStream(new File("e:/nio/testcopy.txt"),true);
FileChannel inChannel = inputStream.getChannel();
FileChannel outChannel = outputStream.getChannel();
System.out.println(inChannel.size());
MappedByteBuffer mappedByteBuffer = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());
System.out.println(mappedByteBuffer.limit());
System.out.println(mappedByteBuffer.position());
mappedByteBuffer.flip();
outChannel.write(mappedByteBuffer);
outChannel.close();
inChannel.close();
outputStream.close();
inputStream.close();
}
//基于内存映射这种方式,这么写好像有问题。
MappedByteBuffer和RandomAcessFile这两个类要单独重点研究一下。
//TODO 大文件读取
以上就是java中如何读取文件?的详细内容,更多请关注亿速云其它相关文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。