R语言中类比C# Stream.CopyTo()的连接内容复制最优方法
在R语言中高效复制连接内容的最佳方法
这个问题提得太到位了!像你说的,手动写循环读写连接不仅代码啰嗦,还容易因为漏写关闭连接、分块逻辑出错等问题踩坑,在R里其实有几种更简洁高效的方案,不用自己重复造轮子~
方案1:自己封装通用的连接复制函数(无额外依赖)
如果你不想安装第三方包,可以把重复的分块读写逻辑封装成一个简单函数,之后调用就非常方便,用法和C#的Stream.CopyTo()很接近:
# 封装连接复制函数,默认分块大小1MB(可根据需求调整) copy_connection <- function(from_conn, to_conn, block_size = 1024 * 1024) { while(length(buffer <- readBin(from_conn, "raw", n = block_size))) { writeBin(buffer, to_conn) } invisible() # 专注执行复制操作,无返回值 } # 使用示例 file_to_be_gziped <- system.file("DESCRIPTION", package = "base") in_conn <- file(file_to_be_gziped, open = "rb", raw = TRUE) out_conn <- gzfile("DESCRIPTION.gz", open = "wb") # 一行完成复制 copy_connection(in_conn, out_conn) # 关闭连接释放资源 close(in_conn) close(out_conn)
方案2:用现成第三方包(高效省心,还带额外功能)
如果可以安装第三方包,R.utils包里的copyFile()函数已经帮你实现了优化后的连接复制逻辑——它不仅支持文件路径,还直接兼容连接对象,甚至能显示复制进度条:
library(R.utils) file_to_be_gziped <- system.file("DESCRIPTION", package = "base") in_conn <- file(file_to_be_gziped, open = "rb", raw = TRUE) out_conn <- gzfile("DESCRIPTION.gz", open = "wb") # 一行搞定复制 copyFile(in_conn, out_conn) close(in_conn) close(out_conn)
方案3:搭配连接生命周期管理(避免资源泄漏)
手动调用close()很容易忘,推荐用withr包的with_connection()函数自动管理连接生命周期,复制完成后会自动关闭连接,彻底避免资源泄漏:
library(withr) library(R.utils) file_to_be_gziped <- system.file("DESCRIPTION", package = "base") # 自动创建、使用、关闭连接,无需手动调用close() with_connection( list( in_conn = file(file_to_be_gziped, open = "rb", raw = TRUE), out_conn = gzfile("DESCRIPTION.gz", open = "wb") ), copyFile(in_conn, out_conn) )
总结
- 不想加依赖?选方案1,简洁实用;
- 追求高效和额外功能(比如进度条)?选方案2;
- 想要最安全的资源管理?搭配方案3使用。
内容的提问来源于stack exchange,提问作者jan-glx
相关产品推荐
相关产品推荐

