码迷,mamicode.com
首页 > 编程语言 > 详细

Java基础总结(三)

时间:2016-07-31 09:09:53      阅读:304      评论:0      收藏:0      [点我收藏+]

标签:

一、开始的唠叨

Java中有一大块的内容是组件及事件处理,一刷Java时是为了写Web,前端有Html没学这部分内容。二刷时已经在做Android了,前端有自带的组件,依然跳过。

我也不建议道友去学习这部分内容,现在真的有人用Java写C/S吗?

、学习笔记

(一)输入输出流

1.流:输入流、输出流是针对程序而言的。

所有输入流都是InputStream(字节输入流)或Reader(字符输入流)的子类;

所有输出流都是OutputStream(字节输出流)或Writer(字符输出流)的子类;(汉字占2个字节,对中文而言,字节流有可能出现乱码)

2.File类:

File类用于对文件的操作,有三种构造方法

File(String filename);
File(String directoryPath,String filename);
File(File dir,String filename);

File类的方法十分简单,全是对文件的一些操作,顾名思义即可。

不多见的是File可以用来运行可执行文件,以下方法可以打开Windows的记事本:

public static void main(String[] args) {
    File note=new File("c:/windows","Notepad.exe");
    Runtime rt=Runtime.getRuntime();
    try {
        rt.exec(note.getAbsolutePath());    
    } catch (IOException e) {
        e.printStackTrace();
        }
    }

 

2.字节输入流与字节输出流:

输入流基本步骤:

  • 设定输入流的
  • 创建指向源的输入流
  • 让输入流读取源中的数据
  • 关闭输入流

输出流基本步骤:

  • 给出输出流的目的地
  • 创建指向目的地的输出流
  • 让输出流把数据写入到目的地
  • 关闭输出流

下面的例子运用IO完成了文本的复制

    public static void main(String[] args) {
        try {
        
            FileInputStream in=new FileInputStream(new File("d:\\a.txt"));
            FileOutputStream out=new FileOutputStream(new File("d:\\b.txt"));
            int len=0;
            byte [] b=new byte[1024];
            try {
                while((len=in.read(b))!=-1){
                    out.write(b, 0, len);
//                    out.write(b);
                }            
                in.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }                    
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

void write(byte b[])方法,向目的地写入一个字节数组b;

void write(byte b[],int off,int len)方法,从给定字节数组b中起始于偏移量off处取len个字节写到目的地。

输入流的read方法也有这两种结构。

3.字符输入流与字符输出流:

文件字符流:FileReader、FileWriter

缓冲流:BufferedReader、BufferedWriter:更高级的流,读写功能更强。涉及到Java设计模式的装饰者模式,不属于基础范围。

4.序列化:  实现Serializable接口的对象是序列化对象,序列化对象可以写入或者读入到流中。

Serializable接口中的方法对程序是不可见的,因此实现该接口的类不需要实现额外的方法。

(二)多线程机制

 1.线程的状态与生命周期:

  • 新建:Thred或其子类声明一个对象。
  • 运行:线程调用strat()方法,在JVM中排队等候,轮到线程享用CPU资源时,调用run()方法。
  • 中断:4种原因。JVM将CPU资源轮给其他线程;线程调用sleep()方法;线程调用wait()方法;线程阻塞。
  • 死亡:2种原因。线程完成了任务;线程被强制中断。

2.线程的优先级:线程优先级可以通过setPriority(int grade)方法调整,默认优先级为5。一般不提倡更改优先级。

3.Thread与Runable:

创建线程目标对象时必须向构造方法中传入一个实现Runable接口类的实例。这样一旦轮到线程享用CPU资源,就会通过接口回调调用run()方法。

我们知道,线程可以共享进程的资源,因此对于使用同一目标对象(Runable)的线程,目标对象的成员变量自然就是这些线程共享的数据单元。

下例中,首先创建一个实现Runable接口的House类,用于提供数据单元,并且在构造方法中将自己作为参数传递到Thread中。

public class House implements Runnable{
private int waterAmount;
public int getWaterAmount() {
    return waterAmount;
}
public void setWaterAmount(int waterAmount) {
    this.waterAmount = waterAmount;
}
public Thread cat,dog;
public House(){
    cat=new Thread(this);
    dog=new Thread(this);
}
    @Override
    public void run() {
        while(true){
            Thread thread=Thread.currentThread();
            if(thread==dog){
                System.out.println("dog"+waterAmount--);
            }else {
                System.out.println("cat"+waterAmount--);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(waterAmount<=0){
                return;                                   
            }
        }    
    }
}

主函数中,分别开启dog与cat线程。不同的电脑中结果不同,这也是多线程的一个特点。

public static void main(String[] args) {
        House house=new House();
        house.setWaterAmount(5);                                                                  
        house.dog.start();
        house.cat.start();
    } 

4.线程同步:使用synchronized修饰同步方法,确保当前只有一个线程可以调用该方法。

5.协调线程同步:当一个线程使用同步方法中用到某个变量,而该变量需要其他线程修改后才符合要求时,就要利用wait()和notify()、notifyAll()手动协调线程同步。

(三)网络编程

1.URL:包括最基本的三部分信息,协议、地址、资源

2.InetAddress:获取域名和IP地址

public static void main(String[] args) {
        InetAddress address = null;
        try {
            address = InetAddress.getByName("www.jzme.cn");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        System.out.println(address);
        try {
            InetAddress local=InetAddress.getLocalHost();
            System.out.println(local);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        
    }

 

【运行结果】

技术分享

3.网络编程:网络编程一般是集大成者,涉及到IO、网络、线程等多个方面。下例可以获取用户输入的网址的回调的信息。

网络访问时耗时操作,需要在子线程中进行

public class Look implements Runnable{
private URL url;
    public void setUrl(URL url) {
    this.url = url;
}
    @Override
    public void run() {
        String s = null;
        try {
            InputStream in=url.openStream();    
            FileOutputStream out=new FileOutputStream(new File("d:\\c.txt"));
            int len=0;
            byte[] b=new byte[1024];
            while((len=in.read(b))!=-1){
                out.write(b, 0, len);
//                out.write(b);
            }            
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    } 

主函数接受用户输入,生成URL并传递给Look类的实例,Look类的实例打开输入流获取数据,并通过输出流将数据写入本地文本

public static void main(String[] args) {
        System.out.println("输入网站地址:");
        Scanner scanner=new Scanner(System.in);
        URL url = null;
        try {
            url = new URL(scanner.nextLine());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        Look look=new Look();
        look.setUrl(url);
        Thread thread=new Thread(look);
        thread.start();
    }

 

 当输入的地址为“www.baidu.com”时,c.txt文本部分内容如下:

技术分享

 

【以下涉及到服务器的部分知识,个人感觉不属于基础范围,仅列出作为补充】

4.TCP协议-Socket

5.UDP协议-DatagramSocket

 三、结束的唠叨

Java基础的整理到此为止。从复习到完成博客,断断续续花了5天左右。参考的书籍是耿祥义老师的教材。

接下来打算分两步走,一边梳理Android的知识点,写点小工具,一边啃几本经典的书籍。

最后奉劝大家,学海无涯,回头是岸。

Java基础总结(三)

标签:

原文地址:http://www.cnblogs.com/xx-wqj/p/5720891.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!