9 votes

Quelle est la meilleure façon de transférer un fichier en utilisant Java ?

Je suis en train d'écrire un code pour télécharger un fichier d'un client vers mon serveur et les performances ne sont pas aussi rapides qu'elles devraient l'être.

J'ai le bout de code actuel qui effectue le transfert de fichiers et je me demandais comment je pouvais accélérer le transfert.

Désolé pour tout le code :

InputStream fileItemInputStream ;
OutputStream saveFileStream;
int[] buffer;
while (fileItemInputStream.available() > 0) {
    buffer = Util.getBytesFromStream(fileItemInputStream);
    Util.writeIntArrToStream(saveFileStream, buffer);
}
saveFileStream.close();
fileItemInputStream.close();

Les méthodes utilitaires sont les suivantes :

public static int[] getBytesFromStream(InputStream in, int size) throws IOException {
    int[] b = new int[size];
    int count = 0;
    while (count < size) {
        b[count++] = in.read();
    }
    return b;
}

et :

public static void writeIntArrToStream(OutputStream out, int[] arrToWrite) throws IOException {
    for (int i = 0; i < arrToWrite.length; i++) {
        out.write(arrToWrite[i]);
    }
}

16voto

Jon Skeet Points 692016

La lecture d'un seul octet à la fois sera terriblement inefficace. Vous vous appuyez également sur available ce qui est rarement une bonne idée. (Il retournera 0 s'il n'y a pas d'octets actuellement disponibles, mais il pourrait y en avoir d'autres à venir).

C'est le bon type de code pour copier un flux :

public void copyStream(InputStream input, OutputStream output) throws IOException
{
    byte[] buffer = new byte[32*1024];
    int bytesRead;
    while ((bytesRead = input.read(buffer, 0, buffer.length)) > 0)
    {
        output.write(buffer, 0, bytesRead);
    }
}

(L'appelant doit fermer les deux flux).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X