2012-03-08 3 views
2

Я пытаюсь прочитать файл 2mb в память, а затем отправить этот файл на веб-сервер. Но я получаю исключение из памяти.J2ME nokia s40 из памяти исключение

  FileConnection fileConn = (FileConnection)Connector.open("file:///" + pictureURI.getString(), Connector.READ); 
    InputStream fis = fileConn.openInputStream(); 
    long overallSize = fileConn.fileSize(); 

    int chunkSize = 2048; 
    int length = 0; 
    while (length < overallSize) 
    { 

     byte[] data = new byte[chunkSize]; 
     int readAmount = fis.read(data, 0, chunkSize); 
     byte[] newImageData = new byte[rawImage.length + chunkSize]; 
     System.arraycopy(rawImage, 0, newImageData, 0, length); 
     System.arraycopy(data, 0, newImageData, length, readAmount); 
     rawImage = newImageData; 
     length += readAmount; 

    } 
     fis.close(); 
     fileConn.close(); 

Файлы 500kb загружаются. Что может быть причиной? Прошу пролить свет на это.

Я пробовал это также в цикле, но не использовал, System.gc();

[EDIT] https://stackoverflow.com/users/45668/malcolm поставил меня на правильный путь. Теперь я ударил здесь

this.progress = progress; 

    HttpConnection conn = null; 
    OutputStream os = null; 
    InputStream s = null; 
    StringBuffer responseString = new StringBuffer(); 

    try 
    { 
    System.out.println(System.getProperty("HTTPClient.dontChunkRequests")); 
    conn = (HttpConnection)Connector.open(url); 
    //conn.setRequestProperty("User-Agent", "Profile/MIDP-2.1 Configuration/CLDC-1.1"); 
    conn.setRequestMethod(HttpConnection.POST); 

    // The messages 
    conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=---------------------------4664151417711"); 
    conn.setRequestProperty("Content-Length", "355"); 

    os = conn.openOutputStream(); 

    System.out.println("file name at upload " + fileName); 
    String message1 = ""; 
    message1 += "-----------------------------4664151417711\r\n"; 
    message1 += "Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"\r\n"; 
    message1 += "Content-Type: image/gif\r\n"; 
    message1 += "\r\n"; 

    os.write(message1.getBytes()); 

    System.gc(); 

    // Send the image 
    int index = 0; 
    int size = 2048; 
    double progdouble; 
    do 
    { 
     progdouble = ((double)index)/((double)rawImage.length) * 100; 
     progress.setValue((int)progdouble); 

     if((index+size) > rawImage.length) 
     { 
      size = rawImage.length - index; 
     } 
     os.write(rawImage, index, size); 
     index += size; 

     System.gc(); 
    } while(index < rawImage.length); 

    String message2 = "\r\n-----------------------------4664151417711\r\n"; 
    message2 += "Content-Disposition: form-data; name=\"number\"\r\n\r\n"; 
    message2 += this.user_phone_number;   

    os.write(message2.getBytes()); 

    String message3 = "\r\n-----------------------------4664151417711\r\n"; 
    message3 += "Content-Disposition: form-data; name=\"uuid\"\r\n\r\n"; 
    message3 += this.user_uuid;   

    os.write(message3.getBytes()); 

    String message4 = "\r\n-----------------------------4664151417711--\r\n"; 

    os.write(message4.getBytes()); 


    os.flush(); 
    os.close(); 

    // Read 

    s = conn.openInputStream(); 
    int ch, i = 0, maxSize = 16384; 
    while(((ch = s.read())!= -1) & (i++ < maxSize)) 
    { 
     responseString.append((char) ch); 
    } 

    conn.close(); 
    System.out.println("response =>"+responseString.toString()); 



    return responseString.toString(); 
    } 
    catch (IOException ioe) 
    { 
    return ioe.toString(); 
    } 

Теперь его неисправного здесь ..

[EDIT2]

// algorithm that will read 1024 bytes at a time 
     byte b[] = new byte[chunkSize]; 
     for (int i = 0; i < overallSize; i += chunkSize) { 

      if ((i + chunkSize) < overallSize) { 
       fis.read(b, 0, chunkSize); 
      } else { 
       int left = (int)overallSize - i; 
       fis.read(b, 0, left); 
      } 

      // writing into the output stream - (these lines will cause the "memory leak", without these, it will not happen) 
      os.write(b); 
      System.gc(); 

      progdouble = ((double)i)/((double)overallSize) * 100; 
      progress.setValue((int)progdouble); 
     } 
     os.flush(); 

Спасибо заранее.

ответ

3

Вы выделяете много новых массивов по пути, что совершенно не нужно. Каждая строка new byte[] выделяет новый массив.

Вы должны прочитать в один большой массив, и вы должны выделить его один раз, перед циклом. Вы можете легко сделать это, так как вы знаете точный размер файла. Код будет выглядеть примерно так:

FileConnection fileConn; 
InputStream is; 

try { 
    fileConn = (FileConnection) Connector.open("file:///" + pictureURI.getString(), Connector.READ); 
    is = fileConn.openInputStream(); 

    long overallSize = fileConn.fileSize(); 
    if (overallSize > Integer.MAX_VALUE) throw new IllegalArgumentException("File is too large); 
    byte[] imageData = new byte[(int) overallSize]; 
    int chunkSize = 2048; 
    int bytesReadTotal = 0; 
    while (bytesRead < overallSize) { 
     int bytesRead = is.read(imageData, bytesReadTotal, Math.min(imageData.length - bytesReadTotal, chunkSize)); 
     if (bytesRead == -1) break; 
     bytesReadTotal += bytesRead; 
    } 
} finally { 
    if (is != null) is.close(); 
    if (fileConn != null) fileConn.close(); 
} 
+0

Спасибо за ответ. Я проверю это и скоро вернусь к вам. – Venu

+0

Вы надеваете правую дорожку. Теперь я могу двигаться вперед от чтения файла, но получаю ту же ошибку при загрузке ... Пожалуйста, ознакомьтесь с этим кодом. – Venu

+0

чтение файлов в порядке, но когда я пытаюсь загрузить его, давая мне такую ​​же ошибку. Является ли это хорошим методом для чтения данных в массиве, а затем сбрасывать его или читать и нажимать мгновенно, лучше? – Venu

3

Ваш мобильный (Nokia x2-01 specs) ограничен 2Mb кучного пространства для всего приложения. Создайте приложение в соответствии с этими ограничениями. 2Mb bytearray в памяти сразу - никак.

Смежные вопросы