Ranides Atterwim 10 лет назад
Родитель
Сommit
41066b3525

+ 19 - 9
assira/src/main/java/net/ranides/assira/text/StringLoader.java

@@ -17,29 +17,39 @@ import java.io.Reader;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Scanner;
+import net.ranides.assira.collection.arrays.ArrayAllocator;
 
 /**
  *
  * @author ranides
  */
 public final class StringLoader {
-
+    
     private StringLoader() { }
 
-    public static String fromReader(Reader reader) {
-        try(Scanner scanner = new Scanner(reader)) {
-            return scanner.useDelimiter("\\Z").next();
+    public static String fromReader(Reader reader) throws IOException {
+        try {
+            char[] buffer = new char[32];
+            int r, c = 0;
+            while((r = reader.read(buffer, c, buffer.length-c)) > 0) {
+                c += r;
+                buffer = ArrayAllocator.grow(buffer, c+32);
+            }
+            return new String(buffer, 0, c);
+        } finally {
+            reader.close();
         }
     }
 
-    public static String fromStream(InputStream istream, Charset charset) {
-        try(Scanner scanner = new Scanner(istream, charset.name())) {
-            return scanner.useDelimiter("\\Z").next();
+    public static String fromStream(InputStream istream, Charset charset) throws IOException {
+        try {
+            return fromReader(new InputStreamReader(istream, charset));
+        } finally {
+            istream.close();
         }
     }
 
-    public static String fromStream(InputStream istream) {
+    public static String fromStream(InputStream istream) throws IOException {
         return fromStream(istream, Charsets.UTF8);
     }
 

+ 43 - 0
assira/src/test/java/net/ranides/assira/text/StringLoaderTest.java

@@ -0,0 +1,43 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.text;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Random;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public class StringLoaderTest {
+    
+    public StringLoaderTest() {
+    }
+
+    @Test
+    public void testFromReader() throws IOException {
+        String inp1 = "Hello world";
+        String out1 = StringLoader.fromReader(new StringReader(inp1));
+        assertEquals(inp1, out1);
+        
+        String inp2 = random(10247) ;
+        String out2 = StringLoader.fromReader(new StringReader(inp2));
+        assertEquals(inp2, out2);
+    }
+    
+    private String random(int size) {
+        Random rand = new Random(777);
+        char[] c = new char[size];
+        for(int i=0; i<size; i++) {
+            c[i] = (char)(' ' + rand.nextInt(64));
+        }
+        return new String(c);
+    }
+}