Недостаточно памяти при декодировании - PullRequest
0 голосов
/ 01 мая 2020

Я знаю, что этот вопрос такой же, как здесь: { ссылка } и есть еще несколько ответов, но я пробовал все, но каждый раз, когда появляется эта ошибка:

  at java.util.Arrays.copyOfRange(Arrays.java:3664)
    at java.lang.String.<init>(String.java:207)
    at java.lang.StringBuilder.toString(StringBuilder.java:407)
    at de.bachmaiers.cloudsystem.network.Server.byteArrayToString(Server.java:312)
    at de.bachmaiers.cloudsystem.network.Server.sendFile(Server.java:266)

И вот мой код:

@SuppressWarnings("unused")
private String byteArrayToString(File file) throws Exception { 
    // the base64 encoding - acceptable estimation of encoded size
     StringBuilder sb = new StringBuilder((int) Math.ceil(file.length() / 3 * 4));

     FileInputStream fin = null;
     try {
         fin = new FileInputStream(file);
         // Max size of buffer
         int bSize = 3 * 512;
         // Buffer
         byte[] buf = new byte[bSize];
         // Actual size of buffer
         int len = 0;

         while((len = fin.read(buf)) != -1) {
             byte[] encoded = Base64.getEncoder().encode(buf);

             // Although you might want to write the encoded bytes to another 
             // stream, otherwise you'll run into the same problem again.
             sb.append(new String(buf, 0, len));
         }
     } catch(IOException e) {
         if(null != fin) {
             fin.close();
         }
     }

     String base64EncodedFile = sb.toString(); //this is the line which causes the error 
     return base64EncodedFile;
 }  

Код клиента:

protected void startListening() {
    if(listeningThread!=null && listeningThread.isAlive()) 
        return; 
    System.out.println("Thread");
    listeningThread = new Thread(new Runnable() {

        @Override
        public void run() {
            while(!stopped) {

                try {
                    if(loginSocket !=null && !loginSocket.isConnected()) {
                        while(!loginSocket.isConnected()) {
                            repairConnection();
                            if(loginSocket.isConnected()) 
                                break; 
                            Thread.sleep(5000); 
                            repairConnection();
                        }
                    } 
                    //On Connection  
                    System.out.println("Wait for Package");
                    ObjectInputStream ois = 
                            new ObjectInputStream(new BufferedInputStream(loginSocket.getInputStream()));
                    Object raw = ois.readObject(); 


                    if(stopped) 
                        return; 
                    if(raw instanceof Datapackage) {
                        final Datapackage msg = (Datapackage) raw; 

                        for(String current: idMethods.keySet()) { 

                            if(current.equalsIgnoreCase(msg.id())) {
                                System.out.println("Message received. Executing method for "+ msg.id());
                                new Thread(new Runnable() {

                                    @Override
                                    public void run() {
                                        idMethods.get(current).run(msg, loginSocket);

                                    }
                                }).start(); 
                                break;
                            }

                        }





                    }
                } catch (SocketException e) {
                    System.out.println("[Client] Connection lost"); 
                    repairConnection();

                } catch (InterruptedException e) {

                    System.out.println("z");
                } catch (IOException e) {

                } catch (ClassNotFoundException e) {
                    System.out.println("e");
                }
            }

        }
    }); 
    listeningThread.start();
} 

Редактировать: После того, как я закодирую файл, я хочу отправить его через сокет через строку. Надеюсь, вы поможете меня.

Мой сервер имеет оперативную память 2048 МБ.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...