Java: la Lecture d'un fichier pdf à partir de l'URL dans le tableau d'Octets/ByteBuffer dans une applet
J'essaie de comprendre pourquoi ce bout de code ne fonctionne pas pour moi. J'ai une applet qui est censé lire un .pdf et de l'afficher avec un pdf-rendu de la bibliothèque, mais pour une raison quelconque, quand j'ai lu dans le .pdf fichiers qui se trouvent sur mon serveur, ils finissent par être corrompu. Je l'ai testé par écrit les fichiers de retour à nouveau.
J'ai essayé d'affichage de l'applet dans IE et Firefox et les fichiers corrompus de se produire. La chose drôle est, quand j'essaie affichage de l'applet dans Safari (pour Windows), le fichier est effectivement très bien! Je comprends la JVM peut être différent, mais je suis toujours perdu. J'ai compilé en Java 1.5. Les machines virtuelles sont de 1,6. L'extrait de code qui lit le fichier ci-dessous.
public static ByteBuffer getAsByteArray(URL url) throws IOException {
ByteArrayOutputStream tmpOut = new ByteArrayOutputStream();
URLConnection connection = url.openConnection();
int contentLength = connection.getContentLength();
InputStream in = url.openStream();
byte[] buf = new byte[512];
int len;
while (true) {
len = in.read(buf);
if (len == -1) {
break;
}
tmpOut.write(buf, 0, len);
}
tmpOut.close();
ByteBuffer bb = ByteBuffer.wrap(tmpOut.toByteArray(), 0,
tmpOut.size());
//Lines below used to test if file is corrupt
//FileOutputStream fos = new FileOutputStream("C:\\abc.pdf");
//fos.write(tmpOut.toByteArray());
return bb;
}
Je dois manquer quelque chose, et j'ai été frapper ma tête à essayer de le comprendre. Toute aide est grandement appréciée. Merci.
Edit:
Pour préciser encore ma situation, la différence dans le fichier avant que j'ai lu ensuite avec de l'extrait de code et après, c'est que ceux que j'ai sortie après la lecture sont beaucoup plus petits que ce qu'ils sont à l'origine. Lors de l'ouverture d'eux, ils ne sont pas reconnus comme .les fichiers pdf. Il n'y a aucune exception levée que j'ignore, et j'ai essayé de rinçage en vain.
Cet extrait fonctionne dans Safari, en signifiant que les fichiers sont lus dans sa globalité, avec aucune différence dans la taille, et peut être ouvert à tout .lecteur de pdf. Dans IE et Firefox, les fichiers finissent toujours par être corrompu, toujours la même taille plus petite.
J'ai surveillé la variable len (lors de la lecture d'un 59kb fichier), l'espoir de voir comment le nombre d'octets à lire dans à chaque tour de boucle. Dans IE et Firefox, à 18kb, la dans.read(buf) retourne -1 comme si le fichier est terminée. Safari ne pas faire cela.
Je vais garder à elle, et j'apprécie toutes les suggestions à ce jour.
Veuillez répondre à la 2ème partie de Eddie question. Aussi, est la valeur de contentLength correct?
OriginalL'auteur Pol | 2009-03-12
Vous devez vous connecter pour publier un commentaire.
Juste au cas où ces petits changements à faire une différence, essayez ceci:
Vous avez oublié de fermer
fos
ce qui peut entraîner dans ce fichier étant plus courte si votre demande est toujours en cours d'exécution ou est brusquement interrompu. Aussi, j'ai ajouté de la création de laByteArrayOutputStream
avec la taille initiale. (Sinon, Java ont à plusieurs reprises allouer un nouveau tableau et de copie, d'allouer un nouveau tableau et de la copie, ce qui est coûteux.) Remplacer la valeur 16384 avec une valeur plus appropriée. 16k est probablement faible pour les PDF, mais je ne sais pas comment, mais la "moyenne" de la taille, c'est que vous vous attendez à télécharger.Puisque vous utilisez
toByteArray()
deux fois (même si l'on est dans le code de diagnostic), j'ai assigné à une variable. Enfin, bien qu'il ne devrait pas faire de différence, quand vous êtes emballage de la ensemble tableau dans un ByteBuffer, vous avez seulement besoin de fournir le tableau d'octets. La fourniture de l'offset0
et la longueur est redondant.Noter que si vous téléchargez grand des fichiers PDF de cette façon, assurez-vous que votre JVM en cours d'exécution avec un assez grand tas que vous avez assez de place pour plusieurs fois, la taille de fichier plus grand que vous vous attendez à lire. La méthode que vous utilisez garde tout le fichier en mémoire, ce qui est OK aussi longtemps que vous pouvez vous permettre ce mémoire. 🙂
OriginalL'auteur Eddie
Je pensais que j'avais le même problème que vous, mais il s'est avéré que mon problème était que je suppose que vous obtenez toujours la totalité de la mémoire tampon jusqu'à ce que vous n'obtenez rien. Mais vous ne supposez pas que.
Les exemples sur le net (par exemple java2s/tutoriel) utiliser un BufferedInputStream. Mais cela ne fait aucune différence pour moi.
Vous pouvez vérifier si vous avez réellement obtenir le dossier complet dans votre boucle. Que le problème serait dans le ByteArrayOutputStream.
OriginalL'auteur openCage
Avez-vous essayé un
flush()
avant de fermer latmpOut
flux pour s'assurer que tous les octets écrits?OriginalL'auteur