JAVA进阶24
1、局部内部类
1 package day10; 2 3 /** 4 * 如果一个类是定义在一个方法内部的,那么这就是一个局部内部类 5 * “局部”,只有当前所属的方法才能使用它,出了这个方法外面就不能用了 6 * 定义格式: 7 * 修饰符 class 外部类名称{ 8 * 修饰符 返回值类型 外部类名称(参数列表){ 9 * class 局部内部类名称{ 10 * //....... 11 * } 12 * } 13 * } 14 */ 15 public class Outer { 16 public void method01() { 17 class Inner { //局部内部类 18 int num = 100; 19 public void methodInner(){ 20 System.out.println(num); 21 } 22 } 23 Inner in = new Inner(); 24 in.methodInner(); 25 } 26 }
1 package day10; 2 3 /** 4 * -------调用outer 中的局部内部类 5 * 6 * @Classname OuterMain 7 * @Description TODO 8 * @Date 2019/5/5 22:25 9 * @Created by Administrator 10 */ 11 public class OuterMain { 12 public static void main(String[] args) { 13 Outer out = new Outer(); 14 out.method01(); 15 } 16 }
运行结果图
2、IO流练习(重新运行需更改文件路径位置)
1 package cn.demo02; 2 3 import java.io.*; 4 5 /** 6 * 1、图片读取到字节数组中 7 * 2、将字节数组写出到文件 8 */ 9 public class IO_Demo06 { 10 public static void main(String[] args) { 11 //图片转成字节数组 12 byte[] datas = fileToByteArray("F:/Java/test018/demo01/s.jpg"); 13 System.out.println(datas.length); 14 byteArrayToFile(datas, "F:/Java/test018/demo01/s1.jpg"); 15 } 16 17 /* 18 * 1、图片读取到字节数组汇总 19 * 1)、图片到程序,FileputStream 20 * 2)、程序到字节数组ByteArrayOutStream 21 */ 22 public static byte[] fileToByteArray(String filePath) { 23 //1、创建源与目的地 24 File src = new File(filePath); 25 byte[] dest = null; 26 //2、选择流 27 InputStream is = null; 28 ByteArrayOutputStream baos = null; 29 try { 30 is = new FileInputStream(src); 31 baos = new ByteArrayOutputStream(); 32 //3、操作 33 byte[] flush = new byte[1024 * 10]; //缓冲容器 34 int len = -1; //接收长度 35 while ((len = is.read(flush)) != -1) { 36 baos.write(flush, 0, len); //写出到字节数组中 37 } 38 baos.flush(); 39 return baos.toByteArray(); 40 } catch (FileNotFoundException e) { 41 e.printStackTrace(); 42 } catch (IOException e) { 43 e.printStackTrace(); 44 } finally { 45 try { 46 if (null != is) { 47 is.close(); 48 } 49 } catch (IOException e) { 50 e.printStackTrace(); 51 } 52 } 53 return null; 54 } 55 56 /* 57 * 2、字节数组写出到图片 58 * 1)字节数组到程序 ByteArrayInputStream 59 * 2)程序到文件FileOutputStream 60 */ 61 public static void byteArrayToFile(byte[] src, String filePath) { 62 //创建源 63 File dest = new File(filePath); 64 //选择流 65 InputStream is = null; 66 OutputStream os = null; 67 try { 68 is = new ByteArrayInputStream(src); 69 os = new FileOutputStream(dest); 70 //操作 71 byte[] flush = new byte[5]; //缓冲容器 72 int len = -1; //接收长度 73 while ((len = is.read(flush)) != -1) { 74 os.write(flush, 0, len); 75 } 76 os.flush(); 77 } catch (FileNotFoundException e) { 78 e.printStackTrace(); 79 } catch (IOException e) { 80 e.printStackTrace(); 81 } finally { 82 //释放资源 83 try { 84 if (null!=os){ 85 os.close(); 86 } 87 } catch (IOException e) { 88 e.printStackTrace(); 89 } 90 91 } 92 93 } 94 }
运行结果图
3、装饰器设计模式
1 package cn.demo02; 2 3 /** 4 * 模拟咖啡: 5 * 1、抽象组件:需要装饰的抽象对象(接口或抽象父类) 6 * 2、具体组件:需要装饰的对象 7 * 3、抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法 8 * 4、具体装饰类:被装饰的对象 9 */ 10 public class IO_DecorateTest02 { 11 public static void main(String[] args) { 12 Drink coffee = new Coffee(); 13 Drink suger = new Suger(coffee); //装饰 14 System.out.println(suger.info() + "--->" + suger.cost()); 15 Drink milk = new Milk(coffee); //装饰 16 System.out.println(milk.info() + "--->" + milk.cost()); 17 } 18 } 19 20 //抽象组件 21 interface Drink { 22 double cost(); //费用 23 24 String info(); //说明 25 } 26 27 //具体组件 28 class Coffee implements Drink { 29 private String name = "原味咖啡!"; 30 31 @Override 32 public double cost() { 33 return 15; 34 } 35 36 @Override 37 public String info() { 38 return name; 39 } 40 } 41 42 //抽象装饰类 43 abstract class Decorate implements Drink { 44 // 对抽象组件的引用 45 private Drink drink; 46 47 public Decorate(Drink drink) { 48 this.drink = drink; 49 } 50 51 @Override 52 public double cost() { 53 return this.drink.cost(); 54 } 55 56 @Override 57 public String info() { 58 return this.drink.info(); 59 } 60 } 61 62 //具体装饰类 63 class Milk extends Decorate { 64 65 public Milk(Drink drink) { 66 super(drink); 67 } 68 69 @Override 70 public double cost() { 71 return super.cost() * 4; 72 } 73 74 @Override 75 public String info() { 76 return super.info() + "加入了牛奶"; 77 } 78 } 79 80 //具体装饰类 81 class Suger extends Decorate { 82 83 public Suger(Drink drink) { 84 super(drink); 85 } 86 87 @Override 88 public double cost() { 89 return super.cost() * 2; 90 } 91 92 @Override 93 public String info() { 94 return super.info() + "加入了糖"; 95 } 96 }
运行结果图
4、匿名内部类
注意事项:①匿名内部类,在创建对象的时候,只能使用唯一一次!如果需要多次创建对象,而且类的内容一样的话,那么就必须使用单独定义的实现类
②匿名对象,在调用方法的时候,只能调用唯一一次。如果希望同一个对象,调用多次方法,那么必须给对象取一个名字。
③匿名内部类是省略了【实现类/子类名称】,但是倪敏对象时省略了【对象名称】
1 package Day11; 2 3 /** 4 * 如果接口的实现类(或者是父类的子类)只需要使用唯一的一次。 5 * 那么这种情况下就可以省略掉该类的定义。而改为使用【匿名内部类】 6 * 7 * 匿名内部类的定义格式: 8 * 接口名称 对象名 = new 接口名称(){ 9 * //覆盖重写所有的抽象方法 10 * }; 11 * @Classname MyInterfaceMain 12 * * @Description TODO 13 * * @Date 2019/5/6 21:05 14 * * @Created by Administrator 15 */ 16 public class MyInterfaceMain { 17 public static void main(String[] args) { 18 // MyInterface s = new MyInterfaceA(); 19 // s.method(); 20 //使用匿名内部类 21 MyInterface mi = new MyInterface() { 22 @Override 23 public void method() { 24 System.out.println("匿名内部类的使用!"); 25 } 26 }; 27 mi.method(); 28 } 29 }
运行结果图
5、IO转换流
1 package cn.demo02; 2 3 import java.io.*; 4 import java.nio.Buffer; 5 6 /** 7 * 转换流:InputStreamReader/OutputStreamWriter 8 * 1、以字符流的形式操作字节流(纯文本) 9 * 2、指定字符集 10 */ 11 public class IO_BufferedTest01 { 12 //操作System.in 和 System.out 13 public static void main(String[] args) { 14 try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 15 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));){ 16 //循环获取键盘的输入(exit退出),输出此内容 17 String msg = ""; 18 while (!msg.equals("exit")){ 19 msg = reader.readLine(); //循环读取 20 writer.write(msg); //循环写出 21 writer.newLine(); 22 writer.flush(); //强制刷新 23 } 24 }catch(IOException e){ 25 System.out.println("操作异常!"); 26 } 27 } 28 29 }
运行结果图
6、IO数据流
1 package cn.demo02; 2 3 import java.io.*; 4 5 /** 6 * IO数据流: 7 * 1、写出后读取 8 * 2、读取的顺序与写出保持一致 9 * 10 * DataOutputStream 11 * DataInputStream 12 * @Classname IO_DataTest01 13 * @Description TODO 14 * @Date 2019-5-7 11:28 15 * @Created by Administrator 16 */ 17 public class IO_DataTest01 { 18 public static void main(String[] args) throws IOException { 19 //写出 20 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 21 DataOutputStream dot = new DataOutputStream(new BufferedOutputStream(baos)); 22 //操作数据类型+数据 23 dot.writeUTF("你好"); 24 dot.writeInt(22); 25 dot.writeBoolean(false); 26 dot.writeChar('s'); 27 dot.flush(); 28 byte[] datas = baos.toByteArray(); 29 //读取 30 DataInputStream dis = new DataInputStream(new BufferedInputStream(new ByteArrayInputStream(datas))); 31 //顺序与写出的一致(不一致会报错) 32 String msg = dis.readUTF(); 33 int age = dis.readInt(); 34 boolean flag = dis.readBoolean(); 35 char ch = dis.readChar(); 36 System.out.println(flag); 37 } 38 }
运行结果图
7、IO对象流(读取与写出的顺序要保持一致)
1 package cn.demo02; 2 3 import java.io.*; 4 5 /** 6 * 对象流: 7 * 1、写出后读取 8 * 2、读取的顺序与写出保持一致 9 * 3、不是所有的对象都可以序列化 Serializable 10 * @Classname IO_Objtest01 11 * @Description TODO 12 * @Date 2019-5-7 11:48 13 * @Created by Administrator 14 */ 15 public class IO_Objtest01{ 16 public static void main(String[] args) throws IOException, ClassNotFoundException { 17 //写出 18 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 19 ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(baos)); 20 //操作数据类型+数据 21 oos.writeInt(24); 22 oos.writeUTF("黄平"); 23 oos.writeObject("弱是原罪!"); 24 Emp e = new Emp("岳飞",50000); 25 oos.writeObject(e); 26 oos.flush(); 27 byte[] datas = baos.toByteArray(); 28 System.out.println(datas.length); 29 //读取 30 ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(datas))); 31 //顺序与写出一致 32 int s = ois.readInt(); 33 String s1 = ois.readUTF(); 34 //对象的数据还原 35 Object a = ois.readObject(); 36 Object b = ois.readObject(); 37 38 if (b instanceof Emp){ 39 Emp emp = (Emp) b; 40 System.out.println(emp.getName()+"--》"+emp.getSlary()); 41 } 42 System.out.println(s1); 43 System.out.println(a); 44 } 45 } 46 class Emp implements java.io.Serializable{ 47 private String name; //transient可用于不需要序列化的 48 private double slary; 49 50 public Emp() { 51 } 52 53 public Emp(String name, double slary) { 54 this.name = name; 55 this.slary = slary; 56 } 57 58 public String getName() { 59 return name; 60 } 61 62 public void setName(String name) { 63 this.name = name; 64 } 65 66 public double getSlary() { 67 return slary; 68 } 69 70 public void setSlary(double slary) { 71 this.slary = slary; 72 } 73 }
运行结果图
8、IO打印流
1 package cn.demo02; 2 3 import java.io.*; 4 5 /** 6 * 7 * 打印流: PrintStream 8 * @Classname IO_PrintTest01 9 * @Description TODO 10 * @Date 2019-5-7 14:13 11 * @Created by Administrator 12 */ 13 public class IO_PrintTest01 { 14 public static void main(String[] args) throws FileNotFoundException { 15 //打印流System.out 16 PrintStream ps = System.out; 17 ps.println("打印流"); 18 ps.println(true); 19 20 ps = new PrintStream(new BufferedOutputStream(new FileOutputStream("aaa.txt")),true); 21 ps.println("打印流"); 22 ps.println(true); 23 ps.close(); 24 25 //重定向输出端 26 System.setOut(ps); 27 System.out.println("change"); 28 29 //重定向回控制台 30 ps = new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.out)),true); 31 System.out.println("i am back..."); 32 } 33 }
运行结果图