一、开始的唠叨
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的知识点,写点小工具,一边啃几本经典的书籍。
最后奉劝大家,学海无涯,回头是岸。