Ranides Atterwim 10 سال پیش
والد
کامیت
cca284d11c

+ 4 - 6
assira/src/main/java/net/ranides/assira/io/IOStreams.java

@@ -175,10 +175,12 @@ public final class IOStreams {
     }
     
     public static InputStream substream(InputStream istream, long begin, long end) throws IOException {
-        // @todo (assira #1) substream
-        return new SubInput(istream, begin, end);
+        return new SubInput(istream, begin, end, false);
     }
     
+    public static InputStream limit(InputStream istream, long begin, long end) throws IOException {
+        return new SubInput(istream, begin, end, true);
+    }
     
     
     private static final class SubInput extends FilterInputStream {
@@ -187,10 +189,6 @@ public final class IOStreams {
         private final long max;
         private long pos;
         private long mark;
-
-        public SubInput(InputStream in, long begin, long end) throws IOException {
-            this(in, begin, end, true);
-        }
         
         public SubInput(InputStream in, long begin, long end, boolean close) throws IOException {
             super(in);

+ 59 - 0
assira/src/test/java/net/ranides/assira/io/IOStreamsTest.java

@@ -7,8 +7,10 @@
 package net.ranides.assira.io;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -29,9 +31,12 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Random;
 import java.util.function.Predicate;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import net.ranides.assira.events.EventDispatcher;
 import net.ranides.assira.events.EventRouter;
+import net.ranides.assira.functional.CheckedFunction;
+import net.ranides.assira.functional.FunctionUtils;
 import net.ranides.assira.text.FormatHex;
 import net.ranides.assira.trace.ExceptionUtils;
 import org.junit.Test;
@@ -434,6 +439,60 @@ public class IOStreamsTest {
         
         assertEquals("Hello world\nEOF\n", so.toString("UTF-8"));
     }
+    
+    @Test
+    public void testSubStream() throws IOException {
+        InputStream istream = new BufferedInputStream(new FileInputStream("src/test/resources/text/substream.txt"));
+
+        try(InputStream ss = IOStreams.substream(istream, 5, 12)) {
+            assertEquals(7, ss.available());
+            assertRead(" porro ", new byte[10], c -> ss.read(c));
+        }
+        
+        try(InputStream ss = IOStreams.substream(istream, 4, 12)) {
+
+            assertRead("qu", new byte[10], c -> ss.read(c,0,2));
+            assertRead("am est", new byte[10], c -> ss.read(c,0,30));
+
+            assertEquals(-1, ss.read(new byte[10]));
+            assertEquals(-1, ss.read(new byte[10], 2, 4));
+            assertEquals(0, ss.skip(10));
+        }
+        
+        try(InputStream ss = IOStreams.substream(istream, 0, 20)) {
+            assertRead(" qui", new byte[4], c -> ss.read(c));
+            assertEquals(5, ss.skip(5));
+            assertRead("rem ", new byte[4], b -> ss.read(b));
+        }
+        
+        try(InputStream ss = IOStreams.limit(istream, 1, 20)) {
+            ss.mark(30);
+            assertRead("psum quia", new byte[20], b -> ss.read(b,0,9));
+            ss.reset();
+            assertRead("psum quia", new byte[20], b -> ss.read(b,0,9));
+            assertEquals(' ', ss.read());
+            assertEquals(8, ss.skip(8));
+            assertEquals('t', ss.read());
+            assertEquals(-1, ss.read());
+        }
+        
+        assertThrows(e -> "java.io.IOException: Stream closed".equals(e.toString()), ()->{
+            IOStreams.substream(istream, 0, 20);
+        });
+        
+        istream.close();
+    }
+    
+    private void assertRead(String text, byte[] buffer, CheckedFunction<byte[],Integer> value) {
+        int exp = text.length();
+        int ret = FunctionUtils.rfunction(value).apply(buffer);
+        assertEquals(exp, ret);
+        assertEquals(text, new String(buffer, 0, exp, Charsets.US_ASCII));
+    }
+    
+    private void assertRead(String text, byte[] buffer, int value) {
+        
+    }
 
     private Predicate<Throwable> matchMessages(List<String> exp) {
         return cause -> Arrays

+ 1 - 0
assira/src/test/resources/text/substream.txt

@@ -0,0 +1 @@
+Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit