2010-05-20 8 views
0

J'ai une application web avec une applet qui va copier un fichier compressé avec l'applet sur la machine client.getResourceAsStream renvoie HttpInputStream pas du fichier entier

Lorsque je le déploie sur le serveur Web et que j'utilise: InputStream in = getClass(). GetResourceAsStream ("filename"); Le fichier in.available() renvoie toujours une taille de 8192 octets pour chaque fichier que j'ai essayé, ce qui signifie que le fichier est corrompu lorsqu'il est copié sur l'ordinateur client. L'InputStream est de type HttpInputStream (sun.net.protocol.http.HttpUrlConnection $ httpInputStream)

Mais pendant que je teste l'applet dans la visionneuse d'applet, les fichiers sont bien copiés, avec le InputStream retourné est de type BufferedInputStream, qui a les tailles d'octets du fichier. Je suppose que lorsque getResourceStream dans le système de fichiers, le BufferedInputStream sera utilisé et quand au protocole http, HttpInputStream sera utilisé.

Comment est-ce que je copie complètement le dossier, est-ce qu'il y a une taille limitée pour HttpInputStream? Merci beaucoup.

Répondre

3

in.available() indique le nombre d'octets que vous pouvez lire sans bloquer, et non le nombre total d'octets que vous pouvez lire dans un flux.

Voici un exemple de copie d'un InputStream à un OutputStream de org.apache.commons.io.IOUtils:

public static long copyLarge(InputStream input, OutputStream output) 
     throws IOException { 
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
    long count = 0; 
    int n = 0; 
    while (-1 != (n = input.read(buffer))) { 
     output.write(buffer, 0, n); 
     count += n; 
    } 
    return count; 
} 
+0

Merci Tdavies, j'étais capable de copier le fichier. –

1

Le in.available() renvoient toujours une taille de 8192 octets pour chaque fichier que j'ai essayé, ce qui signifie que le fichier est corrompu lorsqu'il est copié sur l'ordinateur client.

Cela ne veut pas dire du tout! La méthode in.available() renvoie le nombre de caractères pouvant être lus sans blocage. Ce n'est pas la longueur du flux. En général, il n'y a aucun moyen de déterminer la longueur d'un InputStream en dehors de lire (ou sauter) tous les octets dans le flux.

(Vous avez sans doute observé que new FileInputStream("someFile").available() vous donne généralement la taille du fichier. Mais ce comportement est pas garantie par la spécification, et est certainement faux pour certains types de fichiers, et peut-être pour certains types de système de fichiers, ainsi Une meilleure façon d'obtenir la taille d'un fichier est new File("someFile").length(), mais même cela ne fonctionne pas dans certains cas.)

Voir @tdavies répondre par exemple du code pour copier le contenu d'un flux entier. Il y a aussi des bibliothèques tierces qui peuvent faire ce genre de chose; par exemple. org.apache.commons.net.io.Util.

+0

Salut, merci Stephen. –