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,该库虽然功能强大,但是与文件内容的交互还得通 ...
随机推荐
- Android默认输入法语言的修改以及SettingsProvider作用
Android源码中默认的有三种输入法:英文,中文,日文.对应的工程代码路径为:<android_root>/packages/inputmethods/LatinIME/<andr ...
- 你能说出SQL聚集索引和非聚集索引的区别吗?
最近突然想起前一阵和一朋友的聊天,当时他问我的问题是一个非常普通的问题:说说SQL聚集索引和非聚集索引的区别. AD:WOT2015 互联网运维与开发者大会 热销抢票 其实对于非专业的数据库操作人员来 ...
- 第一个 spring Boot 应用通过Docker 来实现构建、运行、发布
1. Docker 简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙 ...
- 理解 Glance
OpenStack 由 Glance 提供 Image 服务. 理解 Image 要理解 Image Service 先得搞清楚什么是 Image 以及为什么要用 Image? 在传统 IT 环境下, ...
- 23深入理解C指针之---数组的基础
数组是c语言内置的数据结构,数组有一维数组.二维数组和多维数组.使用数组传递数组时,必须传入数组的大小. 一.数组的特征:阐明数组的特点 1.数组要素: 1).数组类型:数组中存储的数据的类型: 2) ...
- docker mysql 导入导出数据
导出数据 1.导出mysql单张表结构和数据: docker exec -it my-mysql mysqldump dbname -uroot -p123456 --tables tname > ...
- hdu 5019(第K大公约数)
Revenge of GCD Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- XA事务与MySQL
XA事务就是两阶段提交的一种实现方式 XA规范主要定义了事务管理器TM,和资源管理器RM之间的接口 根据2PC的规范,将一次事务分割成两个阶段 1. prepare阶段 TM向所有RM发送prepar ...
- Java 经典笔试题
这些题目对我的笔试帮助很大,有需要的朋友都可以来看看,在笔试中能遇到的题目基本上下面都会出现,虽然形式不同,当考察的基本的知识点还是相同的. 在分析中肯定有不足和谬误的地方还请大虾们能够给予及时的纠正 ...
- (49)C# npoi-word
//新建段落 XWPFParagraph p1 = doc.CreateParagraph(); //对齐方式 p1.SetAlignment(ParagraphAlignment.LEFT); p1 ...