Je suis en utilisant IBM Websphere Application Server v6 et Java 1.4 et suis en train d'écrire des fichiers CSV à la ServletOutputStream pour un utilisateur à télécharger. Les fichiers sont allant de 50-750 MO à l'heure actuelle.
Les fichiers plus petits ne sont pas à l'origine de trop de problème, mais avec les fichiers les plus grands, il apparaît qu'il est écrit dans le tas qui est de causer un dépassement de mémoire d'erreur et ramener l'ensemble du serveur.
Ces fichiers ne peuvent être servis à des utilisateurs authentifiés via le protocole https qui est pourquoi je suis à leur service par le biais d'un Servlet au lieu de simplement les coller dans Apache.
Le code que j'utilise est (duvet supprimé autour de ce sujet):
resp.setHeader("Content-length", "" + fileLength);
resp.setContentType("application/vnd.ms-excel");
resp.setHeader("Content-Disposition","attachment; filename=\"export.csv\"");
FileInputStream inputStream = null;
try
{
inputStream = new FileInputStream(path);
byte[] buffer = new byte[1024];
int bytesRead = 0;
do
{
bytesRead = inputStream.read(buffer, offset, buffer.length);
resp.getOutputStream().write(buffer, 0, bytesRead);
}
while (bytesRead == buffer.length);
resp.getOutputStream().flush();
}
finally
{
if(inputStream != null)
inputStream.close();
}
Le FileInputStream ne semble pas être la cause du problème, comme si j'écris à un autre fichier, ou tout simplement supprimer l'écrire complètement l'utilisation de la mémoire ne semble pas être un problème.
Ce que je pense, c'est que le reee.getOutputStream().écrire dans la mémoire jusqu'à ce que les données peuvent être envoyées par le client. De sorte que la totalité du fichier peut être lu et stocké dans le reee.getOutputStream() la cause de mes problèmes de mémoire et de s'écraser!
J'ai essayé de mise en mémoire Tampon de ces flux et également essayé d'utiliser des Canaux de java.nio, aucun ne semble faire peu de différence à mes problèmes de mémoire. J'ai également vidé le outputstream une fois par itération de la boucle, et après la boucle, ce qui n'aidait pas.