当我使用BufferedReader从控制台读取字符并打印它们时,为什么空行正在打印?



这是我的程序。

//这里我们使用BufferredReader从控制台读取字符

package fileIO;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BRRead {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

char ch;

System.out.println("Enter characters, 'q' to quit.");
do {
ch = (char)br.read(); 
System.out.println(ch);
} while(ch!='q');
}
}

输入1:testq

输出:

t

e

s

t

输入2:test

输出:

t

e

s

t

">

">

">

">

,"表示空行。我的问题是为什么4空行打印的情况下,输入字符不包含字母'q',但不打印时,输入字符包含字母'q'?

完整答案在底部

根本没有运行它来检查,尽管看起来它可能与使用do-while循环而不是while循环有关

这种格式将确保这个角色'q'之前不读它试图输出任何

while(ch!='q')
{
System.out.println(ch);
ch = (char)br.read(); 
} 

这个格式在测试读字符是否有效之前打印读字符

do {
ch = (char)br.read(); 
System.out.println(ch);
} while(ch!='q');

试错后编辑

在这个版本中,我使用了非常相似的Scanner类,并且我更熟悉它。它可能是这样的:

  • 创建读取BufferedReaderScanner等数据的对象
  • 检查是否有内容
  • 接受数据为String并读取第一个字符
  • Stringis不是q的输出
  • 循环测试->读→打印→循环,直到输入q
Scanner input = new Scanner(System.in);
System.out.println("Enter characters, 'q' to quit.");
String read = input.nextLine();
while(read.length() <= 1 && read.charAt(0) != 'q')
{
System.out.print(read);
read = input.nextLine();
}

(几乎)原始方法*

Eureaka !

  • name.read()读取单个字符——然而,这返回一个int数据类型,不能用(char)掩码转换。
  • name.readLine()读取一行文本——使用此方法,您可以简单地取索引0
  • 处的字符

https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html

do {
full = br.readLine(); 
System.out.print(full);
} while(full.length() <= 1) && full.charAt(0) != 'q');

不确定do-whilewhile循环之间的最佳方法是什么,这可能最终归结为用例和意见。你可能也想创建一个boolean方法

// true if String matches 'q' or "quit"
public static boolean isQuit(input)
{
String lowercase = input.toLower();
char start = input.charAt(0);
return (lowercase.equals("quit") 
|| (input.length() <= 1 && start == 'q'));
}

最新更新