从控制台读取大数组的快速方法,但有内存限制

时间:2019-06-06 08:39:00

标签: java arrays algorithm byte inputstream

我有以下测试数据:

public class InputTest {

    @Before
    public void setUp() throws Exception {
        ByteArrayInputStream in = new ByteArrayInputStream("90 22 11 4 5\n".getBytes());
        System.setIn(in);
    }

,我需要从InputStream中读取每个数字作为整数。我创建了这个测试:

@Test
public void read() throws IOException {
    int c;
    while ((c = System.in.read()) != '\n') {
        int i = readInt(c);
        if (i != -1)
            System.out.print(i);
    }
}

private static int readInt(int c) {
    int ret = 0;
    if (c >= '0' && c <= '9') {
        return ret * 10 + c - '0';
    }
    return -1;
}

我得到以下输出:90221145-我将每个int打印到控制台。但是我需要像源字符串中一样的单独数字-90 22 11 4 5

我可以将其更改为:

@Test
public void read() throws IOException {
    int c;
    StringBuilder b = new StringBuilder();
    while ((c = System.in.read()) != '\n') {
        int i = readInt(c);
        if (i != -1) {
            b.append(i);
        }else {
            b.append(" ");
        }
    }
    System.out.println(b.toString());
}

private static int readInt(int c) {
    int ret = 0;
    if (c >= '0' && c <= '9') {
        return ret * 10 + c - '0';
    }
    return -1;
}

但是我不想在每个步骤上创建StringBuilder。我该怎么办?

P.S我了解BufferedReader's readLine()方法和StringTokinizer,但这不适合。我需要读取字节。我解决了存储这些数据的问题,只需要快速读取即可。

这是面试任务的一个例子,我需要阅读大量具有记忆约束的价值观。

1 个答案:

答案 0 :(得分:-2)

在读取数据时将其写入System.out怎么样?

@Test
public void read() throws IOException {
    int c;
    StringBuilder b = new StringBuilder();
    while ((c = System.in.read()) != '\n') {
        int i = readInt(c);
        if (i != -1) {
            System.out.print(""+i);
        }else {
            System.out.print(" ");
        }
    }
    System.out.print("\n"); // end of line
}