输入输出流
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接口
避免单继承局限性
便于共享资源