欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

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

来源: javaer 分享于  点击 1281 次 点评:82

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);

相关文章

    暂无相关文章

用户点评