在 Java 中复制数据的更快方法?

2024-01-09

我接到一项从服务器复制数据的任务。我在用BufferedInputStream和输出流来复制数据,我正在逐字节地进行。尽管它正在运行,但复制数据需要很长时间,因为其中一些数据有 100 MB,所以它肯定不会工作。任何人都可以建议我使用逐字节复制的任何替代方法,以便我的代码可以复制几百 MB 的文件。 缓冲区为2048。

我的代码如下所示:

static void copyFiles(SmbFile[] files, String parent) throws IOException {

  SmbFileInputStream input = null;
  FileOutputStream output = null;
  BufferedInputStream buf_input = null;
  try {
    for (SmbFile f : files) {
      System.out.println("Working on files :" + f.getName());
      if (f.isDirectory()) {

        File folderToBeCreated = new File(parent+f.getName());
        if (!folderToBeCreated.exists()) {
          folderToBeCreated.mkdir();
          System.out.println("Folder name " + parent
                + f.getName() + "has been created");
        } else {
          System.out.println("exists");

        }

        copyFiles(f.listFiles(), parent +  f.getName());
      } else {

        input = (SmbFileInputStream) f.getInputStream();

        buf_input = new BufferedInputStream(input, BUFFER);

        File t = new File(parent + f.getName());
        if (!t.exists()) {
          t.createNewFile();
        }
        output = new FileOutputStream(t);

        int c;

        int count;
        byte data[] = new byte[BUFFER];

        while ((count = buf_input.read(data, 0, BUFFER)) != -1) {
          output.write(data, 0, count);
        }
      }
    }
  } catch (IOException e) {
    e.printStackTrace();

  } finally {
    if (input != null) {
      input.close();
    }
    if (output != null) {
      output.close();
    }
  }
}

这里有一个链接到一个优秀的帖子 http://thomaswabner.wordpress.com/2007/10/09/fast-stream-copy-using-javanio-channels/解释如何使用nio用于制作流副本的通道。它引入了一个辅助方法ChannelTools.fastChannelCopy可以让你像这样复制流:

final InputStream input = new FileInputStream(inputFile);
final OutputStream output = new FileOutputStream(outputFile);
final ReadableByteChannel inputChannel = Channels.newChannel(input);
final WriteableByteChannel outputChannel = Channels.newChannel(output);
ChannelTools.fastChannelCopy(inputChannel, outputChannel);
inputChannel.close();
outputChannel.close()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中复制数据的更快方法? 的相关文章

  • Java 访问被拒绝

    C Program Files x86 Java jdk1 6 0 17 bin gt javac VendingMachine java VendingMachine java 27 error while writing Vending
  • 如何为带有未确定的“?”的Java通用Map添加值值类型?

    我在 JDK 8 示例中看到过这种声明 Map
  • Java 区域设置区分大小写

    我有以下代码来显示当前区域设置 System out println Locale getDefault System out println new Locale en US 上面给出的输出如下 en US en us 如何构造一个 Lo
  • log4j2 SMTP Appender:如何包含另一个级别的先前消息?

    我正在使用 log4j2 beta9 并且有以下配置 其中一部分
  • 正则表达式查找两个字符之间的内部匹配

    环境 Java 我想匹配两个字符串之间的字符 这是一个例子 foo
  • Gradle中的build-by-convention深度解释是什么?

    The 摇篮用户指南 http www gradle org docs current userguide userguide html经常提到 Gradle 是陈述性的和用途按惯例构建 这是什么意思 据我了解 这意味着 例如 在java插
  • 在 Spring Security 中创建自定义 PostAuthorize 方法

    我正在尝试创建一个自定义方法 用于预 后授权调用 如下所示 public class CustomLSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandl
  • 在 Retrofit 中的 POST 请求中发送空正文

    我的 api 需要一个空的 json 主体 发出帖子请求时 如何在 Retrofit 和 Jackson 中进行设置 我尝试通过null 和空字符串 以及 但无法让它发挥作用 POST my url Call
  • 从两个数组中查找公共文件

    我正在尝试从两个数组中查找通用名称文件 我已将两个不同文件夹的文件名保存在两个不同的数组中 现在我正在创建一个通用文件数组 其中包含具有通用名称的文件 filenames 1 包含文件夹 1 中文件名称的数组 filename2 包含文件夹
  • 在同一个容器但不同的耳朵中使用本地EJB

    我正在尝试在同一个 Glassfish 但不同的耳朵中使用本地 EJB 但是Glassfish找不到本地EJB或者无法消费 我读到了这个 根据 JavaEE 教程 Local bean 的客户端 必须在与其访问的企业 bean 相同的 JV
  • Java检测音频文件(mp3)

    我有这段代码可以读取 mp3 文件 import java io File import java io IOException import javax sound sampled AudioSystem import javax sou
  • 无法安装 JDK 9,因为“另一个 Java 安装正在进行中”

    我已经在 Windows 10 x64 上使用 JDK 9 一段时间了 但是当我去安装最新的早期版本 b174 时 我首先卸载了以前的版本 像往常一样 然后运行新的安装程序 它失败并显示一个消息框 显示 另一个 Java 安装正在进行中 您
  • c3p0 Java 数据库池、故障转移配置

    当数据库关闭时 IP 和端口会自动切换到另一个数据库服务器 我应该如何配置 Web 应用程序的 c3p0 连接池以遵循此数据库故障转移机制 目前 我使用的是 c3p0 但是在上次数据库故障转移中 池连接无法重新建立 请求失败后重新建立 有助
  • 错误:找不到符号 ArrayList

    我正在尝试创建某种列表来存储数组 表 中的值 我在这里使用数组列表 但我应该使用列表吗 但是 每次我尝试编译时 它都会引发以下错误 找不到标志 符号 ArrayList类 位置 玩家类 TablePlayer 代码如下 public cla
  • Eclipse java 断点 - 目的是什么?

    我正在学习 Android 教程 刚刚进入调试部分 我想知道断点的用途是什么 我还不能告诉 它实际上停止了应用程序 以便我可以确定它运行到该点 或者我可以设置多个断点并将它们用作标记来从断点到断点检查 停止和运行 我的代码 断点是执行停止的
  • 是否有适合 Java 1.4 和 SE (Swing) 应用程序的优秀 DI 框架?

    我正在寻找一个适用于在 JDK 1 4 下运行的 Java SE Swing 应用程序的依赖注入框架 有没有我可以使用的推荐 DI 框架 Guice 和其他基于注释的框架已经退出 我不想搞乱像 Retroweaver 这样的东西 另外 Sp
  • Java 需要一个 FileSet 包/类

    任何人都可以建议 Java 中的 FileSet 包 类吗 我所说的 FileSet 是指文件和目录的集合以及正则表达式支持的包含和排除规则 类似于 Apache Ant 谢谢 Apache 公共 IO文件工具 http commons a
  • 从java小程序获取正确的本地IP地址

    我想从我的 java 小程序确定本地 IP 地址 问题是当同一台机器上有多个 IP 地址时 该机器具有 LAN 和互联网连接 掌上电脑 VMWare 这是我的测试 public static void main String args tr
  • Spring MVC 和复选框

    我正在使用 Spring MVC 3 0 并且不能完全看到这个问题的所有部分 我的控制器将生成一个域对象列表 假设有一个简单的 User 对象 具有firstName lastName age 和role 属性 我想在表中输出该用户列表 每
  • java银行程序帐户ID不上去?

    每次创建银行帐户时 帐户 ID 都应增加 1 但每次我尝试提取 Id 时 我只会得到帐户 ID 为 0 任何建议 因为我完全按照我学习的书中的方式进行操作而且它仍然没有更新 帐户构造函数 public class BankAccount p

随机推荐

  • 有没有办法在 minizinc 中自定义 int_search ?

    我正在处理图形着色问题 想知道是否可以指定搜索策略 我找到了搜索注释 比如int search q first fail indomain min 但例如 我希望算法选择具有最高节点度数的下一个节点 假设这会导致更快的失败 因为具有高度数的
  • Prolog (SWI-Prolog) 中谓词“simple/1”的含义是什么

    我在看书时遇到了问题 我看到一个程序使用谓词 简单 我猜simple 1 我不知道这个谓词的含义是什么 我找不到它 help simple 在控制台中 但是当我在控制台中尝试一些查询时 它的工作原理如下 5 simple p x false
  • 如何向函数传递数组文字?

    如何传递数组而不使其成为单独的变量 例如我知道这有效 class Test public static void main String args String arbitraryStrings foo takesStringArray a
  • Angularjs 可以在多个 ng-app 中重用一个服务吗

    我正在尝试创建一个将使用多个角度ng应用程序的网络应用程序 并且至少两个可以使用相同的服务代码 它们不需要共享数据 但它们执行类似的功能 那么我如何避免代码重复 那是 myApp1 factories factory myservice f
  • 表中的 html 表有效吗?

    在html中 表内有表是否有效 table tr td table tr td td tr table td tr tr tr table 是的 完全有效 通过将您所拥有的内容粘贴到 W3C 验证器中 唯一的错误是关于文档类型 头标签等 没
  • 用纯Java学习JavaCV [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在努力学习JavaCV 众所周知 缺乏这方面的教材是一个很大的问题 在JavCV主页上 他们为 O
  • React Native开发服务器返回响应错误代码500

    错误 捆绑失败 错误 无法解析模块 react transform hmr lib index js from P React Native TryReactNative App js 模块 react transform hmr lib
  • ExponentialBackoffRetry 如何与 Azure 函数的 ServiceBus 触发器配合使用?

    我想在我的Azure函数中实现一个非常简单的行为 如果在处理过程中出现异常 我想推迟下一次重试一段时间 据我所知 在服务总线中没有直接的可能性 例如 除非创建一条新消息 但服务总线触发器有可能ExponentialBackoffRetry
  • “mean_squared_error”的负值

    我正在使用 scikit 并使用mean squared error作为 cross val score 中模型评估的评分函数 rms score cross validation cross val score model X y cv
  • 将多个列表 传递到 ArrayAdapter

    我从 活动 中开始 adapter new ItemAdapter Items this items totals setListAdapter adapter 现在这是 ItemAdapter public class ItemAdapt
  • 如何打开.sqlite-wal

    我想从 Mac 应用程序导出我的 Shazamed 标签 该应用程序不提供任何导出选项 Mac 版 Shazam 将它们存储在 sqlite 3 数据库中 该应用程序正在生成 3 个文件 ShazamDataModel sqlite Sha
  • 如何使用 MinGW 在 Windows 中构建 Google 的 protobuf?

    我使用 Code Blocks 作为 MingW 的 IDE 我正在尝试使用谷歌协议缓冲区 但我在构建 protobuf 时遇到了麻烦 protobuf 的自述文件说 如果您使用 Cygwin 或 MinGW 按照上面的 Unix 安装说明
  • 从 Netbeans 项目中删除文件,但不从硬盘中删除文件

    我的项目文件夹中有很多文件 但我不想将它们全部放在我的 Netbeans 项目中 Netbeans 还会使用更多内存和时间自动扫描它们 有没有办法从 Netbeans 项目中排除文件 文件夹 使用 Netbeans 7 3 的解决方案 在
  • 如何在 jquery 中创建查询字符串?

    我被困在这个问题上 我想在动态过滤器上创建查询字符串 现在我已经添加了过滤器类型Select your favorite sports and Select your favorite food 所以将来将会有更多的过滤器 并且只会出现在复
  • 创建 UNIX shell

    我想为 UNIX 创建一个迷你 shell 只是为了了解一切的来龙去脉 我对过去认为理所当然的事情有些困惑 这是一个有点哲学的问题 当我创建一个 shell 时 我假设我有一个没有 shell 的 UNIX 那么在这种情况下 std in
  • 串行或并行:Robo 测试实验室的设备测试顺序

    当我在 Robo 测试实验室上使用多个物理设备运行测试配置时 从 firebase 控制台或通过将应用程序上传到 Play 商店 这些设备是并行运行还是串行运行 如果设备并行运行 由于测试设备之间共享相同的设置参数 我的机器人设置脚本将无法
  • 在 Windows 与 Mac 上更改 ggplot2 中的字体

    我在 Mac 上使用 ggplot2 创建了一个绘图 我将字体更改为 Times New Roman 效果很好 library extrafont ggplot data df stat density aes x R1 colour rh
  • 将查找和替换对话框重置为 Visual Studio 中的当前文档

    有没有办法在 Visual Studio 中强制 查找 和 替换 对话框自动选择当前文件在 查找范围 下拉列表中 它应该仅在重新打开对话框时执行此操作 我经常忘记从整个解决方案或项目切换回来 最终浪费了大量时间等待 VS 搜索包括设计器文件
  • Kotlin 1.2.50 要求提供 baseFeatureInfoDir

    当我切换 Android 项目时 classpath com android tools build gradle 3 2 0 alpha18 to classpath org jetbrains kotlin kotlin gradle
  • 在 Java 中复制数据的更快方法?

    我接到一项从服务器复制数据的任务 我在用BufferedInputStream和输出流来复制数据 我正在逐字节地进行 尽管它正在运行 但复制数据需要很长时间 因为其中一些数据有 100 MB 所以它肯定不会工作 任何人都可以建议我使用逐字节