Я знаю, что этот вопрос такой же, как здесь: { ссылка } и есть еще несколько ответов, но я пробовал все, но каждый раз, когда появляется эта ошибка:
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 МБ.
Спасибо