• Java基础总结(三)


    一、开始的唠叨

    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的知识点,写点小工具,一边啃几本经典的书籍。

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

  • 相关阅读:
    Google布隆过滤器与Redis布隆过滤器详解
    这个面试问题很难么 | 如何处理大数据中的数据倾斜
    阿里巴巴微服务架构演进
    快手HBase在千亿级用户特征数据分析中的应用与实践
    基于Kafka+Flink+Redis的电商大屏实时计算案例
    阿里云E-MapReduce产品探秘,快速构建可扩展的高性能大数据平台
    阿里云Spark Shuffle的优化
    Flink CheckPoint奇技淫巧 | 原理和在生产中的应用
    你需要的不是实时数仓 | 你需要的是一款合适且强大的OLAP数据库(上)
    你需要的不是实时数仓 | 你需要的是一款强大的OLAP数据库(下)
  • 原文地址:https://www.cnblogs.com/xx-wqj/p/5720891.html
Copyright © 2020-2023  润新知