2015-09-07 4 views
3

Я создал новый класс, который расширяет InputStream и имеет значение @Override read(). Я пытаюсь использовать метод read (int b), но когда я его использую, он переходит к методу read(), и я не могу использовать параметр, который я передал.inputStream новый класс, который расширяет InputStream

Вот мой код:

public class Run { 

    public static void main(String[] args) { 

     DFSMaze3dGenerator mg = new DFSMaze3dGenerator(); 
     try { 
      Maze3d maze3d = mg.generate(1, 5, 5); 
      maze3d.print3DMaze(); 
      OutputStream out = new MyCompressorOutputStream(
        new FileOutputStream("1.maz")); 
      out.write(maze3d.toByteArray()); 
      byte[] arr = maze3d.toByteArray(); 
      System.out.println(""); 
      for (int i = 0; i < arr.length; i++) { 
       System.out.print(arr[i] + ","); 
      } 
      out.close(); 
      InputStream in = new MyDecompressorInputStream(new FileInputStream(
        "1.maz")); 
      byte b[] = new byte[maze3d.toByteArray().length]; 
      in.read(b); 
      in.close(); 
      Maze3d loaded = new Maze3d(b); 
      System.out.println(loaded.equals(maze3d)); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

Как я могу использовать параметр, когда я использую метод: чтение (б); ???

public class MyDecompressorInputStream extends InputStream { 

    InputStream in; 
    int count; 
    boolean even = false; 

    public MyDecompressorInputStream(InputStream in) { 
     super(); 
     this.in = in; 
    } 

    @Override 
    public int read() throws IOException { 

     return 100; 

    } 



} 
+0

Может быть, вы должны переопределить 'чтения (байт [])'? http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read (byte []) –

+0

Я все еще обращался к методу read() –

ответ

3

Есть ли причина, по которой вам нужен подкласс InputStream? Ни один из кодов в вашем главном не использует любой добавленный код в вашей реализации. Однако вы должны реализовать read (byte []) в своей реализации. Это аналогичная реализация, которая работает на моей машине.

class MyInputStream extends InputStream { 
    InputStream in; 
    int count; 
    boolean even = false; 

    public MyInputStream(InputStream stream){ 
     this.in = stream; 
    } 

    @Override 
    public int read() throws IOException { 
     return this.in.read(); 
    } 

    @Override 
    public int read(byte[] toStore) throws IOException { 
     return this.in.read(toStore); 
    } 
} 

и мои основные использование этого аналогично:

public static void main(String[] args){ 
    MyInputStream stream = new MyInputStream(new ByteArrayInputStream(new byte[] {0, 0, 1})); 
    byte[] storage = new byte[3]; 
    try { 
     stream.read(storage); 
     for (int i = 0; i < storage.length; ++i){ 
      System.out.println(storage[i]); //0 0 1 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    stream.close() 

} 
+0

У меня есть класс MyCompressorOutputStream, который сжимает и мне нужен MyDecompressorInputStream Class для декомпрессии с помощью алгоритма –

+0

Все в порядке. Вы все равно должны добавить переопределенное чтение (byte []). Прямо сейчас ваш объект не знает, как обрабатывать чтение (byte []), даже если у родителя есть метод. –

+0

Не могли бы вы связать нам свой код с байтом чтения (байта)? –

0

InputStream.read(byte[]) вызовы (MyDecompressorInputStream.) read()

Кроме того, вы, вероятно, уже делегат в in:

@Override 
public int read() throws IOException { 
    return in.read(); 
} 

@Override 
public void close() throws IOException { 
    return in.close(); 
} 

Вы можете продлить FilterInputStream вместо этого.

В целом для сжатия GzipInputStream является хорошим (формат .gz).

+0

Что-то для коллажа и он должен быть специфичным InputStream –

+0

Приятно, что фундаментальные классы, такие как InputStream, исследуются. Отслеживание с помощью отладчика, сначала добавьте источники JDK в IDE (src.zip). –

Смежные вопросы