0

根据下面的链接:

http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/

如果您自己进行缓冲(即,您自己处理缓冲,而不是使用 BufferedInputStream),则可以加快位图(或任何文件)的加载。

特别是,方法 4 看起来很有希望(一次吞下整个文件)。但是,我不知道如何在android中实现它。这是Java代码:

import java.io.*;

public class readfile {
 public static void main(String args[]) {
  if (args.length != 1) {
    System.err.println("missing filename");
    System.exit(1);
  }
  try {
    int len = (int)(new File(args[0]).length());
    FileInputStream fis =
        new FileInputStream(args[0]);
    byte buf[] = new byte[len];
    fis.read(buf);
    fis.close();
    int cnt = 0;
    for (int i = 0; i < len; i++) {
      if (buf[i] == '\n')
        cnt++;
    }
    System.out.println(cnt);
  }
  catch (IOException e) {
    System.err.println(e);
  }
 }

}

4

1 回答 1

0

此技术未针对 Android 进行优化,并且可能运行不佳。约定是使用AndroidHttpClient

Apache DefaultHttpClient 的子类,配置了合理的默认设置和 Android 注册方案,还允许用户添加 HttpRequestInterceptor 类。

如果你真的想使用上面的 Sun 的代码,你应该小心,因为当文件大小超过应用程序可用的堆空间量时,你可能会超过 VM 堆预算。

首先使用ActivityManager检查是否有足够的堆空间是明智的。另请参阅此问题的详细答案

编辑:

我找到了一个通过 POST 发送 InputStream的示例。这里正在从资源 ( res/data.xml) 中读取文件,但您可以将 替换为InputStream代码FileInputStream段中的 。将 转换InputStream为字节数组与您的代码基本相同:将整个文件读入内存并将其推送到请求中。这是OutOfMemoryErrors 的一个臭名昭著的原因,因此请注意不要读取太大的文件(我建议小于 1 MB)。

public void executeMultipartPost() throws Exception {
    try {
        InputStream is = this.getAssets().open("data.xml");
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost postRequest = new HttpPost("http://w3mentor.com/Upload.aspx");
        byte[] data = IOUtils.toByteArray(is);
        InputStreamBody isb = new InputStreamBody(new ByteArrayInputStream(data),"uploadedFile");
        StringBody sb1 = new StringBody("someTextGoesHere");
        StringBody sb2 = new StringBody("someTextGoesHere too");
        MultipartEntity multipartContent = new MultipartEntity();
        multipartContent.addPart("uploadedFile", isb);
        multipartContent.addPart("one", sb1);
        multipartContent.addPart("two", sb2);
        postRequest.setEntity(multipartContent);
        HttpResponse res = httpClient.execute(postRequest);
        res.getEntity().getContent().close();
    } catch (Throwable e) {
        // handle exception here
    }
}
于 2011-06-04T12:27:13.327 回答