您的位置:首页 > 编程语言 > Java开发

1,javase代码实战——基础语法(一)

2018-02-24 21:30 344 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息