Java学习笔记 - 第022天

每日要点

概要

两种对称性

字节 字符
InputStream Reader
OutputStream Writer
输入 输出
InputStream OutputStream
Reader Writer
read() write()

两种设计模式
1.装潢模式 - 过滤流
2.适配器模式 - 转换流

三种流
1.数据流(原始流)
2.过滤流(处理流)
2.转换流(编码转换)

原始流

FileOutputSteam - 指定文件作为输出的目的地 - 数据流(原始流)

过滤流

PrintStream - 本身没有输出的目的地要依赖数据流才能使用 - 过滤流(处理流)
过滤流通常都比数据流拥有更多的方法方便对流进行各种的操作

System中的in和out的两个流可以进行重定向
System.setOut(out);
例子1:99乘法表

    public static void main(String[] args) {
        try (PrintStream out = new PrintStream(new FileOutputStream("c:/99.txt"))) {    
    //  try (PrintStream out = new PrintStream("c:/99.txt")) {  
            // System中的in和out的两个流可以进行重定向
            // System.setOut(out);
            for (int i = 1; i <= 9; i++) {
                for (int j = 1; j <= i; j++) {
                //  System.out.printf("%d*%d=%d\t", i, j, i * j);
                    out.printf("%d*%d=%d\t", i, j, i * j);
                }
            //  System.out.println();
                out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

例子2:
其中小知识:如何在类路径下取资源文件:

    public static void main(String[] args) throws InterruptedException {
        // 如何在类路径下取资源文件
        ClassLoader loader = Test01.class.getClassLoader();
        InputStream in = loader.getResourceAsStream("resources/致橡树.txt");
    //  try (Reader reader = new FileReader("c:/致橡树.txt")) {
        try (Reader reader = new InputStreamReader(in)) {
            BufferedReader br = new BufferedReader(reader);
        //  LineNumberReader lineNumberReader = new LineNumberReader(reader);
            String str;
            while ((str = br.readLine()) != null) {
        //  while ((str = lineNumberReader.readLine()) != null) {
        //      System.out.print(lineNumberReader.getLineNumber());
                System.out.println(str);
                Thread.sleep(1000);
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

转换流

转换流 - 将字节流适配成字符流 (实现从字节到字符的转换)
如果应用程序中需要做编码转换(将8位编码转换成16位编码)就需要使用转换流
例子1:普通方法

    public static void main(String[] args) {
        System.out.print("请输入: ");
        byte[] buffer = new byte[1024];
        try {
            int totalBytes = System.in.read(buffer);
            String str = new String(buffer, 0, totalBytes);
            int endIndex = str.indexOf("\r\n");
            if (endIndex != -1) {
                str = str.substring(0, endIndex);
            }
            int a = Integer.parseInt(str);
        //  System.out.println(str.toUpperCase());
            System.out.println(a > 5);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

例子2:转换流 不使用Scanner从键盘输入读取数据

    public static void main(String[] args) {
        System.out.print("请输入: ");
        try {
            // 转换流 - 将字节流适配成字符流 (实现从字节到字符的转换)
            // 如果应用程序中需要做编码转换(将8位编码转换成16位编码)就需要使用转换流
            InputStreamReader inputReader = new InputStreamReader(System.in);
            BufferedReader bufferedReader = new BufferedReader(inputReader);
            String str;
            while ((str = bufferedReader.readLine()) != null) {
                System.out.println(str.toUpperCase());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

序列化和反序列化

把对象写入到流中 - 序列化(serialization)
串行化/归档/腌咸菜

从流中读取对象 - 反序列化(反串行化/解归档)

serialVersionUID 相当于版本号
被transient修饰的属性不参与系列化和反序列化
private transient String tel;
注意:如果学生对象要支持序列化操作那么学生对象关联的其他对象也要支持序列化

例子1:实现对学生类和车类序列化保存对象为文件,再反序列化读取
学生类:

public class Student implements Serializable{
    private static final long serialVersionUID = 1L;  // serialVersionUID 相当于版本号
    private String name;
    private int age;
    // 被transient修饰的属性不参与系列化和反序列化
    private transient String tel;
    // 如果学生对象要支持序列化操作那么学生对象关联的其他对象也要支持序列化
    private Car car;
        
    public Student(String name, int age, String tel) {
        this.name = name;
        this.age = age;
        this.tel = tel;
    }
    
    public void setCar(Car car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "name=" + name + ", age=" + age + 
                ", tel=" + tel + "," + car.toString();
    }   
}

车类:

public class Car implements Serializable{
    private static final long serialVersionUID = 1L;
    private String brand;
    private int maxSpeed;
    
    public Car(String brand, int maxSpeed) {
        this.brand = brand;
        this.maxSpeed = maxSpeed;
    }
    
    @Override
    public String toString() {
        return "car=[brand=" + brand + ", maxSpeed=" + maxSpeed + "]";
    }   
}

序列化:

    public static void main(String[] args) {
        Student student = new Student("王大锤", 18, "13521324325");
        student.setCar(new Car("QQ", 128));
        System.out.println(student);
        try (OutputStream out = new FileOutputStream("c:/stu.data")) {
            ObjectOutputStream oos = new ObjectOutputStream(out);
            oos.writeObject(student);
            System.out.println("存档成功!");
        } catch (IOException e) { 
            e.printStackTrace();
        }
    }

反序列化:

    public static void main(String[] args) {
        try (InputStream in = new FileInputStream("c:/stu.data")) {
            ObjectInputStream ois = new ObjectInputStream(in);
            Object object = ois.readObject();
            System.out.println(object);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

昨日作业讲解

  • 作业1:九九乘法表文件输出(普通方法)
    public static void main(String[] args) {
        try (Writer writer = new FileWriter("c:/九九表.txt")) {
            for (int i = 1; i <= 9; i++) {
                for (int j = 1; j <= i; j++) {
                    String str = String.format("%d*%d=%d\t", i, j, i * j);
                    writer.write(str);
                }
                writer.write("\r\n");
            }
            System.out.println("程序执行成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  • 作业2:写一个方法实现文件拷贝功能
    public static void fileCopy(String source, String target) throws IOException {
        try (InputStream in = new FileInputStream(source);
                OutputStream out = new FileOutputStream(target)) {  
            byte[] buffer = new byte[512];
            int totalBytes;
            while ((totalBytes = in.read(buffer)) != -1) {
                out.write(buffer, 0, totalBytes);
            }
            
        }
    }
    
    public static void main(String[] args) {
        try {
            long start = System.currentTimeMillis();
            fileCopy("C:/Users/Administrator/Downloads/YoudaoDict.exe", "C:/Users/Administrator/Desktop");
            long end = System.currentTimeMillis();
            System.out.println((end - start) + "ms");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

作业

  • **作业1:建一个文本文件 写很多话 做一个窗口 随机显示一句话 点一下换一句 **
    随机文本类:
public class RandomText {
    private List<String> list = new ArrayList<>();
    private String str;
    private int totalRows;
    private int randomNum;
    
    public RandomText() {
        try {
            this.random();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private void random() throws IOException {
        ClassLoader loader = RandomText.class.getClassLoader();
        InputStream in = loader.getResourceAsStream("resources/致橡树.txt");
        InputStreamReader reader = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(reader);  
        while ((str = br.readLine()) != null) {
            list.add(str);
            totalRows += 1;
        }
    }
    
    public String randomLine() {
            randomNum = (int) (Math.random() * totalRows);
            str = list.get(randomNum);
            return str;
    }
}

窗口类:

public class MyFrame extends JFrame {
    private static final long serialVersionUID = 1L;
    private RandomText rt = new RandomText();
    private JLabel label;

    public MyFrame() {
        this.setTitle("随机话");
        this.setSize(350, 200);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        label = new JLabel(rt.randomLine());
        label.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        this.add(label);
        
        JPanel panel = new JPanel();
        this.add(panel, BorderLayout.SOUTH);
        JButton button = new JButton("换一句");
        button.addActionListener(e -> {
            String command = e.getActionCommand();
            if (command.equals("换一句")) {
                label.setText(rt.randomLine());
            }
        });
        panel.add(button);
    }
    
    public static void main(String[] args) {
        new MyFrame().setVisible(true);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,587评论 18 399
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 1,348评论 0 6
  • 一、流的概念和作用。 流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总成或抽象。即数据在两设备之间的传输...
    布鲁斯不吐丝阅读 10,018评论 2 95
  • 昨天是周末,三姊妹决定让孩子们聚聚。 姐姐家是儿子,在北京上大学。我家是女儿,在厦门上大学,妹妹家是女儿,今年...
    心际流尘阅读 265评论 0 0