InputStream à servletInputStream
J'ai cette InputStream:
InputStream inputStream = new ByteArrayInputStream(myString.getBytes(StandardCharsets.UTF_8));
Comment puis-je convertir cette ServletInputStream?
J'ai essayé:
ServletInputStream servletInputStream = (ServletInputStream) inputStream;
mais ne fonctionnent pas.
EDIT:
Ma méthode est: est-ce
private static class LowerCaseRequest extends HttpServletRequestWrapper {
public LowerCaseRequest(final HttpServletRequest request) throws IOException, ServletException {
super(request);
}
@Override
public ServletInputStream getInputStream() throws IOException {
ServletInputStream servletInputStream;
StringBuilder jb = new StringBuilder();
String line;
String toLowerCase = "";
BufferedReader reader = new BufferedReader(new InputStreamReader(super.getInputStream()));
while ((line = reader.readLine()) != null) {
toLowerCase = jb.append(line).toString().toLowerCase();
}
InputStream inputStream = new ByteArrayInputStream(toLowerCase.getBytes(StandardCharsets.UTF_8));
servletInputStream = (ServletInputStream) inputStream;
return servletInputStream;
}
}
Im essayant de convertir tous mes demande en minuscules.
À partir de quel paquet est
il fait partie de la Servlet Java API, ne faisant pas partie de la norme de la plate-forme Java. La Servlet API a un autre schéma de contrôle de version, par exemple la dernière version au moment de l'écriture est de 3.1. Donc il n'a pas tellement d'importance qui version de Java que vous utilisez (par exemple, 5, 6, 7, 8), mais plus de la version de la Servlet API que vous utilisez (et quelle version de votre conteneur prend en charge).
ServletInputStream
s'il vous plaît ? Semble être supprimés dans java8.il fait partie de la Servlet Java API, ne faisant pas partie de la norme de la plate-forme Java. La Servlet API a un autre schéma de contrôle de version, par exemple la dernière version au moment de l'écriture est de 3.1. Donc il n'a pas tellement d'importance qui version de Java que vous utilisez (par exemple, 5, 6, 7, 8), mais plus de la version de la Servlet API que vous utilisez (et quelle version de votre conteneur prend en charge).
OriginalL'auteur Goldbones | 2015-05-27
Vous devez vous connecter pour publier un commentaire.
Essayer ce code.
Si vous passez outre cette méthode, vous devez remplacer les autres (
close
, etc..).Il est abstrait, mais cette réponse illustre l'instanciation d'une classe abstraite par la mise en œuvre de la méthode abstraite à l'aide d'un anonyme intérieur de la classe, donc c'est OK. Cependant, nous ne sommes pas censés créer nos propres instances de ServletInputStream, nous devrions obtenir à partir d'un ServletRequest que par ma réponse.
Wawoo, c'est génial 🙂 Merci aksappy
OriginalL'auteur aksappy
Mon conseil: ne pas créer la
ByteArrayInputStream
, il suffit d'utiliser le tableau d'octets que vous avez obtenu à partir de lagetBytes
méthode déjà. Cela devrait être suffisant pour créer unServletInputStream
.Plus solution de base
Malheureusement, aksappy la réponse de l'remplace uniquement les
read
méthode. Alors que cela peut être suffisant dans le Servlet API 3.0 et ci-dessous, dans les versions ultérieures de Servlet API il y a trois plus de méthodes que vous avez à mettre en œuvre.Voici mon implémentation de la classe, même si avec il devient assez long (en raison des nouvelles méthodes introduites dans l'API Servlet 3.1), vous voudrez peut-être penser à l'affacturage dans une imbriquées ou même de haut niveau de classe.
L'ajout prévu méthodes
En fonction de vos besoins, vous pouvez également remplacer les autres méthodes. Comme romfret l'a souligné, il est conseillé de remplacer certaines méthodes, telles que
close
etavailable
. Si vous n'avez pas à les mettre en œuvre, le flux sera toujours le rapport qu'il y a 0 octets disponible pour la lecture, et laclose
méthode ne modifient en rien l'état de flux. Vous pouvez probablement vous en sortir sans écraserskip
, comme le défaut de mise en œuvre sera juste appelerread
un certain nombre de fois.L'écriture d'une meilleure méthode close
Malheureusement, en raison de la nature de la classe anonyme, ça va être difficile pour vous d'écrire un efficace
close
méthode parce que tant qu'une instance du flux n'a pas été garbage collector de Java, il maintient une référence vers le tableau d'octets, même si le flux a été fermé.Toutefois, si vous facteur de la classe dans une imbriquées ou haut-niveau de la classe (ou même une classe anonyme avec un constructeur qui vous appelez à partir de la ligne dans laquelle elle est définie), la
myBytes
peut être un non-finale de champ plutôt qu'une dernière variable locale, et vous pouvez ajouter une ligne comme:à votre
close
méthode, qui va permettre à Java pour libérer de la mémoire prise par le tableau d'octets.Bien sûr, cela va vous obliger à écrire un constructeur, tels que:
Marque et Réinitialiser
Vous pouvez également remplacer
mark
,markSupported
etreset
si vous voulez soutenir marque/reset. Je ne suis pas sûr si elles sont jamais appelés par votre contenant.OriginalL'auteur Kidburla
Vous ne pouvez fonte quelque chose comme ceci:
si l'inputStream vous êtes en train de jeter est en fait un ServletInputStream déjà. Il va se plaindre si c'est une autre mise en œuvre de InputStream. Vous ne pouvez pas lancer un objet à quelque chose, il ne l'est pas.
Dans un conteneur de Servlet, vous pouvez obtenir un ServletInputStream à partir d'un ServletRequest:
Alors, qu'êtes-vous en train d'essayer de faire?
MODIFIER
Je suis intrigué de savoir pourquoi vous voulez convertir votre demande de bas-de-casse - pourquoi ne pas simplement faire de votre servlet pas sensible à la casse? En d'autres termes, votre code afin de diminuer les cas, la demande de données peuvent être copiées dans votre servlet, alors il peut les traiter... toujours rechercher la solution la plus simple!
J'ai édité mon asnwer
OriginalL'auteur NickJ