学习java的第二十八天。。。 (输入输出流和多线程)

输入输出流

DataInputStream类

FileInputStream的子类    与FileInputStream类结合使用读取二进制文件

使用 DataInputStream 读二进制文件

    引入相关的类
        import java.io.FileInputStream; 
         import java.io.DataInputStream;
    构造数据输入流对象
        FileInputStream fis=new FileInputStream("C:\\HelloWorld.class");
        DataInputStream dis=new DataInputStream(fis);
    调用read()方法读取二进制数据
        dis.read ();
    关闭数据输入流
        dis.close();

DataOutputStream类

FileOutputStream的子类    与FileOutputStream类结合使用写二进制文件

使用 DataOutputStream写二进制文件

    引入相关的类
        import java.io.FileOutputStream; 
        import java.io.DataOutputStream;
    构造数据输入流对象
        FileOutputStream outFile=new FileOutputStream("C:\\temp.class");
        DataOutputStream out=newDataOutputStream(outFile);
    调用write()方法读取二进制数据
        out.write();
    关闭数据输入流
        out.close();

        InputStream is=null;
		//创建DataInputStream类对象
		DataInputStream dis=null;
		
		OutputStream os=null;
		//
		DataOutputStream dos=null;
		try {
			is = new  FileInputStream("f:/kuga.jpg");
			
			dis = new DataInputStream(is);
			os = new FileOutputStream("F:/kamen.jpg");
			dos = new DataOutputStream(os);
			//int num=dis.available();
//			System.out.println(num);
			//byte[] bytes = new byte[15000];
			//int result=dis.read(bytes);
//			System.out.println(result);
			//for (int i = 0; i < result; i++) {
			//	System.out.print(bytes[i]);
			//}
			int count;
			while((count=dis.read())!=-1){
				dos.write(count);
				System.out.println("图片复制完毕");
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				dos.close();
				os.close();
				dis.close();
				is.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

序列化和反序列化

反序列化则是从特定的流中获取数据重新构建对象的过程    序列化是将对象的状态写入到特定的流中的过程

序列化的步骤

    实现Serializable接口
    创建对象输出流
    调用writeObject()方法将对象写入文件
    关闭对象输出流
    注意:使用集合保存对象,可以将集合中的所有对象序列化

反序列化的步骤

    实现Serializable接口
    创建对象输入流
    调用readObject()方法读取对象
    关闭对象输入流
    注意:如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取

public class Student implements Serializable {
	private String name;
	private int age;
	private double scores;
	public Student() {
		super();
	}
	public Student(String name, int age, double scores) {
		super();
		this.name = name;
		this.age = age;
		this.scores = scores;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getScores() {
		return scores;
	}
	public void setScores(double scores) {
		this.scores = scores;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", scores=" + scores
				+ "]";
	}
}

 

	public static void main(String[] args) {
	Student stu1 = new Student("张三",21,99);
	Student stu2 = new Student("李四",20,94);
	Student stu3 = new Student("王五",23,92);
	//将3个对象放入数组中
	Student[] students = {stu1,stu2,stu3};
	
	OutputStream os=null;
	ObjectOutputStream oos=null;
	try {
		os = new FileOutputStream("f:/students.txt");
		oos = new ObjectOutputStream(os);
		oos.writeObject(students);
	} catch (FileNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally{
		try {
			os.close();
			oos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	}
		InputStream is = null;
		ObjectInputStream ois = null;
		try {
			is = new FileInputStream("F:/students.txt");
			ois = new ObjectInputStream(is); 
			Student[] stus = (Student[]) ois.readObject();
			System.out.println(Arrays.toString(stus));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				ois.close();
				is.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}

 

进程和线程

    进程
        应用程序的执行实例
        有独立的内存空间和系统资源
    线程
        CPU调度和分派的基本单位
        进程中执行运算的最小单位,可完成一个独立的顺序控制流程

什么是多线程

    如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程
    多个线程交替占用CPU资源,而非真正的并行执行

多线程好处

    充分利用CPU的资源
    简化编程模型
    带来良好的用户体验

主线程

    Thread类
        Java提供了java.lang.Thread类支持多线程编程
    主线程
        main()方法即为主线程入口
        产生其他子线程的线程
        必须最后完成执行,因为它执行各种关闭动作

线程的创建和启动

    在Java中创建线程的两种方式
        继承java.lang.Thread类
        实现java.lang.Runnable接口
    使用线程的步骤
        定义线程
        创建线程对象
        启动线程
        终止线程

继承Thread类创建线程

    定义MyThread类继承Thread类
重写run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
    多个线程交替执行,不是真正的“并行”
线程每次执行时长由分配的CPU时间片长度决定

继承Thread类创建线程

    定义MyThread类继承Thread类
重写run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
    多个线程交替执行,不是真正的“并行”
线程每次执行时长由分配的CPU时间片长度决定

实现Runnable接口创建线程

    定义MyRunnable类实现Runnable接口
实现run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程

比较两种创建线程的方式

    继承Thread类
        编写简单,可直接操作线程
        适用于单继承
    实现Runnable接口
        避免单继承局限性
        便于共享资源

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放在糖果旁的是我很想回忆的甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值