passer d'un OutputStream à un InputStream...

passer d'un OutputStream à un InputStream... - Java - Programmation

Marsh Posté le 21-03-2003 à 00:26:16    

'lut,
 
dans une classe j'écris des brols dans un OutputStream que je voudrais donner à une autre classe qui doit le lire dans un InputStream...
 
je me suis battu un peu car j'ai toujours un peu de mal avec les Stream...
 
pourriez-vous me dire si vous avez une version plus simple de ce code:
 

Code :
  1. import java.io.BufferedReader;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.DataInputStream;
  5. import java.io.DataOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. /**
  9. * User: cd
  10. * Date: Mar 20, 2003
  11. */
  12. public class StreamTest{
  13. public static void main(String[] args){
  14.  ByteArrayOutputStream stream = new ByteArrayOutputStream();
  15.  DataOutputStream dos = new DataOutputStream(stream);
  16.  try{
  17.   dos.writeBytes("Hello!" );
  18.  }
  19.  catch(IOException e){
  20.   System.out.println("Bardaf! [out]" );
  21.  }
  22.  DataInputStream dis = new DataInputStream(new ByteArrayInputStream(stream.toByteArray()));
  23.  BufferedReader buff = new BufferedReader(new InputStreamReader(dis));
  24.  try{
  25.   System.out.println(buff.readLine());
  26.  }
  27.  catch(IOException e){
  28.   System.out.println("Bardaf! [in]" );
  29.  }
  30. }
  31. }


 
paske je trouve ça lourd en objets en cascade...


Message édité par TBone le 21-03-2003 à 00:26:50

---------------
A straight line is a special case of a curve. It's a curve which is uncurved. -- Susskind.
Reply

Marsh Posté le 21-03-2003 à 00:26:16   

Reply

Marsh Posté le 21-03-2003 à 00:27:19    

sans passer par un fichier...


---------------
A straight line is a special case of a curve. It's a curve which is uncurved. -- Susskind.
Reply

Marsh Posté le 21-03-2003 à 00:38:20    

PipedInputStream d'un cote et PipedOutputStream de l'autre, ensuite tu connectes les deux pour avoir un pipe.
 
Bye

Reply

Marsh Posté le 21-03-2003 à 00:39:29    

Ce sont 2 classes de java.io, disponibles depuis la jdk 1.0 et donc oui c'est plus simple a utiliser que ton code.

Reply

Marsh Posté le 21-03-2003 à 00:51:43    

j'vais aller voir ça.
 
merci :hello:


---------------
A straight line is a special case of a curve. It's a curve which is uncurved. -- Susskind.
Reply

Marsh Posté le 21-03-2003 à 08:51:12    

TBone a écrit :

j'vais aller voir ça.
 
merci :hello:


 
you're welcome ;)

Reply

Marsh Posté le 09-06-2004 à 15:39:23    

Attention, ces 2 classes sont conçues pour être utilisées par 2 threads différents


---------------
http://runnerstats.net
Reply

Marsh Posté le 09-06-2004 à 17:11:45    

phenixl a écrit :

PipedInputStream d'un cote et PipedOutputStream de l'autre, ensuite tu connectes les deux pour avoir un pipe.
 
Bye


merde, j'avais recodé ca moi même  :cry:  
 

noldor a écrit :

Attention, ces 2 classes sont conçues pour être utilisées par 2 threads différents


ha ben du coup j'ai pas fait ca pour rien [:meganne]
 

Code :
  1. import java.io.*;
  2. public class ByteArrayStream extends ByteArrayOutputStream {
  3. public ByteArrayStream() {
  4.  super();
  5. }
  6. public ByteArrayStream(int size) {
  7.  super(size);
  8. }
  9. /**
  10.  * the reset method is not supported.  
  11.  * @throws UnsupportedOperationException this exception is ALWAYS sent
  12.  */
  13. public synchronized void reset() {
  14.  throw new UnsupportedOperationException("The reset method is not supported" );
  15. }
  16. /**
  17.  * return a InputStream that read the actual content of the array. The end of the stream is  
  18.  * fixed to the actuel size of the array
  19.  */
  20. public synchronized InputStream getInputStream() {
  21.  return new ArrayInputStream();
  22. }
  23. //-----------------------------------------------------------------------------------
  24. // InputStream
  25. //-----------------------------------------------------------------------------------
  26. /**
  27.  * This class is a copy of the java.io.ByteArrayInputStream. only the synchronization has been change to  
  28.  * be synchronized on the outter object
  29.  */
  30. private class ArrayInputStream extends InputStream {
  31.  protected int pos;
  32.  protected int mark = 0;
  33.  protected int count;
  34.  public ArrayInputStream() {
  35.   synchronized (ByteArrayStream.this) {
  36.    this.pos = 0;
  37.    this.count = ByteArrayStream.this.count;
  38.   }
  39.  }
  40.  public int read() {
  41.   synchronized (ByteArrayStream.this) {
  42.    return (pos < count) ? (buf[pos++] & 0xff) : -1;
  43.   }
  44.  }
  45.  public int read(byte b[], int off, int len) {
  46.   synchronized (ByteArrayStream.this) {
  47.    if (b == null) {
  48.     throw new NullPointerException();
  49.    } else if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) {
  50.     throw new IndexOutOfBoundsException();
  51.    }
  52.    if (pos >= count) {
  53.     return -1;
  54.    }
  55.    if (pos + len > count) {
  56.     len = count - pos;
  57.    }
  58.    if (len <= 0) {
  59.     return 0;
  60.    }
  61.    System.arraycopy(buf, pos, b, off, len);
  62.    pos += len;
  63.    return len;
  64.   }
  65.  }
  66.  public long skip(long n) {
  67.   synchronized (ByteArrayStream.this) {
  68.    if (pos + n > count) {
  69.     n = count - pos;
  70.    }
  71.    if (n < 0) {
  72.     return 0;
  73.    }
  74.    pos += n;
  75.    return n;
  76.   }
  77.  }
  78.  public int available() {
  79.   synchronized (ByteArrayStream.this) {
  80.    return count - pos;
  81.   }
  82.  }
  83.  public boolean markSupported() {
  84.   return true;
  85.  }
  86.  public void mark(int readAheadLimit) {
  87.   synchronized (ByteArrayStream.this) {
  88.    mark = pos;
  89.   }
  90.  }
  91.  public void reset() {
  92.   synchronized (ByteArrayStream.this) {
  93.    pos = mark;
  94.   }
  95.  }
  96.  public void close() throws IOException {}
  97. }
  98. }


tu créés l'objet, tu écris dedans, et quand tu veux lire ce que tu as écrit, tu récupères un InputStream. Tu peux par la suite continuer à écrire dedans (le inputsream que tu as récupéré ne sera pas affecté) et tu peux re-récupérer un nouveau inputstream ..
 
Le code est fortement inspiré de ByteArrayInputStream et ByteArrayOutputStream du jdk. L'avantage c'est qu'ils se partagent le même tableau de byte => c'est économe au niveau mémoire :)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed