搜索
首页类库下载java类库Java文件I/O的三种方法

之前在面试中被问到过两次Java中文件读入输出怎么写,当时只记得一个大概,没有办法很清晰的说出一个条理,今天特地看出总结了一下这方面的内容,想要写出来给大家分享。

首先文件读入输出流常用有三种:FileInputStream/FileOutputStream,FileReader/FileWriter,RandomAccessFile。下面具体列出一些简单的例子参考:

基础篇:

1.

FileRead fr = new FileReader(filename);  
String s;  
while( (s=fr.readLine())!=null){  
...  
}  
fr.close();  
//FileWriter同理,输出时可用write()函数  
//Java I/O中所有的Reader、Writer都是面向字符流的输出输出

2.

FileInputStream fi =new FileInputStream(filename);  
int in;  
while( (in=fi.read())!=-1){  
...  
}  
fi.close();  
//FileOutputStream同理  
//Java I/O中所有的Reader、Writer都是面向字节流的输出输出

3.

RandomAccessFile ra =new RandomAccessFile(filename,"rw");//后面的参数指定的是  
打开文件流的方式,“rw”是指读写,“r”是只读,Java不提供只写  
ra.seek(number);//将文件指针移动到number处,这里文件指针可以理解为文件开始读的位置  
ra.skipByte(number);//跳过number个字节  
ra.read();  
ra.close();  
//RandomAccessFile既可以读也可以写,而且可以利用seek()函数指定位置

下面是百度百科的一些介绍:

RandomAccessFile是不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至都没有用InputStream和OutputStream已经准备好的功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类。

进阶篇:

在nio中,Java重新实现了I/O流,并且引入了一些新的方法来提高速度。我主要介绍通道、内存映射文件

1.通道:

通道和缓冲器是一个成对的概念,Thinking in Java中的一个例子特别好理解:我们把想要读入的文件看作一个煤矿,数据就是我们想要的煤炭。通道好比是传送煤矿的传送带,我们没有办法直接从传送带上拿走煤炭,只好利用卡车来装载这些煤炭,卡车就是缓冲器,它主要负责从通道中取出数据,传给我们写的程序。唯一能与通道交互的缓冲器是ByteBuffer。可以看出和通道支持的解析流的方式是字节流。所以它配套使用的是FileInputStream/FileOutputStream,RandomAccessFile

例子:

a.

FileChannel fc =new FileOutputStream(filename).getChannel();  
fc.write(ByteBuffer.wrap("something test".getBytes() ));//这里使用ByteBuffer比较简单,其实ByteBuffer可以利用个put()函数写入byte数组  
fc.close();

b.

fc= new FileOutputStream(filename).getChannel();  
ByteBuffer buff = ByteBuffer.allocate(size);//没错,ByteBuffer是不提供显示构造函数的,想要新建一个对象必须利用allocate()函数来分配空间。  
fc.read(buff);  
fc.close();

为什么想到要用通道来做I/O呢?主要考虑的是性能问题,通道加缓冲器能够让程序一些读写一定量的字符,而只使用InputStream/OutputStream,Reader/Writer只能一次读写一个字节/字符。而程序在进行I/O时要交给操作系统去解决这部分功能(调用系统调用),减少交给操作系统的次数可以有效的消减I/O花费的时间

2.内存映射文件:

内存映射文件主要的意思其实假定将文件都放入内存中,把它当作非常大的数组来访问,效率特别好。为什么比较好呢?这要从Java虚拟机和操作系统开始说起le(其实我也不太懂,刚才看了一篇文章讲的比较清晰,链接是http://www.360doc.com/content...)这篇文章主要介绍了Java I/O的原理以及内存映射文件的原理。我尝试概括一下:Java I/O主要的实现手段肯定是利用系统调用,而系统调用先将想要使用的文件从硬盘调入到内核的I/O缓冲区中,这次会导入比Java程序想要的文件更多的内容(拷入更多的内容是因为程序的局部性原理,能够得到更好的效率),然后再从内核的I/O缓冲区导入到Java进程自己的私有内存空间中。而内存映射文件放弃了两次拷贝的方法,直接将Java进程的虚拟空间与文件对象构成一个映射,当私有内存空间中找不打想要的内容时发生缺页异常,然后利用更底层的系统调用解决这个问题(其实在I/O的系统调用中也涉及到了缺页异常处理),好处就是减少了一次从内核I/O缓冲区到进程私有地址的开销。

例子:

FileChannel fc = new RandomAccessFile(filename,"rw").getChannel();  
MappedByteBuffer mb = fc.map(FileChannel.MapMode.READ_WRITE,start,length);  
mb.put((byte)'x');  
mb.get();  
fc.close();

写到这里突然想到在《孔乙己》中“茴”的4中写法,现在Java打开文件也有了至少五种方法了,每一种都一各有利弊。以后也可以穿着长袍问别人你知道Java读写文件的5种方法么

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版