java快速入门 (12)

打印流是输出信息最方便的类,注意包含字节打印流PrintStream和字符打印流:PrintWriter。打印流提供了非常方便的打印功能,
可以打印任何类型的数据信息,例如:小数,整数,字符串。

对象流

对象的输入输出流的作用: 用于写入对象 的信息和读取对象的信息。 使得对象持久化。
ObjectInputStream : 对象输入流
ObjectOutPutStream :对象输出流

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; //创建要写入磁盘的类,这个类需要实现接口 Serializable(可系列化的) class Student implements Serializable{ // 在这里保证了serialVersionUID 的唯一性,防止属性变量的临时改变,从而造成写入id与读取id不同 private static final long serialVersionUID = 1L; int id ; //额外需要添加一个属性 String name ; transient String sex; //transient修饰属性,表示暂时的,则这个属性不会被写入磁盘 transient int age; public Student(String name,String sex,int age){ this.name = name; this.sex = sex; this.age = age; } } public class objectIO { /** * @param args * @throws IOException * @throws ClassNotFoundException */ public static void main(String[] args) throws IOException, ClassNotFoundException { // TODO Auto-generated method stub createObj(); readObj(); } //(一)先写入对象 public static void createObj() throws IOException { //1.创建目标路径 File file = new File("C:\\Users\\bg\\Desktop\\objTest.txt"); //2.创建流通道 FileOutputStream fos = new FileOutputStream(file); //3.创建对象输出流 ObjectOutputStream objOP = new ObjectOutputStream(fos); //4.创建类对象,并初始化 Student stu = new Student("玛丽苏", "男", 18); //5.向目标路径文件写入对象 objOP.writeObject(stu); //6.关闭资源 objOP.close(); } //再读取对象 public static void readObj() throws IOException, ClassNotFoundException { File file = new File("C:\\Users\\bg\\Desktop\\objTest.txt"); FileInputStream fis = new FileInputStream(file); ObjectInputStream objIP = new ObjectInputStream(fis); //读取对象数据,需要将对象流强制转换为 要写入对象的类型 Student stu = (Student)objIP.readObject(); System.out.println("\n name:"+stu.name+"\n sex:"+stu.sex+"\n age:"+stu.age); objIP.close(); } } 流的关闭顺序

一般情况下是:先打开的后关闭,后打开的先关闭

另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b。例如,处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b

可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法。

12.多线程 进程与线程 线程的创建

继承Thread类,实现Runnable接口,实现Callable接口

1.继承Thread类

public class ThreadCreateDemo1 { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); //调用start()方法启动线程,线程不一定立即执行,CPU安排调度 } } class MyThread extends Thread {//继承Thread类 @Override public void run() {//重写run()方法,编写线程执行体 super.run(); System.out.println("hellow_world!"); } }

2.实现Runnable接口

public class ThreadCreateDemo2 { //创建线程对象,调用start()方法启动线程 public static void main(String[] args) { Runnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); } } class MyRunnable implements Runnable { public void run() { System.out.println("通过Runnable创建的线程!"); } }

上述两种创建方式,工作时性质一样。但是建议使用*实现Runable接口*方式。解决单继承的局限性。

3.实现Callable接口

public class ThreadCreateDemo3 implements Callable<Integer>{ // 实现call方法,作为线程执行体 public Integer call(){ int i = 0; for ( ; i < 100 ; i++ ){ System.out.println(Thread.currentThread().getName()+ "\t" + i); } // call()方法可以有返回值 return i; } public static void main(String[] args) { // 创建Callable对象 ThreadCreateDemo3 myCallableTest = new ThreadCreateDemo3(); // 使用FutureTask来包装Callable对象 FutureTask<Integer> task = new FutureTask<Integer>(myCallableTest); for (int i = 0 ; i < 100 ; i++){ System.out.println(Thread.currentThread().getName()+ " \t" + i); if (i == 20){ // 实质还是以Callable对象来创建、并启动线程 new Thread(task , "callable").start(); } } try{ // 获取线程返回值 System.out.println("callable返回值:" + task.get()); } catch (Exception ex){ ex.printStackTrace(); } } }

实现Callable接口,需要返回值类型

重写call方法,需要抛出异常

创建目标对象

创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);

提交执行:Future result1 = ser.submit(t1);

获取结果:boolean r1 = result1.get()

关闭服务:ser.shutdownNow();
总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfzgp.html