首页 > 解决方案 > 循环后如何重置 In.read() != '\n'

问题描述

在将输入设置为在while循环中输入后,如何重置字符文本中的输入。经过while循环后,它应该从头开始。例如

char text = In.read();

假设我输入了asdf

while(text != '\n' ) { 
  text = In.read();
}


//here is text = enter

但我希望它再次来自 asdf 的“a”。

这是我到目前为止得到的

System.out.print("Please enter your text ");
    char text = In.read();

// some other code here
//...

for (int i = 0; i < textcount.length ; i++)
        {
            j = 0;
            while(text != '\n' )
            {

                int a = Character.getNumericValue(textcount[i]);
                int b = Character.getNumericValue(text);


                if(a == b)
                {
                    j++;
                    charCounts[i] = j;
                }
                text = In.read();
            }

        }

标签: javachar

解决方案


这取决于什么样的流In

  • 如果是 aByteArrayInputStream或类似的,您可以调用reset()重置到之前的“标记”位置。对于 a ByteArrayInputStream,该位置默认为流的开头;请参阅javadoc

  • 如果它是 aFileInputStream您可以使用markand reset,尽管它可能取决于操作系统和流的创建方式。(javadoc没有说,一种或另一种。)

    在您的情况下,我怀疑您将从FileInputStream包装管道或不可倒带的设备文件中读取。

  • 如果它是SocketInputStream,mark并且reset不太可能工作。无法回退来自远程服务器的流。网络传输协议(和服​​务器)不支持那种东西。

  • 如果它是BufferedInputStream,mark并且reset可能会起作用,具体取决于缓冲区的大小。阅读javadoc以了解缓冲区大小和标记/重置之间的关系。


那么在您的情况下,解决方案是什么?

  • 标记/重置可能无法正常工作In

  • 您可以用足够大的缓冲区包装Ina BufferedInputStream,尽管预测它需要多大是有问题的(至少在理论上!)

  • 最好的解决方案可能是更改您的代码,这样您就不需要重新读取输入。例如:

    • 将您读取的字符保存在数组中,
    • 使用BufferedReader::readLine或 a 一次Scanner::nextLine读取用户输入的一行。

推荐阅读