文件、线程章节的一些案例(heima)

1、向array.txt文件中写入如下内容:(集合到文件)
lin,30
zhang,20
hh,25

package learnjava;

import java.io.*;
import java.util.*;

public class Demo {
    public static Set<String> res=new HashSet<>();
    public static void main(String[] args) throws IOException {

        ArrayList<Student> array=new ArrayList<>();
        Student s1=new Student("lin",30);
        Student s2=new Student("zhang",20);
        Student s3=new Student("hh",25);

        array.add(s1);
        array.add(s2);
        array.add(s3);

        BufferedWriter bw=new BufferedWriter(new FileWriter("hh\\array.txt"));

        for(Student s:array){
            bw.write(s.getName()+","+s.getAge());
            bw.newLine();
        }

        bw.close();
    }
}

2、复制多级文件夹

package learnjava;

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException{
        File from=new File("C:\\数据库作业");
        File to=new File("D:\\");

        copyFolder(from,to);
    }

    public static void copyFolder(File from,File to) throws IOException{
        if(from.isDirectory()){//from是文件夹
            //拷贝from文件夹名
            File fromCopy=new File(to,from.getName());//File(File parent,String child)
            if(!fromCopy.exists()){
                fromCopy.mkdir();
            }

            File[] fileArray=from.listFiles();

            for(File file:fileArray){
                copyFolder(file,fromCopy);//将源文件夹下的文件/目录 拷贝到 目的文件夹下
            }
        }else{//from是文件
            //拷贝from文件名
            File newFile=new File(to,from.getName());
            //拷贝文件内容
            copyFile(from,newFile);
        }
    }

    public static void copyFile(File srcFile,File destFile) throws IOException{
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream(srcFile));
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(destFile));

        byte[] bys=new byte[1024];
        int len;
        while ((len=bis.read(bys))!=-1){
            bos.write(bys,0,len);
        }
        bis.close();
        bos.close();
    }
}

3、复制文件的异常处理:

(1)

    public static void method() {
        FileReader fr=null;
        FileWriter fw=null;
        try{
            fr=new FileReader("fr.txt");
            fw=new FileWriter("fw.txt");

            char[] chs=new char[1024];
            int len;
            while ((len=fr.read(chs))!=-1) {
                fw.write(chs, 0, len);
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally {
            try {
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

(2)JDK7版本改进

    public static void method() {
        try(FileReader fr=new FileReader("fr.txt");
            FileWriter fw=new FileWriter("fw.txt");){

            char[] chs=new char[1024];
            int len;
            while ((len=fr.read(chs))!=-1) {
                fw.write(chs, 0, len);
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }

4、对象序列化流、反序列化流(seriaVersionID、transient)

package learnjava;

import java.io.Serializable;

public class Student  implements Serializable {
    private String name;
    private transient int age;

    public Student(){

    }

    public Student(String name,int age){
        this.name=name;
        this.age=age;
    }

    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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package learnjava;

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        write();
        read();
    }

    public static void write() throws IOException {//序列化
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("hh\\oos.txt"));
        Student s=new Student("林青霞",30);
        oos.writeObject(s);
        oos.close();
    }

    public static void read() throws IOException, ClassNotFoundException {//反序列化
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("hh\\oos.txt"));
        Object s=ois.readObject();
        Student stu=(Student) s;
        System.out.println(stu.getName()+","+((Student) s).getAge());
        //林青霞,0
        ois.close();
    }
}

5、游戏次数案例

package learn;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

public class Demo {
    public static void main(String[] args) throws IOException {
        Properties prop=new Properties();
        FileReader fr=new FileReader("D:\\game.txt");
        prop.load(fr);
        fr.close();

        int count=Integer.parseInt(prop.getProperty("count"));//prop.getProperty(string)返回string类型
        if(count>=3){
            System.out.println("游戏试玩已结束,想玩请充值(www.itcast.cn)");
        }else{
            GuessNumber.start();//玩一次游戏

            count++;
            prop.setProperty("count",String.valueOf(count));
            FileWriter fw=new FileWriter("D:\\game.txt");
            prop.store(fw,null);
            fw.close();
        }
    }
}

6、买票案例:

package learn;

public class SellTicket implements Runnable {
    private int tickets=100;
    @Override
    public void run(){
        while (true){
            if(tickets>0){
                System.out.println(Thread.currentThread().getName()+"正在出售第"+
                        tickets+"张票");
                tickets--;
            }
        }
    }
}
package learn;

import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        SellTicket st=new SellTicket();

        //Thread(Runnable target,String name)
        Thread t1=new Thread(st,"窗口1");
        Thread t2=new Thread(st,"窗口2");
        Thread t3=new Thread(st,"窗口3");

        t1.start();
        t2.start();
        t3.start();
    }
}
/*
输出:
窗口1正在出售第100张票
窗口2正在出售第100张票
窗口3正在出售第100张票
窗口2正在出售第98张票
窗口1正在出售第99张票
窗口2正在出售第96张票
窗口3正在出售第97张票
窗口3正在出售第93张票
窗口2正在出售第94张票
窗口1正在出售第95张票
窗口2正在出售第91张票
窗口3正在出售第92张票
窗口3正在出售第88张票
窗口3正在出售第87张票
窗口2正在出售第89张票
窗口1正在出售第90张票
窗口2正在出售第85张票
窗口2正在出售第83张票
窗口2正在出售第82张票
窗口2正在出售第81张票
窗口2正在出售第80张票
窗口2正在出售第79张票
窗口2正在出售第78张票
窗口2正在出售第77张票
窗口2正在出售第76张票
窗口2正在出售第75张票
窗口2正在出售第74张票
窗口2正在出售第73张票
窗口2正在出售第72张票
窗口2正在出售第71张票
窗口2正在出售第70张票
窗口2正在出售第69张票
窗口2正在出售第68张票
窗口2正在出售第67张票
窗口2正在出售第66张票
窗口2正在出售第65张票
窗口2正在出售第64张票
窗口2正在出售第63张票
窗口2正在出售第62张票
窗口2正在出售第61张票
窗口2正在出售第60张票
窗口2正在出售第59张票
窗口2正在出售第58张票
窗口2正在出售第57张票
窗口2正在出售第56张票
窗口2正在出售第55张票
窗口2正在出售第54张票
窗口2正在出售第53张票
窗口2正在出售第52张票
窗口2正在出售第51张票
窗口2正在出售第50张票
窗口2正在出售第49张票
窗口2正在出售第48张票
窗口2正在出售第47张票
窗口2正在出售第46张票
窗口2正在出售第45张票
窗口3正在出售第86张票
窗口2正在出售第44张票
窗口1正在出售第84张票
窗口2正在出售第42张票
窗口3正在出售第43张票
窗口3正在出售第39张票
窗口3正在出售第38张票
窗口3正在出售第37张票
窗口3正在出售第36张票
窗口3正在出售第35张票
窗口2正在出售第40张票
窗口2正在出售第33张票
窗口2正在出售第32张票
窗口2正在出售第31张票
窗口2正在出售第30张票
窗口2正在出售第29张票
窗口2正在出售第28张票
窗口2正在出售第27张票
窗口2正在出售第26张票
窗口2正在出售第25张票
窗口2正在出售第24张票
窗口2正在出售第23张票
窗口2正在出售第22张票
窗口1正在出售第41张票
窗口2正在出售第21张票
窗口3正在出售第34张票
窗口2正在出售第19张票
窗口1正在出售第20张票
窗口2正在出售第17张票
窗口3正在出售第18张票
窗口3正在出售第14张票
窗口3正在出售第13张票
窗口3正在出售第12张票
窗口3正在出售第11张票
窗口3正在出售第10张票
窗口3正在出售第9张票
窗口3正在出售第8张票
窗口3正在出售第7张票
窗口3正在出售第6张票
窗口3正在出售第5张票
窗口3正在出售第4张票
窗口3正在出售第3张票
窗口3正在出售第2张票
窗口3正在出售第1张票
窗口2正在出售第15张票
窗口1正在出售第16张票
......
*/

同步方法解决数据安全问题:

package learn;

public class SellTicket implements Runnable {
    private int tickets=100;//共享数据
    @Override
    public void run(){
        while (true){
            sellTickets();
        }
    }
    public synchronized void sellTickets(){
        if(tickets>0){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"正在出售第"+
                    tickets+"张票");
            tickets--;
        }
    }
}

7、线程安全的类:
StringBuffer
Vector
Hashtable

Collections中的synchronizedList、synchronizedMap、synchronizedSet方法

public static <T> List<T> synchronizedList​(List<T> list)返回由指定列表支持的同步(线程安全)列表。
public static <K,V> Map<K,V> synchronizedMap​(Map<K,V> m)返回由指定地图支持的同步(线程安全)映射。
public static <T> Set<T> synchronizedSet​(Set<T> s)返回由指定集合支持的同步(线程安全)集。
List<String> list= Collections.synchronizedList(new ArrayList<>());

8、案例:生产者生产一瓶牛奶,消费者消费一瓶

Class IllegalMonitorStateException
抛出以表示线程已尝试在对象的监视器上等待或通知其他线程等待对象的监视器,而不拥有指定的监视器。

package learn;

import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws IOException {
        Box b=new Box();
        Producer p=new Producer(b);
        Consumer c=new Consumer(b);//共享同一个奶箱资源

        //Thread(Runnable target)
        Thread t1=new Thread(p);
        Thread t2=new Thread(c);

        t1.start();
        t2.start();
        /*
        生产者将第1瓶奶放入奶箱
        消费者拿到第1瓶奶
        生产者将第2瓶奶放入奶箱
        消费者拿到第2瓶奶
        生产者将第3瓶奶放入奶箱
        消费者拿到第3瓶奶
        生产者将第4瓶奶放入奶箱
        消费者拿到第4瓶奶
        生产者将第5瓶奶放入奶箱
        消费者拿到第5瓶奶
         */
    }
}
package learn;

public class Box {
    private int milk;//表示第几瓶奶
    private boolean state;
    public synchronized void put(){
        if(state){//奶箱中有牛奶,等待消费者消费
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        milk++;
        System.out.println("生产者将第"+milk+"瓶奶放入奶箱");

        state=true;
        notifyAll();
    }

    public synchronized void get(){
        if(!state){//奶箱中没有牛奶,等待生产者生产,消费者暂时不消费
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("消费者拿到第"+milk+"瓶奶");
        state=false;
        notifyAll();
    }
}
package learn;

public class Producer implements Runnable{
    private Box b;
    public Producer(Box b){
        this.b=b;
    }
    @Override
    public void run(){
        for(int i=1;i<=5;i++){
            b.put();
        }
    }
}
package learn;

public class Consumer implements Runnable{
    private Box b;
    public Consumer(Box b){
        this.b=b;
    }
    @Override
    public void run(){
        while (true){
            b.get();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值