0

我正在编写一个涉及文件上传的 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();
            }
    }
4

2 回答 2

1

您不必一次将整个文件复制到字节数组中。

这更好,并且永远不会导致内存问题(您永远不会使用超过 8 kB 的内存):

byte[] myByteArray = new byte[8192];
int len;
...
while ((len = bufferedInputStream.read(mByteArray, 0, len)) != -1)
    outputStream.write(mByteArray, 0, len);
于 2013-06-14T13:18:41.877 回答
0

就在这里。

它被称为依赖注入:http ://en.wikipedia.org/wiki/Dependency_injection

创建这个接口

public interface ISocket{
    void close():
    OutputStream getOutputStream();
}

并确保您的套接字类继承自它。

你的构造函数变成

private void sendToRemoteServer(){
     ISocket client;

当您想在本地进行测试时,只需将 ISocket 的任何实现作为参数传递,该实现可以使用 close 方法和 getOutputStream 方法执行您想要的任何操作。

于 2013-06-14T12:46:56.500 回答