package my;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.io.Writer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* 文件拷贝各种方式的比较
*
*/
public class TestFile {
public final static String FILE_PATH ="D:\\电影\\[电影天堂www.dy2018.com]特殊身份BD中英双字.mkv";
//public final static String FILE_PATH = "F:\\apache-tomcat-7.0.11\\webapps\\ROOT\\a.rar";
public final static String FILE_PATH_OUT = "D:\\哈哈.mkv";
public static void TransByCommonIoStream() throws Exception {
long beginTime = System.currentTimeMillis();
FileInputStream fis = new FileInputStream(new File(FILE_PATH));
FileOutputStream fos = new FileOutputStream(new File(FILE_PATH_OUT));
byte[] b = new byte[1024];
int len = 0;
while ((len = fis.read(b)) != -1) {
fos.write(b, 0, len);
}
fos.flush();
fis.close();
fos.close();
long endTime = System.currentTimeMillis();
System.out.println("采用传统IO FileInputStream 读取,耗时:"
+ (endTime - beginTime));
}
public static void TransByCommonIoBufferedStream() throws Exception {
long beginTime = System.currentTimeMillis();
FileInputStream fis = new FileInputStream(new File(FILE_PATH));
FileOutputStream fos = new FileOutputStream(new File(FILE_PATH_OUT));
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] b = new byte[1024];
int len = 0;
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
}
bos.flush();
fis.close();
fos.close();
bis.close();
bos.close();
long endTime = System.currentTimeMillis();
System.out.println("采用传统IO BufferedInputStream 读取,耗时:"
+ (endTime - beginTime));
}
public static void TransByCommonIoBuffered() throws Exception {
long beginTime = System.currentTimeMillis();
Reader br = new BufferedReader(new FileReader(new File(FILE_PATH)));
Writer bw = new BufferedWriter(new FileWriter(new File(FILE_PATH_OUT)));
char[] c = new char[1024];
int len = 0;
while ((len = br.read(c)) != -1) {
bw.write(c, 0, len);
}
bw.flush();
br.close();
bw.close();
long endTime = System.currentTimeMillis();
System.out.println("采用传统IO BufferedReader 读取,耗时:"
+ (endTime - beginTime));
}
public static void TransByRandomAccFile() throws Exception {
long beginTime = System.currentTimeMillis();
FileInputStream fis = new FileInputStream(new File(FILE_PATH));
RandomAccessFile raf = new RandomAccessFile(new File(FILE_PATH_OUT),
"rw");
byte[] b = new byte[1024];
int len = 0;
while ((len = fis.read(b)) != -1) {
raf.write(b, 0, len);
}
long endTime = System.currentTimeMillis();
System.out.println("采用传统IO RandomAccessFile 读取,耗时:"
+ (endTime - beginTime));
}
/**
* 采用FileChannel 自带方法测试 public abstract long
* transferFrom(ReadableByteChannel src, long position, long count) throws
* IOException;
*/
public static void TransByNioFileChannel() throws Exception {
long beginTime = System.currentTimeMillis();
FileChannel fc = new FileInputStream(new File(FILE_PATH)).getChannel();
// FileChannel fco = new RandomAccessFile(new File(FILE_PATH_OUT), "rw").getChannel();
FileChannel fco = new FileOutputStream(new File(FILE_PATH_OUT)).getChannel();
fco.transferFrom(fc, 0, fc.size());
long endTime = System.currentTimeMillis();
System.out.println("采用NIO FileChannel 自带方法 读取,耗时:"
+ (endTime - beginTime));
}
public static void TransByNioFileChannelCommon() throws Exception {
long beginTime = System.currentTimeMillis();
FileChannel fc = new FileInputStream(new File(FILE_PATH)).getChannel();
FileChannel fco = new RandomAccessFile(new File(FILE_PATH_OUT), "rw")
.getChannel();
ByteBuffer buf = ByteBuffer.allocate(1024);
while (fc.read(buf) != -1) {
buf.flip();
fco.write(buf);
buf.clear();
}
long endTime = System.currentTimeMillis();
System.out.println("采用NIO FileChannel 循环 读取,耗时:"
+ (endTime - beginTime));
}
public static void deleteFile() {
File f = new File(FILE_PATH_OUT);
if (f.exists())
f.delete();
}
public static void main(String[] args) throws Exception {
TransByCommonIoStream();
deleteFile();
TransByCommonIoBufferedStream();
deleteFile();
TransByRandomAccFile();
deleteFile();
TransByNioFileChannel();
deleteFile();
TransByNioFileChannelCommon();
deleteFile();
}
}
/**测试结果*/
采用传统IO FileInputStream 读取,耗时:11393
采用传统IO BufferedInputStream 读取,耗时:1191
采用传统IO RandomAccessFile 读取,耗时:2929
采用NIO FileChannel 自带方法 读取,耗时:485
采用NIO FileChannel 循环 读取,耗时:2502
分享到:
相关推荐
总的来说,Java NIO与零拷贝技术的结合,为开发者提供了更高效率、更低资源消耗的I/O处理手段,尤其在处理大数据和高并发场景时,其优势更为明显。理解并掌握这些知识,对于提升Java应用程序的性能至关重要。
使用 io和nio 各个方式进行文件拷贝; 使用nio+byteBuffer 实现按行读取文件(大文件),在window/linux/macOS上均测试通过,对于中文乱码也已处理成功 完整注释,可随需求更改 有问题请邮件:mly610865580@126.com
传统的IO操作通常直接在流与数据源之间进行,而NIO则引入了缓冲区,数据先被写入缓冲区,再由缓冲区批量读写到通道或文件中。这样减少了数据拷贝次数,提高了效率。Buffer提供了诸如容量、限制、位置等概念,方便了...
在Java中,NIO2(New IO 2)是Java 7引入的一组新API,极大地扩展了Java的I/O功能,特别是在文件操作方面。NIO2引入了许多改进,包括异步文件操作、文件系统感知以及更强大的文件拷贝功能。本示例将详细讲解如何使用...
NIO引入了通道(Channel)和缓冲区(Buffer)的概念,可以实现多线程间的零拷贝,提高文件复制效率。例如,使用`FileChannel`进行文件复制的代码如下: ```java import java.io.IOException; import java.nio....
- 复制大文件时,可能需要考虑使用缓冲区优化性能,例如增加缓冲区大小或使用NIO(New IO)的`FileChannel`进行更高效的传输。 - 文件复制过程中应考虑到并发控制,特别是在多线程环境中,避免文件操作冲突。 总结...
1. **文件操作**:在Java中,我们可以使用`java.io`或`java.nio`包下的类进行文件操作。例如,`File`类用于文件和目录路径名的表示,`FileInputStream`和`FileOutputStream`用于读写文件,`Files`类提供了一套静态...
6. **性能优化**:当拷贝数千个文件时,一次性处理所有文件可能导致内存溢出。因此,可以采用多线程或异步处理,分批处理文件,以降低内存压力。另外,合理设置缓冲区大小,根据网络带宽和服务器性能调整,以达到...
在这个示例中,我们将深入探讨如何使用NIO.2进行文件和目录的拷贝与移动操作。 首先,`copeOrMoveFile`方法接受源文件路径、目标路径以及操作类型(拷贝或移动)。它通过调用`realCopeOrMoveFile`方法来执行实际...
确保在拷贝文件时不会破坏原始数据,同时优化拷贝速度,可以提高整体的程序性能。此外,对于网络文件拷贝,还涉及到网络协议(如FTP、SFTP、HTTP/HTTPS)和安全性问题,需要考虑加密和身份验证。 总之,“实例83_...
进度显示的关键在于跟踪已拷贝的文件数量或大小,与总数量或总大小进行比较。可能的实现方式是在每次成功拷贝一个文件后,增加一个计数器或者累加文件大小,然后根据这个比例更新进度条或百分比。这通常需要一个...
1. 阻塞与非阻塞:IO是阻塞的,而NIO是非阻塞的。IO在读写过程中会阻塞线程,直到操作完成;NIO则允许线程在等待数据时去做其他事情,提高系统效率。 2. 缓冲区:IO直接对流进行读写,而NIO引入了缓冲区概念,数据...
今天我们将深入探讨“IO进程线程Day5”中的核心知识点,包括文件夹拷贝、从文件读取数据到内存以及内存到文件的写入,以及父子进程间的消息传递。 首先,让我们关注文件夹拷贝这一过程。文件夹拷贝不仅仅是简单的...
在拷贝单个文件时,我们可以使用`java.nio.file.Files`类提供的`copy()`方法,它提供了简单且高效的文件复制功能。但若要拷贝整个目录及其子目录,我们需要递归处理每个文件和子目录。以下是一个基础的文件拷贝工具...
上述代码虽然能完成文件复制,但每次只读取和写入1KB的数据,可能会比较慢。通过使用缓冲流(如`BufferedInputStream`和`BufferedOutputStream`),我们可以一次性读取和写入更大的数据块,从而提高效率。 6. **...
要实现局域网文件拷贝,我们需要使用Java的I/O流(InputStream和OutputStream)以及网络套接字(Socket)或NIO(New IO)的FileChannel。以下是一个简单的步骤概述: 1. **确定目标路径**:获取局域网内目标文件的...