Android 上传到网络驱动器(samba 共享)性能问题

Android upload to network drive(samba share) performance issue

我在将 100kb 的图片从我的平板电脑上传到 JCIFS 的 samba 共享时遇到问题,大约需要 10-20 分钟(在我从 1024 to 20971520 更改缓冲区之前,它需要将近 6 小时),但增加它不再产生任何效果

这不是连接问题,因为我已经用 ES File 测试了它,它立即上传了我的照片

private class MyCopy extends AsyncTask<String, String, String> {

    String z = "";
    String username = "", password = "", servername = "", filestocopy = "";

    @Override
    protected void onPreExecute() {   
            username = edtusername.getText().toString();
            password = edtpassword.getText().toString();
            servername = "smb://" + edtservername.getText().toString();
            filestocopy = editdir.getText().toString();
        }

       protected String doInBackground(String... params) {
   //         String buffer;
  //          buffer = setingPreferences.getString("buffer", "");
            File file = new File(filestocopy);
            String filename = file.getName();

            NtlmPasswordAuthentication auth1 = new NtlmPasswordAuthentication(
                    servername, username, password);

            try {

                SmbFile sfile = new SmbFile(servername + "/" + filename, auth1);
                if (!sfile.exists())
                    sfile.createNewFile();
                sfile.connect();

                InputStream in = new FileInputStream(file);

                SmbFileOutputStream sfos = new SmbFileOutputStream(sfile);

                byte[] buf = new byte[20971520]; //(parseInt(buffer))
                int len;
                while ((len = in.read(buf)) > 0){
                    sfos.write(buf, 0, len);

                }
                in.close();
                sfos.close();

                z = "File copied successfully";
            } catch (Exception ex) {

                z = z + " " + ex.getMessage().toString();
            }

            return z;
        }
    }

缓冲区大小应该不会有明显差异,但绝对不应该是 20M。改用 4k 之类的东西。

您确定真正的文件传输花费了这么长时间吗?没有理由 100k 最多需要几秒钟。您是否尝试过在每个步骤之间放置日志语句,包括身份验证调用之前和之后,createNewFile()connect() 以检查这些是否是瓶颈?

此外,我认为您应该在读取长度为 >= 0 而不是严格的 > 0 时复制字节,因为 -1 表示流结束,而不是 0。

你尝试了吗

new SmbFile("username:password@server/")

而不是使用 NTLM?也可能是 DNS 问题,所以试试

jcifs.Config.setProperty("resolveOrder", "DNS");

如果两者都不起作用,您可能想用 SmbFileOutputStream 试试 BufferedOutputStream