java中的File文件读写操作
之前有好几次碰到文件操作方面的问题,大都由于时间太赶而没有好好花时间去细致的研究研究。每次都是在百度或者博客或者论坛里面參照着大牛们写的步骤照搬过来,之后再次碰到又忘记了。刚好今天比較清闲。于是就在网上找了找Java经常使用的file文件操作方面的资料。之后加以一番整理。现分享给大家。
直接上源代码吧。
package com.file; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date; /**
* file operate
* @author ruanpeng
* @time 2014-11-11上午9:14:29
*/
public class OperateFileDemo { private DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS");
private Date start_time = null;//開始时间
private Date end_time = null;//结束时间 public static void main(String[] args) {
OperateFileDemo demo = new OperateFileDemo();
demo.operateFile1();
demo.operateFile2();
demo.operateFile3();
demo.fileCopy1();
demo.fileCopy2();
} /**
* the first method of reading file
*/
public void operateFile1(){
start_time = new Date();
File f = new File("E:"+File.separator+"test.txt");//File.separator——windows is '\'。unix is '/'
try {
//创建一个流对象
InputStream in = new FileInputStream(f);
//读取数据,并将读取的数据存储到数组中
byte[] b = new byte[(int) f.length()];//数据存储的数组
int len = 0;
int temp = 0;
while((temp = in.read()) != -1){//循环读取数据,未到达流的末尾
b[len] = (byte) temp;//将有效数据存储在数组中
len ++;
} System.out.println(new String(b, 0, len, "GBK"));
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
end_time = new Date();
System.out.println("==============第一种方式——start_time:"+df.format(start_time));
System.out.println("==============第一种方式——end_time:"+df.format(end_time));
System.out.println("==============第一种方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒");
}
} /**
* the second method of reading file
*/
public void operateFile2(){
start_time = new Date();
File f = new File("E:"+File.separator+"test.txt");
try {
InputStream in = new FileInputStream(f);
byte[] b = new byte[1024];
int len = 0;
while((len = in.read(b)) != -1){
System.out.println(new String(b, 0, len, "GBK"));
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
end_time = new Date();
System.out.println("==================另外一种方式——start_time:"+df.format(start_time));
System.out.println("==================另外一种方式——end_time:"+df.format(end_time));
System.out.println("==================另外一种方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒");
}
} /**
* the third method of reading file(文件读取(Memory mapping-内存映射方式))
* 这样的方式的效率是最好的,速度也是最快的,由于程序直接操作的是内存
*/
public void operateFile3(){
start_time = new Date();
File f = new File("E:"+File.separator+"test.txt");
try {
FileInputStream in = new FileInputStream(f);
FileChannel chan = in.getChannel();//内存与磁盘文件的通道,获取通道,通过文件通道读写文件。 MappedByteBuffer buf = chan.map(FileChannel.MapMode.READ_ONLY, 0, f.length());
byte[] b = new byte[(int) f.length()];
int len = 0;
while(buf.hasRemaining()){
b[len] = buf.get();
len++;
}
chan.close();
in.close();
System.out.println(new String(b,0,len,"GBK"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
end_time = new Date();
System.out.println("======================第三种方式——start_time:"+df.format(start_time));
System.out.println("======================第三种方式——end_time:"+df.format(end_time));
System.out.println("======================第三种方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒");
}
} /**
* the first method of copying file
*/
public void fileCopy1(){
start_time = new Date();
File f = new File("E:"+File.separator+"test.txt");
try {
InputStream in = new FileInputStream(f);
OutputStream out = new FileOutputStream("F:"+File.separator+"test.txt");
int len = 0;
while((len = in.read()) != -1){
out.write(len);
}
out.close();
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
end_time = new Date();
System.out.println("======================第一种文件复制方式——start_time:"+df.format(start_time));
System.out.println("======================第一种文件复制方式——end_time:"+df.format(end_time));
System.out.println("======================第一种文件复制方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒");
}
} /**
* 使用内存映射实现文件复制操作
*/
public void fileCopy2(){
start_time = new Date();
File f = new File("E:"+File.separator+"test.txt");
try {
FileInputStream in = new FileInputStream(f);
FileOutputStream out = new FileOutputStream("F:"+File.separator+"test2.txt");
FileChannel inChan = in.getChannel();
FileChannel outChan = out.getChannel();
//开辟缓冲区
ByteBuffer buf = ByteBuffer.allocate(1024);
while ((inChan.read(buf)) != -1){
//重设缓冲区
buf.flip();
//输出缓冲区
outChan.write(buf);
//清空缓冲区
buf.clear();
}
inChan.close();
outChan.close();
in.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
end_time = new Date();
System.out.println("======================另外一种文件复制方式——start_time:"+df.format(start_time));
System.out.println("======================另外一种文件复制方式——end_time:"+df.format(end_time));
System.out.println("======================另外一种文件复制方式总耗时:"+(end_time.getTime() - start_time.getTime())+"毫秒");
}
}
}
说明:
前面三种方法是关于文件的读取操作,第一种和另外一种是比較常见的普通方式,第三种则是採用内存映射的模式。这样的模式是直接操作内存。效率是最快的,后面两种是关于文件的读取和写入操作。
这就是上面的程序执行的结果,上面说到第三种方式是直接面向内存的,效率是最快的,但是我们发现第三种的执行结果却还没有另外一种方式快,详细的原因我还没有进行深入探究,并且我的文件容量也比較小,看不出什么本质的效果,并且这个也不过读取操作,但最后的那个文件复制操作效果就相当明显了。不不过读取操作。同一时候还涉及到了文件的写操作,普通的复制方式须要105毫秒。而採用内存映射的方式只只须要1毫秒。效果立刻明晓了。
至于读操作的效率问题有兴趣的朋友能够去深入探究一番。
原文出处:http://www.open-open.com/lib/view/open1415448427183.html
java中的File文件读写操作的更多相关文章
- Java 字符流实现文件读写操作(FileReader-FileWriter)
Java 字符流实现文件读写操作(FileReader-FileWriter) 备注:字符流效率高,但是没有字节流底层 字节流地址:http://pengyan5945.iteye.com/blog/ ...
- java学习(九) —— java中的File文件操作及IO流概述
前言 流是干什么的:为了永久性的保存数据. IO流用来处理设备之间的数据传输(上传和下载文件) java对数据的操作是通过流的方式. java用于操作流的对象都在IO包中. java IO系统的学习, ...
- java中实现File文件的重命名(renameTo)、将文件移动到其他目录下、文件的复制(copy)、目录和文件的组合(更加灵活方便)
欢迎加入刚建立的社区:http://t.csdn.cn/Q52km 加入社区的好处: 1.专栏更加明确.便于学习 2.覆盖的知识点更多.便于发散学习 3.大家共同学习进步 3.不定时的发现金红包(不多 ...
- JAVA基于缓冲的文件读写操作
File f2 = new File("e://index.java"); BufferedReader reader = new BufferedReader(new Input ...
- java文件读写操作类
借鉴了项目以前的文件写入功能,实现了对文件读写操作的封装 仅仅需要在读写方法传入路径即可(可以是绝对或相对路径) 以后使用时,可以在此基础上改进,比如: 写操作: 1,对java GUI中文本框中的内 ...
- Java 字节流实现文件读写操作(InputStream-OutputStream)
Java 字节流实现文件读写操作(InputStream-OutputStream) 备注:字节流比字符流底层,但是效率底下. 字符流地址:http://pengyan5945.iteye.com/b ...
- [转]Android - 文件读写操作 总结
转自:http://blog.csdn.net/ztp800201/article/details/7322110 Android - 文件读写操作 总结 分类: Android2012-03-05 ...
- Kotlin入门(27)文件读写操作
Java的文件处理用到了io库java.io,该库虽然功能强大,但是与文件内容的交互还得通过输入输出流中转,致使文件读写操作颇为繁琐.因此,开发者通常得自己重新封装一个文件存取的工具类,以便在日常开发 ...
- Kotlin入门-文件读写操作
转 https://blog.csdn.net/aqi00/article/details/83241762 Java的文件处理用到了io库java.io,该库虽然功能强大,但是与文件内容的交互还得通 ...
随机推荐
- bzoj 1061~1065【Noi2008】解题报告
这次Noi好像格外喜欢树形DpQAQ P.S.好像这次的题都与图有关QAQ bzoj1061[Noi2008]志愿者招募:上下界可行最小费用流 bzoj1062[Noi2008]糖果雨:数形结合&am ...
- java面试题之synchronized和lock有什么区别
synchronized和lock的区别: 类别 synchronized lock 存在层次 java的关键字,在jvm层面上 是一个类 锁的释放 1.以获取锁的线程执行完同步代码,释放锁 2.线程 ...
- hdu 4305 生成树计数问题
Lightning Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 【kindeditor】kindeditor的使用
官网:http://kindeditor.net/demo.php 效果:
- 标准C程序设计七---32
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- HTTP PUT方法和POST方法的区别
这两个方法看起来都是讲一个资源附加到服务器端的请求,但其实是不一样的.一些狭窄的意见认为,POST方法用来创建资源,而PUT方法则用来更新资源.这个说法本身没有问题,但是并没有从根本上解释了二者的区别 ...
- LeetCode OJ——Word Ladder2
http://oj.leetcode.com/problems/word-ladder-ii/ class Solution { public: vector<vector<string& ...
- Codeforces 946 B.Weird Subtraction Process
B. Weird Subtraction Process time limit per test 1 second memory limit per test 256 megabytes inpu ...
- 被动路由跟踪工具InTrace
被动路由跟踪工具InTrace InTrace是一款类似于Traceroute的路由跟踪工具.但它不同的是,他不主动发送数据包,而是通过监听当前主机和目标主机的数据包,进行分析,从而获取路由信息. ...
- jenkins集群节点构建maven(几乎是坑最多的)
业务量变大时,单台的jenkins进行自动化构建部署,就显得没那么灵活,jenkins的集群并非像web服务器.mysql集群那样,jenkins的集群无需在额外的主机安装jenkins,但是用于ja ...