循环后如何重设In.read()!='\ n'

时间:2018-11-17 22:50:06

标签: java char

在将输入设置为在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();
            }

        }

2 个答案:

答案 0 :(得分:0)

这取决于In是哪种流。

  • 如果它是ByteArrayInputStream或类似名称,则可以调用reset()重置到先前的“标记”位置。对于ByteArrayInputStream,该位置默认为流的开头;参见javadoc

  • 如果它是FileInputStream,则可以使用markreset,尽管它可能取决于操作系统和创建流的方式。 (javadoc不会说一种或另一种方式。)

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

  • 如果它是SocketInputStream,则markreset不太可能起作用。无法倒退来自远程服务器的流。网络传输协议(和服​​务器)不支持这种功能。

  • 如果它是BufferedInputStream,则markreset可能有效,具体取决于缓冲区的大小。阅读javadoc,以了解缓冲区大小与标记/重置之间的关系。


那么您的解决方案是什么?

  • 标记/重置可能不适用于In

  • 您可以将In包裹在具有足够大缓冲区的BufferedInputStream中,尽管预测需要多大的缓冲区还是有问题的(至少在理论上是这样!)

  • 最好的解决方案可能是更改代码,以使您无需重新读取输入。例如:

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

答案 1 :(得分:0)

好,我修复了它。我只是更改它,以便while循环位于for循环之前。 现在它可以正常工作而无需重设任何内容。