`
itace
  • 浏览: 180838 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

文件复制管道流

 
阅读更多

 

/**
	 * 复制大文件,1G+
	 * @param src
	 * @param dest
	 */
	public static void copyBigFile(File src, File dest) {
		FileInputStream fin = null;
		FileOutputStream fout = null;
		FileChannel in = null;
	    FileChannel out = null;
		try {
			//缓冲区--设置了100m
			ByteBuffer byteBuf = ByteBuffer.allocate(1024*1024*100);
			
			fin = new FileInputStream(src);
			fout = new FileOutputStream(dest);
			in = fin.getChannel();
		    out = fout.getChannel();
		    
		    while (true) {
				int eof = in.read(byteBuf);
				if (eof == -1)
					break;
				byteBuf.flip();
				out.write(byteBuf);
				byteBuf.clear();
			}
		    
			in.close();
			out.close();
			fin.close();
			fout.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (in!=null) {
					in.close();
				}
				if (out!=null) {
					out.close();
				}
				if (fin!=null) {
					fin.close();
				}
				if (fout!=null) {
					fout.close();
				}
			} catch (Exception e2) {
//				e2.printStackTrace();
			}
		}
	}
	//管道复制,500M以上内存溢出map failed
	public static void copyChannel(File src,File dest){
		FileInputStream fin = null;
		FileOutputStream fout = null;
		FileChannel in = null;
	    FileChannel out = null;
		try {
			fin = new FileInputStream(src);
			fout = new FileOutputStream(dest);
			in = fin.getChannel();
		    out = fout.getChannel();
		    in.transferTo(0, in.size(), out);
			in.close();
			out.close();
			fin.close();
			fout.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (in!=null) {
					in.close();
				}
				if (out!=null) {
					out.close();
				}
				if (fin!=null) {
					fin.close();
				}
				if (fout!=null) {
					fout.close();
				}
			} catch (Exception e2) {
//				e2.printStackTrace();
			}
		}
	}
	public static void copy(File src,File dest){
		try {
			InputStream in = new FileInputStream(src);
			OutputStream out = new FileOutputStream(dest);
			int c = -1;
			while ((c=in.read())!=-1) {
				out.write(c);
			}
			in.close();
			out.close();
		} catch (Exception e) {
//			e.printStackTrace();
		}
	}

 

分享到:
评论

相关推荐

    Java实现文件复制,File文件读取,写入,IO流的读取写入

    Java还提供了`PipedInputStream`和`PipedOutputStream`用于创建管道流,允许数据在两个线程间传递。另外,通过`InputStreamReader`和`OutputStreamWriter`,可以将字节流转换为字符流,方便处理不同编码的文本。 6...

    操作系统文件复制

    通过分析代码,我们可以看到如何将上述理论知识应用到实际的文件复制操作中,包括如何处理I/O流、如何管理内存、如何处理权限和异常等。通过编写和调试代码,学生可以更深入地理解操作系统的内部工作原理。 ...

    Java管道流.pdf

    此外,它也可以作为其他高级I/O操作的基础,如在处理网络数据流或文件复制时,管道流可以作为一个中间层,方便数据的传递。 6. 与共享数据的区别 管道流的通信方式不同于传统的共享数据空间,如使用volatile变量或...

    文件字节IO流例子代码.rar

    实际的示例代码可能会包含这些概念的实际应用,也可能涵盖其他高级特性,如管道流(PipedInputStream和PipedOutputStream),或者装饰模式下的过滤流(如CheckedInputStream和PushbackInputStream)。要深入了解,你需要...

    window 管道

    - 匿名管道的读写端自动连接,通常由父进程创建管道后,通过继承或复制管道句柄给子进程。 5. **读写操作**: - 使用ReadFile和WriteFile函数对管道进行读写操作。需要注意的是,当没有数据可读或缓冲区已满时,...

    匿名管道程序

    - DuplicateHandle():可能用到的函数,用于在子进程中复制管道句柄,以便子进程能访问管道。 - CreateProcess():创建子进程,同时传递管道句柄。 - WriteFile() / ReadFile():分别用于写入和读取管道数据的函数。...

    匿名管道例子

    `fork()`函数复制父进程的所有资源,包括管道。然后,父进程关闭读端,子进程关闭写端,这样父子进程就可以分别通过未关闭的端口进行通信了。 `input.txt`文件可能被用来作为父进程写入管道的数据源。在程序运行时...

    io流详解代码

    - 使用`java.nio.file.Files`类的`copy`方法可以方便地实现文件复制,也可以通过字节流或字符流的组合实现复制,例如使用`FileInputStream`和`FileOutputStream`。 4. **对象序列化与反序列化**: - Java的序列化...

    操作系统报告(管道通信)

    它允许进程之间共享数据流,通过一个临时的、匿名的管道来传递信息。在本实验中,我们将探讨如何使用系统调用pipe()创建管道,以及如何通过fork()创建子进程,实现父子进程之间的通信。 **实验目的** 1. **理解...

    进程的管道通信 操作系统 课程设计

    数据在管道内以字节流的形式传输,一次只能由一个进程读取或写入。 2. **管道类型**:在Unix/Linux系统中,有无名管道(unnamed pipe)和命名管道(named pipe, 或FIFO)两种。无名管道主要用于父子进程间的通信,...

    操作系统-管道通信课程设计

    2. 文件描述符的管理和重定向:`dup()`和`dup2()`用于复制和重定向文件描述符,确保数据流向正确。 3. 进程间同步:使用`waitpid()`或`wait()`函数等待子进程结束,或者使用信号量、互斥锁等同步机制确保数据安全...

    进程间通信,通过Pipe管道实现

    `fork()`会复制父进程的所有资源,包括管道的文件描述符。 3. **指定读写角色**:父进程通常关闭写端(fd[1]),以便只读取数据;子进程则关闭读端(fd[0]),只负责写入数据。 4. **数据传输**:父子进程通过未关闭...

    Linux实验八:LinuxC-编程-IO-重定向和管道.doc

    在Linux系统中,I/O重定向和管道是两种重要的进程间通信(IPC)方式,它们允许我们改变程序的标准输入、输出和错误流,或者在不同的进程中传递数据。本实验主要涵盖了这两个主题,通过编写和运行C语言程序来实践。 ...

    Java输入输出流

    管道流允许在不同线程间传递数据,常用于多线程编程中的数据通信。 ### 标准流 Java预定义了三个标准流:`System.in`(标准输入)、`System.out`(标准输出)和`System.err`(错误输出)。它们通常与键盘、显示器和...

    anonymousPipe(实用匿名管道实现进程之间的通信)

    在创建子进程时,可以选择将管道的读端或写端句柄复制到子进程中。 3. 数据传输:子进程使用写端句柄写入数据,父进程使用读端句柄读取数据。由于管道是单向的,所以数据只能从一个方向流动。 4. 关闭句柄:当数据...

    Java_IO.rar_IO流 java_java io流

    此外,Java 7引入了Files类,提供更简洁的copy()方法进行文件复制。 7. **修改文件**:对于文本文件,可以先读取内容,然后对读取到的数据进行修改,最后再写回文件。而对于二进制文件,修改通常意味着重新创建整个...

    java io流源代码

    - **InputStreamReader** 和 **BufferedReader** 结合使用,配合 **PrintWriter** 和 **OutputStreamWriter** 可以实现高效的文件复制。 9. 字符集编码: - Java支持多种字符编码,如UTF-8、GBK等,通过 `Charset...

    进程间通信——匿名管道

    5. 文件描述符传递:在创建管道后,父进程通过复制文件描述符的方式将管道传递给子进程。 在实际应用中,创建匿名管道的步骤通常如下: 1. 父进程调用pipe()系统调用,创建一对文件描述符,一个用于读,一个用于写...

    进程通信--匿名管道

    `fork()`会复制父进程的所有资源,包括已打开的文件描述符。因此,子进程也会拥有管道的两个文件描述符。 3. 数据传输:通常,父进程关闭读取端口,子进程关闭写入端口,以防止数据的反向流动。然后,父进程可以...

    Linux进程的管道通信

    值得注意的是,管道被视为无记录边界的字节流通信。 ##### 4. 关闭管道:`close`函数 管道的关闭是通过`close`函数完成的,其函数原型如下: ```c int close(int filedes); ``` 关闭管道的一端会直接影响另一端...

Global site tag (gtag.js) - Google Analytics