Java复习之路(第十四天 io+多线程)

Java基础

回顾:

  1. 抽象类
    1. 半成品,没有完成的类,不能进行创建实例
    2. 抽象方法的作用:
  2. 作为通用方法在父类中定义
  3. 要求子类必须实现

 

  1. final
    1. 常量,不可变,创建以后不可以进行改变他的值,就是一个最重的数值
    2. 方法,不能重写
    3. 类,不能继承
  2. static
    1. 静态属于类,而不属于实例
    2. 使用场景:
      1. 共享的数据
      2. 工具方法

Math.sqrt()

Integer.parseInt()

String.valueOf()

    1. 静态初始化块

class A {

    static {

       类加载时,只执行一次

}

}

 

  1. 访问控制符
    1. public, protected, [default], private
    2. 尽量使用小范围, 便于维护修改

 

  1. 接口
    1. 作用: 结构设计工具,用来解耦合,隔离实现
    2. 极端的抽象类
    3. 接口中只能定义:
      1. 公开的常量
      2. 公开的抽象方法
      3. 公开的内部类内部接口
    4. interface 代替 class
    5. implements 代替 extends
    6. 类可以实现多个接口
    7. 接口之间继承

interface A extends X,Y,Z {

}

FileInputStream       FileOutputStream

//进行添加了读写的buff的操作,提高了读写的效率

ObjectInputStream    ObjectOutputStream

序列化:把对象的信息按制固定的格式转成相应的信息

方法:ObjectOutputStream   writeObject(Object   object),将对象转成一串字节值,发送

           和OOS要有一个相接的流进行发送,

          ObjectInputStream    readObject(Object   object),  将序列化数据,重新恢复对象

package day1401_序列化;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class Test1 {
	public static void main(String[] args) throws Exception {
		/*
		 * 将学生的实例序列化保存到f2
		 * 
		 * f2文件上面进行插入一个文件的输出流 Fos和文件流进行相接
		 * 在插入一个序列化的输出流(oos)
		 * 
		 * OOS------FOS------f2
		 * 
		 */
		Student student = new Student(9527,"唐伯虎","男",26);
		//首先先创建文件的字节的输出流,将字节输出流插入到文件上面
		FileOutputStream fos=
											new FileOutputStream("F:\\f2");
		//将程序的序列流与文件的字节的输出流进行连接,这样才能把序列化的对象放在文件f2中
		ObjectOutputStream out =
											new ObjectOutputStream(fos);       //括号里面的就是要连接的流
		//将学生的实例进行序列化输出
		out.writeObject(student);
		//这里关闭的是ObjectOutputStream out创建的流
		out.close();
	}
}

反序列化:

将序列化的对象进行输出

package day1401_序列化;
//这是将序列化的对象返回出来
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Test2 {
	public static void main(String[] args) throws  Exception {
	FileInputStream fileInputStream = new FileInputStream("f:\\f2");
	ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
	
	 Object readObject = objectInputStream.readObject();
	 //进行对象的强转
	 Student student=(Student) readObject;
	 
	 System.out.println(student);
	}
}

 序列化的版本id

控制旧版本的数据,不能恢复成新版本的类型

如果不定义,编译器会根据类的定义的信息,计算产生一个版本的id,版本的定义是固定的,除了修饰符号,其他的是固定的

字符的编码:

ASC-II

0-127   包含英文的字符,标点,和控制指令的字符

iso-8859-1

0-255 扩展了ASC-II,到255,包含西欧字符

cjk

编码:中日韩

GBK 国标码

iso-8859-1 扩展成为双字节编码,中文用双字节表示

Unicode:统一码 万国码

常用的字符表,双字节,生僻字符表,三字节或以上

UTF-8

Unicode 传输的格式,英文单字节,某些符号三字节,中文的符号三字节,特殊的符号四字节

java的char类型,采用Unicode

把字符进行输出保存,都要转化成为其他的编码进行输出

 

InputStreamReader和OutputStreamWriter

编码的转化流

OutputStreamWriter

把Java的Unicode编码char字符,转成其他的编码输出

InputStreamReader

读取其他的编码表,转化为Unicode

package day1403_编码转换流;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class Test {
	public static void main(String[] args) throws Exception {
		function("abc","GBK","f:\\abc\\f3");
		function("abc","UTF-8","f:\\abc\\f4");
	}
/*
 * 字符编码:encoding
 * 字符集:charset
 */
	private static void function(String s, String chaeset, String path) throws Exception {
		/*
		 * 先创建文件流插在文件的path上面
		 * 在创建编码转换流插在文件流上
		 * OSW-----FOS----path
		 */
		FileOutputStream out = new FileOutputStream(path);
		//后面添加的是编码的参数
		OutputStreamWriter output= new OutputStreamWriter(out,chaeset);
		//这一步就是实现编码转换之后编码的形式
		output.write(s);
		output.close();
	}
}

利用不同的编码表进行打印所有的编码汉字

package day1403_编码转换流;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class Test2 {
	public static void main(String[] args) throws Exception {
		/*
		 * Unicode 编码表,中文的编码的范围
		 * \u4e00-\u9fa5
		 */
		function("GBK","f:\\abc\\f5");
		function("UTF-8","f:\\abc\\f6");
	}

	public static void function(String charset, String path) throws Exception {
		FileOutputStream fileOutputStream = new FileOutputStream(path);
		OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,charset);
		for(char i='\u4e00';i<'\u9fa5';i++) {
			int count=0;
			outputStreamWriter.write(i);
			count++;
			if (count==30) {
				outputStreamWriter.write('\n');
				System.out.println();
				count=0;
			}
		}
		outputStreamWriter.close();
	}
}

线程

进程:在操作系统中,并行执行的任务

线程:进程内部进行操作的任务

创建线程:两种方法

继承Thread

定义Thread的子类,重写run()方法,线程启动后,执行run()方法中的代码

package day1404_线程;

public class Test1{
	public static void main(String[] args) {
		//进行创建T1的对象,利用start方法运行
		T1 t1 = new T1();
		T1 t2 = new T1();
		//线程启动后会进行自动的打印
		t1.start();
		t2.start();
		System.out.println("main");
	}
	static class T1 extends Thread{
		//重写run方法
		public void run() {
			String name = getName();
			for (int i = 1; i < 3; i++) {
				System.out.println(name+"-"+i);
			}
		}
	}
	
}

实现Runnable

定义Runnable接口的子类

实现run()方法

创建Thread实例,把Runnable对象交给线程

线程启动后,执行Runnable对象的Run()方法

 

package day1404_线程;

public class Test2 {
	public static void main(String[] args) {
		//创建代码,将代码的实例交给线程进行运行
		R1 r1 = new R1();
		//将实例以参数的形式交给线程
		Thread t1=new Thread(r1);
		Thread t2=new Thread(r1);
		//线程启动后,自动的执行r1.run()
		t1.start();
		t2.start();
		
	}
	static class R1 implements  Runnable{
		//封装代码的执行
		public void run() {
			//获取正在执行当前代码的线程(当前线程),得到现成的实例
			Thread currentThread = Thread.currentThread();
			//获取线程名称
			String name=currentThread.getName();
			for (int i = 0; i < 1000; i++) {
				System.out.println(name+"-"+i);
			}
		}
	}
}

 新生,消亡,是"非活动的"状态

其他,活动的状态(alive)

方法:

Thread.currentThread()

获取正在执行代码的现成的实例,

静态的方法thread().sleep(毫秒值时长)

getName(),setName()

start()

interrupt()

打断一个线程的暂停的状态,被打断的线程,会出现interruptExpection

setDaemon(true)

后台的线程,守护线程

虚拟机会等待所有的前台的 线程结束后,自动的退出,不会等待后台线程的结束

join()

当前的线程结束,等待被调用的线程结束后,再继续执行

练习三:sleep()

进行一秒一秒的打印时间

package day1404_线程;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Test3 {
	public static void main(String[] args) {
		//刚开始进行创建进程的时候是不执行代码的
		Thread thread=new Thread() {
			//括号里面是匿名内部类,继承父类Thread
			
			//进行重写run方法
			public void run() {
				while (true) {
					Date date = new Date();
					//格式化工具
					SimpleDateFormat simpleDateFormat=
														new SimpleDateFormat("HH:mm:ss");
					String format = simpleDateFormat.format(date);
					System.out.println(format);
					//在此处暂停1秒
					try {
						Thread.sleep(1000);
					} catch (Exception e) {
						System.out.println("没有错误");
					}
				}
			}
		};
		thread.start();
	}
}

interrupt方法将沉睡的程序捅醒

new Thread() {
			public void run() {
				//把t线程同醒,打断t线程的暂停的状态
				System.out.println("按回车健捅醒t线程");
				new Scanner(System.in).nextLine();
				thread.interrupt();
			}
		}.start();
	}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值