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

时间:2016-09-17 14:45:45

标签: android image-uploading smb jcifs

当我从平板电脑上将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;
        }
    }

2 个答案:

答案 0 :(得分:0)

缓冲区大小不应该有明显的差异,但绝对不应该是20M。使用像4k这样的东西。

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

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

答案 1 :(得分:0)

你试过吗

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

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

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

如果两者都不起作用,您可能希望BufferedOutputStream尝试使用SmbFileOutputStream