Le cas classique: vous êtes entrain de lire le contenu d’un fichier, ou vous téléchargez une page HTML dans votre programme. Simplement vous ne connaissez pas à l’avance la quantité de données, en conséquence de quoi vous ne pouvez pas de manière sûre alloué un buffer. Et bien grâce à la class java.io.ByteArrayOutputStream il est assez simple de lire des données sur un InputStream et d’écrire à la volée dans ce buffer vos données. La réallocation est effectuée en interne par le ByteArrayOutputStream.J’ai écris un petit exemple d’une class qui se connecte sur un site web, télécharge le contenu et retourne une String.
/* TestBytes * Created by : nicmarti * Date: 27-Nov-2003 - Time: 13:44:28 * * Copyright (c) 2003 Nicolas Martignole * All rights reserved. */ package com.test.onsenfiche; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Logger;import java.io.*; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.Properties;/** TestBytes est un exemple de l'utilisation de la class ByteArrayOutputStream. * Cette class se connecte sur une URL specifiee, en telecharge le contenu * puis retourne une String. L'interet du ByteArrayOutputStream est d'eviter * de jongler avec des buffers de bytes pré-alloués. La gestion de la taille * de ce buffer est transparente. * * @version 27-Nov-2003 13:44:28 * @author Nicolas Martignole */ public class TestBytes { static Logger logger = Logger.getLogger(TestBytes.class);/** Connect to the specified url and download its content * @param url is a valid url * @return a String that contains the whole HTML page */ public static String getContentFromURL(String url) { if (url == null) { logger.fatal("No url was specified"); throw new RuntimeException("No url was specified"); } try { URL u = new URL(url); logger.debug("URL: " + u.toExternalForm()); ByteArrayOutputStream buf = new ByteArrayOutputStream(); URLConnection conn = u.openConnection(); conn.connect(); logger.debug("Connected"); Reader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); int c = -1; logger.debug("Start to read the page"); while ((c = reader.read()) != -1) { buf.write(c); } logger.debug("Read done"); buf.close(); return new String(buf.toByteArray()); // -- tres utile } catch (MalformedURLException e) { logger.fatal("Malformed or invalid URL", e); } catch (IOException e) { logger.fatal("IOException", e); } return "ERROR-See log output"; }/** Main method, you will need log4j from apache in the classpath. * @param args none */ public static void main(String[] args) { // Create a simple appender using a simple layout for Log4j BasicConfigurator.configure();// Banner logger.info("TestBytes starting");// For HTTP Proxy Properties prop = System.getProperties(); prop.put("http.proxyHost", "proxy.XXXXXXX.fr"); // I removed the real hostname prop.put("http.proxyPort", "8080"); //logger.debug(prop);// Connects to a web site and get the data. logger.info(TestBytes.getContentFromURL("http://www.google.fr"));logger.info("Exit"); } }
Enfin si vous voulez relire le contenu de ce ByteArrayOutputStream vous pouvez aussi réutiliser un ByteArrayInputStream. Cela permet de rejouer par exemple avec les retour-chariots, une suite de commande sur un serveur telnet ou ftp. Enfin plus clairement, si vous avez un buffer de bytes (ou une String) vous pouvez relire le tout facilement via un ByteArrayInputStream.
0 no like