根据以下链接:
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);
}
}
}
答案 0 :(得分:0)
此技术未针对Android进行优化,可能会运行不佳。惯例是使用AndroidHttpClient:
使用合理的默认设置和Android注册方案配置的Apache DefaultHttpClient的子类,还允许用户添加HttpRequestInterceptor类。
如果你真的想使用上面的Sun代码,你应该小心,因为当文件大小超过应用程序可用的堆空间量时,你可能会超过VM堆预算。
首先使用ActivityManager检查是否有足够的堆空间是明智的。另请参阅the elaborate answer to this question。
修改强>
我found an example通过POST发送一个InputStream。此处正在从资源(res/data.xml
)中读取文件,但您可以使用代码段中的InputStream
替换FileInputStream
。将InputStream
转换为字节数组与代码基本相同:将整个文件读入内存并将其推送到请求中。这是OutOfMemoryError
s的臭名昭着的原因,因此请注意不要读取太大的文件(我建议不要超过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
}
}