`
cywhoyi
  • 浏览: 421094 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

通过IO和NIO对于文件的copy

阅读更多

ExecutorService是非常好用的并发工具,在并行的环境下我们经常通过ExecutorService去回调执行任务。

ExecutorService的任务机制



 我现在有一本鸟哥私房菜的Linux书籍大约80M,我想通过3种方式(IO、NIO、NIO buffer),期待是在80ms内完成。

Solution 1: Stream Copy

 

	public static void copy(String in, String out) throws Exception {
		FileInputStream fin = new FileInputStream(in);
		FileOutputStream fout = new FileOutputStream(out);

		byte[] buf = new byte[4096];
		int read;
		while ((read = fin.read(buf)) > -1) {
			fout.write(buf, 0, read);
			if (Thread.interrupted()) {
				throw new IOException("Thread interrupted, cancelling");
			}
		}

		fin.close();
		fout.close();
	}

 print:

invokeAll finished after: 83
java.io.IOException: Thread interrupted, cancelling
	at org.dxy.nio.FileUtil.copy(FileUtil.java:29)
	at org.dxy.nio.FileUtil$1.call(FileUtil.java:73)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Future.isCancelled? true
Call really finished after: 84
Threads still active: 0

Solution 2: NIO with transfer

 

this answer at StackOverflow说过:

“Don’t use a buffer if you don’t need to. Why copy to memory if your target is another disk or a NIC? With larger files, the latency incured is non-trivial. (…) Use FileChannel.transferTo() or FileChannel.transferFrom(). The key advantage here is that the JVM uses the OS’s access to DMA (Direct Memory Access), if present. (This is implementation dependent, but modern Sun and IBM versions on general purpose CPUs are good to go.) What happens is the data goes straight to/from disc, to the bus, and then to the destination…by passing any circuit through RAM or the CPU.”

 

private static void copyNioNoBuffered(String in, String out)
			throws Exception {
		FileChannel fin = new FileInputStream(in).getChannel();
		FileChannel fout = new FileOutputStream(out).getChannel();

		fout.transferFrom(fin, 0, new File(in).length());

		fin.close();
		fout.close();
	}

 print:

 

 

invokeAll finished after: 1355
Future.isCancelled? true
java.nio.channels.ClosedByInterruptException
	at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184)
	at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:656)
	at sun.nio.ch.FileChannelImpl.transferFromFileChannel(FileChannelImpl.java:542)
	at sun.nio.ch.FileChannelImpl.transferFrom(FileChannelImpl.java:603)
	at org.dxy.nio.FileUtil.copyNioNoBuffered(FileUtil.java:42)
	at org.dxy.nio.FileUtil.access$0(FileUtil.java:37)
	at org.dxy.nio.FileUtil$1.call(FileUtil.java:73)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Call really finished after: 1373
Threads still active: 0

 Solution 3 – NIO with Buffering

 

	private static void copyNioBuffered(String in, String out) throws Exception {
		FileChannel fin = new FileInputStream(in).getChannel();
		FileChannel fout = new FileOutputStream(out).getChannel();

		ByteBuffer buff = ByteBuffer.allocate(4096);
		while (fin.read(buff) != -1 || buff.position() > 0) {
			buff.flip();
			fout.write(buff);
			buff.compact();
		}

		fin.close();
		fout.close();
	}

 print:

java.nio.channels.ClosedByInterruptException
invokeAll finished after: 85
	at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184)
	at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:152)
	at org.dxy.nio.FileUtil.copyNioBuffered(FileUtil.java:53)
Future.isCancelled? true
	at org.dxy.nio.FileUtil.access$0(FileUtil.java:48)
	at org.dxy.nio.FileUtil$1.call(FileUtil.java:73)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Call really finished after: 86
Threads still active: 0

 

  • 大小: 53.9 KB
0
4
分享到:
评论

相关推荐

    Using NIO to copy Java file fast.zip_java nio

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于标准Java IO API的I/O工作方式。NIO代表非阻塞I/O,它的核心特点是...通过学习和应用NIO,开发者能够编写出更加高效、可扩展的Java应用程序。

    NIO与零拷贝_javanio_nio和零拷贝_

    Java NIO(New IO)是Java 1.4引入的一个新特性,它是对传统IO模型的重大改进,提供了更高效的数据处理方式。NIO的核心概念包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。它允许多个输入/输出操作...

    java io读取文件

    在Java编程语言中,`IO`(Input/Output)是处理数据输入和输出的核心部分,尤其是在处理大数据量文件时显得尤为重要。Java IO API提供了一系列类和接口,使得开发者能够高效地读取、写入和操作文件。下面我们将深入...

    NIO2基础介绍

    Path类可以在任何文件系统和存储空间上操作文件,默认情况下,Path类引用默认文件系统的文件,但NIO2也是完全模块化的,可以在网络环境或虚拟文件系统中使用。 Path类简介 Path类是java.nio.file包中的一个抽象类...

    JAVA 的IO流的文件复制

    总结,Java的IO流提供了强大而灵活的文件操作功能,通过`FileInputStream`和`FileOutputStream`可以实现文件的复制,而通过递归调用可以实现整个文件夹的复制。在实际开发中,我们需要根据具体需求进行相应的异常...

    java IO流方式上传下载文件,源代码

    本篇文章将深入探讨如何使用Java IO流实现文件的上传和下载功能,以及两个已测试通过的JSP程序——`uploadDRFile.jsp`和`daoRuform.jsp`的应用。 1. **文件上传**: 文件上传通常发生在用户通过网页表单选择本地...

    java_io.rar_java 文件操作_java 读取 本地文件_java.io转动_文件操作

    本资源“java_io.rar”提供了关于如何在Java中进行文件操作的示例代码,包括读取、移动、删除和复制文件等常见任务。我们将深入探讨这些主题,以便更好地理解Java I/O API的使用。 首先,让我们从读取本地文件开始...

    Java IO commons-io-2.5.jar

    8. 零拷贝:`ByteStreams` 类中的`copy()` 方法利用NIO实现零拷贝,提高文件传输效率。 三、使用示例 例如,要复制一个文件,使用`commons-io`库可以这样编写代码: ```java import org.apache.commons.io....

    ffc.zip_FileCopy_NIO_java nio

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java程序...对于压缩包中的"ffc"文件,很可能是实现这个快速文件复制功能的Java代码,通过阅读和理解这个代码,我们可以更深入地学习和掌握Java NIO的精髓。

    java io流源代码

    - Java 1.4 引入了非阻塞IO(New IO,NIO),提供选择器(Selector)、通道(Channel)和缓冲区(Buffer)等概念,适用于高并发的IO操作。 在提供的链接中,你可能会找到关于这些概念的源代码实现,这将有助于深入...

    Java二进制IO类与文件复制操作实例

    本篇文章将深入探讨Java中的二进制IO类,并通过一个具体的文件复制操作实例来说明其应用。 1. **Java IO流基础** Java的IO流模型基于“流”的概念,数据被当作一串连续的数据流进行处理。IO流分为两类:字节流...

    基于Java的源码-二进制IO类与文件复制操作实例.zip

    例如,可以使用java.nio.file包中的Files.copy()方法,或者使用传统IO流进行复制。传统IO流的方式通常包括创建一个InputStream来读取源文件,再创建一个OutputStream来写入目标文件,然后使用循环读取和写入数据。 ...

    NIO trick and trap NIO网络

    相较于传统的IO模型,NIO通过非阻塞式I/O操作、多路复用等特性显著提升了网络应用程序的性能。本文将深入探讨NIO的基础概念、关键技巧及其潜在陷阱,并通过具体案例分析如何构建一个高效的Java NIO网络框架。 #### ...

    NIO trick and trap .pdf

    - **优雅地隔离IO代码与业务代码**:通过清晰的分层结构确保代码的可维护性和扩展性。 - **易于扩展和配置**:提供灵活的配置选项,便于调整框架行为。 总结,NIO虽然带来了显著的性能提升,但也伴随着一系列挑战。...

    java 复制文件 io流操作

    在Java编程语言中,文件复制是一项常见的任务,主要通过IO(Input/Output)流来实现。...在实际开发中,还可以考虑使用NIO(New IO)或Java 7引入的`Files.copy()` 方法,它们提供了更高效和简洁的文件操作方式。

    Java IO 编程集合

    也可以利用NIO的Files.copy方法,或者使用PipedReader和PipedWriter进行管道传输。 七、追加写入 7. FileOutputStream的append模式:如果在创建FileOutputStream时设置true,那么写入的数据将被追加到文件末尾,而...

    java的io操作源代码

    5. **Files类**:自Java 7起,新增了java.nio.file包,其中的Files类提供了更简洁、强大的文件操作API,如copy、move和delete等静态方法。 6. **FileChannel**:在NIO(非阻塞I/O)中,FileChannel用于文件的高效...

    Java对IO类File的操作

    - `CopyTextFile.java`: 显示了如何复制文本文件,可能使用了`FileInputStream`和`FileOutputStream`,或者使用了`Files.copy()`方法,这是Java NIO中的文件复制功能。 以上是对`java.io.File`类的简单介绍和应用...

Global site tag (gtag.js) - Google Analytics