/** * 复制大文件,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还提供了`PipedInputStream`和`PipedOutputStream`用于创建管道流,允许数据在两个线程间传递。另外,通过`InputStreamReader`和`OutputStreamWriter`,可以将字节流转换为字符流,方便处理不同编码的文本。 6...
通过分析代码,我们可以看到如何将上述理论知识应用到实际的文件复制操作中,包括如何处理I/O流、如何管理内存、如何处理权限和异常等。通过编写和调试代码,学生可以更深入地理解操作系统的内部工作原理。 ...
此外,它也可以作为其他高级I/O操作的基础,如在处理网络数据流或文件复制时,管道流可以作为一个中间层,方便数据的传递。 6. 与共享数据的区别 管道流的通信方式不同于传统的共享数据空间,如使用volatile变量或...
实际的示例代码可能会包含这些概念的实际应用,也可能涵盖其他高级特性,如管道流(PipedInputStream和PipedOutputStream),或者装饰模式下的过滤流(如CheckedInputStream和PushbackInputStream)。要深入了解,你需要...
- 匿名管道的读写端自动连接,通常由父进程创建管道后,通过继承或复制管道句柄给子进程。 5. **读写操作**: - 使用ReadFile和WriteFile函数对管道进行读写操作。需要注意的是,当没有数据可读或缓冲区已满时,...
- DuplicateHandle():可能用到的函数,用于在子进程中复制管道句柄,以便子进程能访问管道。 - CreateProcess():创建子进程,同时传递管道句柄。 - WriteFile() / ReadFile():分别用于写入和读取管道数据的函数。...
`fork()`函数复制父进程的所有资源,包括管道。然后,父进程关闭读端,子进程关闭写端,这样父子进程就可以分别通过未关闭的端口进行通信了。 `input.txt`文件可能被用来作为父进程写入管道的数据源。在程序运行时...
- 使用`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()`函数等待子进程结束,或者使用信号量、互斥锁等同步机制确保数据安全...
`fork()`会复制父进程的所有资源,包括管道的文件描述符。 3. **指定读写角色**:父进程通常关闭写端(fd[1]),以便只读取数据;子进程则关闭读端(fd[0]),只负责写入数据。 4. **数据传输**:父子进程通过未关闭...
在Linux系统中,I/O重定向和管道是两种重要的进程间通信(IPC)方式,它们允许我们改变程序的标准输入、输出和错误流,或者在不同的进程中传递数据。本实验主要涵盖了这两个主题,通过编写和运行C语言程序来实践。 ...
管道流允许在不同线程间传递数据,常用于多线程编程中的数据通信。 ### 标准流 Java预定义了三个标准流:`System.in`(标准输入)、`System.out`(标准输出)和`System.err`(错误输出)。它们通常与键盘、显示器和...
在创建子进程时,可以选择将管道的读端或写端句柄复制到子进程中。 3. 数据传输:子进程使用写端句柄写入数据,父进程使用读端句柄读取数据。由于管道是单向的,所以数据只能从一个方向流动。 4. 关闭句柄:当数据...
此外,Java 7引入了Files类,提供更简洁的copy()方法进行文件复制。 7. **修改文件**:对于文本文件,可以先读取内容,然后对读取到的数据进行修改,最后再写回文件。而对于二进制文件,修改通常意味着重新创建整个...
- **InputStreamReader** 和 **BufferedReader** 结合使用,配合 **PrintWriter** 和 **OutputStreamWriter** 可以实现高效的文件复制。 9. 字符集编码: - Java支持多种字符编码,如UTF-8、GBK等,通过 `Charset...
5. 文件描述符传递:在创建管道后,父进程通过复制文件描述符的方式将管道传递给子进程。 在实际应用中,创建匿名管道的步骤通常如下: 1. 父进程调用pipe()系统调用,创建一对文件描述符,一个用于读,一个用于写...
`fork()`会复制父进程的所有资源,包括已打开的文件描述符。因此,子进程也会拥有管道的两个文件描述符。 3. 数据传输:通常,父进程关闭读取端口,子进程关闭写入端口,以防止数据的反向流动。然后,父进程可以...
值得注意的是,管道被视为无记录边界的字节流通信。 ##### 4. 关闭管道:`close`函数 管道的关闭是通过`close`函数完成的,其函数原型如下: ```c int close(int filedes); ``` 关闭管道的一端会直接影响另一端...