我正在编写涉及文件上传的Android应用程序。有没有什么办法可以检查代码是否存在潜在的内存不足错误而实际编写服务器端代码?如果是,请解释。代码如下:
private void sendToRemoteServer(){
Socket client;
FileInputStream fileInputStream;
BufferedInputStream bufferedInputStream;
OutputStream outputStream;
try{
client = new Socket("10.0.2.2",444);
byte[] myByteArray = new byte[(int)mFile.length()];
fileInputStream = new FileInputStream(mFile);
bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedInputStream.read(myByteArray, 0, myByteArray.length); //read the file
outputStream = client.getOutputStream();
outputStream.write(myByteArray, 0, myByteArray.length); //write file to the output stream byte by byte
outputStream.flush();
bufferedInputStream.close();
outputStream.close();
client.close();
}catch(UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
您不必一次将整个文件复制到字节数组中。
这样更好,永远不会导致内存问题(你永远不会使用超过8 kB的内存):
byte[] myByteArray = new byte[8192];
int len;
...
while ((len = bufferedInputStream.read(mByteArray, 0, len)) != -1)
outputStream.write(mByteArray, 0, len);
答案 1 :(得分:0)
是的,有。
它被称为依赖注入:http://en.wikipedia.org/wiki/Dependency_injection
创建此界面
public interface ISocket{
void close():
OutputStream getOutputStream();
}
确保你的套接字类没有它。
您的构造函数变为
private void sendToRemoteServer(){
ISocket client;
当你想在本地进行测试时,只需将任何使用close方法和getOutputStream方法执行任何操作的ISocket实现作为参数传递。