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


J'écris du code pour télécharger un fichier d'un client sur mon serveur et les performances ne sont pas aussi rapides que je le pense.

J'ai l'extrait de code actuel qui fait le transfert de fichiers et je me demandais comment je pourrais 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 Util 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]);
    }
}
Author: jjnguy, 2008-11-10

1 answers

Lire un seul octet à la fois sera horriblement inefficace. Vous comptez é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 peut y avoir plus à 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.)

 16
Author: Jon Skeet, 2008-11-10 07:18:46