java初学者,菜鸟问题
今天刚学个打印功能的小程序,问题应该是缓冲区没有清空,之前学C++有清空缓冲区的语句,但java没有。
当我输入a进行字符打印回车的时候,跳过了字符串打印了,问下java里面有清空字符缓冲区的语句吗?
我的程序如下
PrintChar.java
import java.io.*;
public class InputChar
{
public static void main(String[] args)
{
char c='a';
System.out.println("请输入一个字符");
try
{
c=(char)System.in.read();
}catch(
IOException e)
{
};
System.out.println(c);
InputString s=new InputString();
s.fun();
InputInt n=new InputInt();
n.fun();
System.out.println("程序已结束");
}
}
PrintInt.java
import java.io.*;
public class InputInt
{
void fun()
{
System.out.println("请输入一个整数");
int num=0;
BufferedReader buf;
buf=new BufferedReader(new InputStreamReader(System.in));
try
{
num=Integer.parseInt(buf.readLine());
} catch (
NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(num);
}
}
PrintString.java
import java.io.*;
public class InputString
{
void fun()
{
System.out.println("请输入一个字符串");
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
String str="abc";
try
{
str = buf.readLine();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(str);
}
}
------解决方案--------------------可以考虑用 skip() 来跳过一些数据。
不过更合理的做法也许是考虑读取到空行就重读一次。
------解决方案--------------------java里面不需要手工去清理内存,虚拟机会干。
------解决方案--------------------buf.skip(2) 来跳行继续读取数据
------解决方案--------------------
*帮你运行了一下这个程序:
*发现问题:第一次输入的数据会影响后面字符串的输入,比如说第一次输入的数据是“abcd”,由于从System.in对象中读取的是第一个字符,后面的内容并没读取完。这样问题就出现了,后面的内容会显示在第二次字符串输入处,从而出现你说的“跳过输入”的情况。
*解决办法:1,你可以考虑一下:从第一次的输入改为InputString类中的fun方法,然后另建一个类对输入的数据惊醒校验(只需要判断String长度是否为1就可以了,为1则输出,否则输入出错信息)
2,采用byte[],以下帮你修改了,代码如下:
PrintChar.java
public class InputChar {
public static void main(String[] args)
{
char c= 'a';
int i = 0;
byte[] b = {'a','b','c'};
System.out.println("请输入一个字符");
try
{
i = System.in.read( b);
}catch(IOException e)
{
};
if(i!=0){
c = (char) b[0];
}
else{
System.out.println("获取失败!");
}
System.out.println(c);
InputString s=new InputString();
s.fun();
InputInt n=new InputInt();
n.fun();
System.out.println("程序已结束");
}
}
------解决方案--------------------补充一下:byte[3]完全是考虑是第一次输入的数据是单个字符。如果超过了2个以上,则会出现溢出,也就是说byte数组取不完System.in中的数据,这样还是会出现你那种问题。
这样的话,不妨把byte数组的长度定义长一点,这样就没问题了,理想做法是弄个处理函数,判断输入数据是否有错。
之前想把数据给清理的,发现行不通,只能考虑靠取数据的方式来解决你这个问题了。