1,javase代码实战——基础语法(一),javase实战
1,javase代码实战——基础语法(一),javase实战
- 1输出错误信息及调试信息
- 2从控制台接受输入
- 重定向输出流实现程序日志
- 自动类型转换与强制类型转换
1,输出错误信息及调试信息
问题介绍:
在程序开发中,我们要为了要知道程序运行中的一些情况,就需要在程序代码中插入一些输出语句,甚至程序出现严重的错误时,也要给出警告提示。
代码实现:
public static void main(String[] args) {
System.out.println("我是一个输出的信息");
System.err.println("我是一个警告的信息");
}
效果
总结:out和err是system类中的final static的类变量,它们两个都是PrintStream类的实例对象。所以,在不创建system类对象的情况下,就可以使用。但是,out最好用于输出调试信息,在ec’li’pse的控制台中字体颜色是黑色的。err最好用于输出错误信息,在ec’li’pse的控制台中字体颜色是红色的。
扩展:
浅析system类:
1,System类是final static 定义的,所以他不能被继承,也不用进行实例化。
2,作用:System是一个工具类,有标准输入、标准输出和错误输出流;获得系统属性,返回毫秒数,拷贝数组,获得系统属性,运行垃圾回收器,退出虚拟机等等。
3,我们只看标准输出和标准错误输出流。即:
public final static PrintStream out = nullPrintStream();
public final static PrintStream err = nullPrintStream();
提出一个面试题:
out或 err 是一个变量还是一个内部类呢?
答:out或err是一个PrintStream的类变量,不是一个内部类。
浅析printStream类:
1,OutputStream是一个抽象类,FilterOutputStream是它的子类。PrintStream又是它的子类。
OutputStream此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到某个接收器(控制台,磁盘等)。 需要定义 OutputStream 子类的应用程序必须始终提供至少一种可写入一个输出字节的方法。
FilterOutputStream 类本身只是简单地重写那些将所有请求传递给所包含输出流的 OutputStream 的所有方法。FilterOutputStream 的子类可进一步地重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。
注:FilterOutputStream只能输出byte类型。
2,作用:可以输出任意类型的数据类型,不在仅限与byte类型;可输出格式化的数据;可以追加字符到输出流。还有覆盖父类的一些write等方法并实现了输出。
3,随便看一个输出类型的源代码:
public void print(int i) {
write(String.valueOf(i));
}
private void write(String s) {
try {
synchronized (this) {
ensureOpen();
textOut.write(s);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush && (s.indexOf('\n') >= 0))
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
可以发现,PrintStream的两个write的方法中只有char和string类型,所以其他类型先借助String类转为String类型在做输出操作。
2,从控制台接受输入
问题介绍:
用户需要输入密码,怎么从控制台接受输入的密码?
代码实现:
public static void main(String[] args) {
System.out.println("请输入密码");
Scanner s =new Scanner(System.in);
String psd =s.nextLine();//接受一行文本输入
if(psd.equals("123456"))
System.out.println("密码正确");
else
System.err.println("密码错误");
}
总结:in也是system中的一个输入流类变量,Scanner是扫描工具类。Scanner中封装了输入流对象,所以可以从控制台读取数据。
扩展:
1,public final static InputStream in = nullInputStream();
in和err,out都是system中的类变量。
2, inputStream输入流是以字节为单位读取数据的,要经过复杂的判断和创建缓冲数组,而且还会出现乱码的情况。所以对于字符数据的获取,应该使用Scanner扫描类对输入流,文件等进行封装,在获取字符串类型的数据,是一个很好的方法。
3,浅析Scanner类
(1)是一个简单的文本扫描器,使用正则表达式来解析基本类型和字符串。
(2)查看构造方法,可以从文件,输入流,信道,字符串等进行扫描。
(3)查看方法,可以扫描int,double等各种类型的数据,可以自己设置正则表达式扫描数据,返回扫描器的语言环境等等
重定向输出流实现程序日志
问题介绍:假如我想向一个文件中输出程序中的日志信息怎么办?
问题分析:system是一个工具类,有标准的输入输出的功能。它封装了输出流对象,即out变量是java的标准输出流,但是用final所定义,所以无法进行修改。继续查看system的api可以发现java提供了public static void setOut(PrintStream out)等方法
可见,只要创建好相应的输入输出流对象,就可可以实现向制定的位置输出日志信息。
代码实现:
/**
* 1,先保留原有的输出流,如果还要在用到的话。
* 2,创建新的指定的流对象,调用system的setXXX()方法传入。
* 3,使用system的输出方法即可,即实现了向指定的位置输出信息。
*
*/
PrintStream pout =System.out;
PrintStream p =null;
try {
p =new PrintStream("G:\\txt.txt");
System.setOut(p);
System.out.println("程序正常运行");
System.setOut(pout);
System.out.print("输出日志成功");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
总结:我们在使用System类的标准输入、标准输出和错误输出流的功能时,默认的是向控制台输出信息,如果我们要向制定的位置输出,只需要自己创建指定的输入输出流,调用setOut()方法,这样我们在使用System中的输出方法,就输出到我们指定的位置了。
扩展:
1,实现输出信息的方式有很多中,这里我们使用了System类,我们也可以只使用java中的输出流。也可以直接使用PrintStream类。
PrintStream p =null;
try {
p =new PrintStream("G:\\txt.txt");
p.println("我是程序的日志文件");
p.println("程序运行正常");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
p.print("程序运行异常");
e.printStackTrace();
}
他们最后都是调用的源代码:
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
自动类型转换与强制类型转换
问题介绍:
java基本数据类型之间存在着两种自动类型转换:自动类型转换和强制类型转换。
byte b =127;
short s =23561;
int i =12345;
long l =12334455L;
char c ='w';
float f =1.1f;
double d =123.123;
//自动转换
System.out.println("byte+int 首先byte转int在做加法 结果"+(b+i));
//强制类型转换
System.out.println("double转int 结果 "+(int)d);
相关文章
- 暂无相关文章
用户点评