Java基础


提示:以下是本篇文章正文内容,下面案例可供参考

File

是文件和目录【路径名】的抽象表示

1.File类的构造方法

public static void construction_Method(){
    //构造方法1,格式:new File("路径");
    File file1 = new File("E:\\test\\java.txt");
    System.out.println(file1);

    //构造方法2,格式:new File("父路径", "子路径");
    File file2 = new File("E:\\test", "java.txt");
    System.out.println(file2);

    //构造方法1,格式:格式1+格式2
    File file3 = new File("E:\\test");
    File file4 = new File(file3, "java.txt");
    System.out.println(file4);
}

2.File类的创建

public static boolean create_Method() throws IOException {
    boolean flag = false;

    //方法1:createNewFile(),【文件】不存在则创建(返回Boolean值)
    File file1 = new File("E:\\test\\java.txt");
    if (file1.createNewFile()){
        flag = true;
        System.out.println("文件创建成功");
    }else {
        System.out.println("文件创建失败");
        return flag;
    }

    //方法2:mkdir(),【目录】不存在则创建(返回Boolean值)
    File file2 = new File("E:\\testFile");
    if (file2.mkdir()){
        flag = true;
        System.out.println("目录创建成功");
    }else {
        System.out.println("目录创建失败");
        return flag;
    }

    //方法3:mkdirs(),【目录】不存在则创建(可创建多级目录,返回Boolean值)
    File file3 = new File("E:\\testFile\\testJAVA\\test");
    if (file3.mkdirs()){
        flag = true;
        System.out.println("目录创建成功");
    }else {
        System.out.println("目录创建失败");
        return flag;
    }
    return flag;
}

3.File类的常用方法

public static void common_Method(){
    File file = new File("myFile\\java.txt");

    //判断该【抽象路径】表示的【File】是否为【目录】:isDirectory()
    System.out.println("是否为目录" + file.isDirectory());

    //判断该【抽象路径】表示的【File】是否为【文件】:isFile()
    System.out.println("是否为文件" + file.isFile());

    //判断该【抽象路径】表示的【File】是否【存在】:exists()
    System.out.println("是否为存在" + file.exists());

    //获取该【抽象路径】的【绝对路径名】字符串:getAbsolutePath()
    System.out.println("绝对路径为:" + file.getAbsoluteFile());

    //获取该【抽象路径】的【路径名】字符串:getPath()
    System.out.println("路径为:" + file.getPath());

    //获取该【抽象路径】所表示的【文件名】或【目录名】:getName()
    System.out.println("名称为:" + file.getName());

    //获取该【抽象路径】所表示的【目录】中的文件名和目录名【字符串数组】:list()
    File file2 = new File("E:\\test");
    String[] strArr = file2.list();
    for (String str:strArr)
        System.out.println(str);
        
    //获取该【抽象路径】所表示的【目录】中的文件和目录【File对象数组】:listFiles()
    File[] fileArr = file2.listFiles();
    for (File filetest:fileArr)
        //只取文件
        if (filetest.isFile())
            //打印文件名和文件路径
            System.out.println(filetest.getName() + "的路径为:" + filetest.getPath());

    //删除文件或目录:delete()
    File dir = new File("E:\\myFileTest\\test");
    File file3 = new File(dir, "java.txt");
    try {
        dir.mkdirs();
        if (file3.createNewFile()){
            System.out.println("文件创建成功,所在路径为:" + file3.getPath());
        }else {
            System.out.println("文件创建失败");
        }
        //要删除myFileTest目录得先删完目录内的文件
        file3.delete();
        if (dir.delete()) {
            System.out.println("删除成功,删除的目录为:" + dir.getName());
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}

4.练习

遍历某个目录下的所有内容

public static void getAllFile(File srcFile){
    File[] filesArr = srcFile.listFiles();
    //判断该目录下是否为空
    if (filesArr != null){
        //遍历获取文件
        for (File file:filesArr){
            //判断是否还有目录,若有目录则递归调用继续遍历
            if (file.isDirectory()){
                getAllFile(file);
            }else {
                System.out.println(file.getAbsoluteFile());
            }
        }
    } else {
        System.out.println("该目录下无内容");
    }
}

复制多级文件夹

public static void main(String[] args) {
    File srcFile = new File("E:\\myFileTest");
    File destFile = new File("F:\\");
    copyFolder(srcFile, destFile);
}

//复制文件夹
public static void copyFolder(File srcFile, File destFile){
    // 对源文件进行判断
    if (srcFile.isDirectory()){             //对目录的操作
        // 1.在目的盘下创建源目录
        // 获取源目录名
        String srcFileName = srcFile.getName();
        // 在目的盘上拼接文件名:destFile:\\srcFileName
        File newFolder = new File(destFile, srcFileName);
        // 判断目的盘是否已存在该文件
        if (!newFolder.exists()){
            newFolder.mkdirs();
        } else {
            System.out.println("该目录已存在,请删除后再进行操作");
        }
        // 2.获取源File下的所有内容
        File[] fileArr = srcFile.listFiles();
        // 3.递归判断源File下的所有内容
        for (File file : fileArr) {
            copyFolder(file, newFolder);
        }
    } else {                                //对文件的操作
        // 1.在目的盘拼接文件名:destFile:\\*\\srcFile.xx
        File newFile = new File(destFile, srcFile.getName());
        // 2.调用函数进行文件复制
        copyFile(srcFile, newFile);
    }
}
//复制文件
public static void copyFile(File srcFile, File destFile){
    BufferedInputStream bIps = null;
    BufferedOutputStream bOps = null;

    try {
        bIps = new BufferedInputStream(new FileInputStream(srcFile));
        bOps = new BufferedOutputStream(new FileOutputStream(destFile));

        byte[] bys = new byte[1024];
        int len;
        while ((len=bIps.read()) != -1){
            bOps.write(bys, 0, len);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (bIps != null){
            try {
                bIps.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (bOps != null){
            try {
                bOps.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

IO流

IO实际上就是数据传输,常见应用:文件上传、下载、复制(O用来写,I用来读)
分类(默认按数据类型来分):字节流(又称为万能流)、字符流

字节流

1.输入流

public static void FileInPuttest(){
    //读简单字节文件
    FileInputStream fileInputStream = null;
    FileInputStream fileInputStream2 = null;
    try {
        fileInputStream = new FileInputStream("E:\\myInputTest\\java.txt");

        //读数据(得一个字符一个字符的读)
//            int read = fileInputStream.read();
//            System.out.println(read);
//            System.out.println((char)read);
//            read = fileInputStream.read();
//            System.out.println(read);
//            System.out.println((char)read);

        //遍历整个字节文本数据
        int read = 0;
        while ((read=fileInputStream.read()) != -1){        
        //read=fileInputStream.read())即相当于上面一个一个的读
            System.out.println((char)read);
        }
        
    	//读一个字节数组的数据
		fileInputStream2 = new FileInputStream("E:\\myInputTest\\web.txt");
        byte[] bys = new byte[1024];
        int len;
        while ((len=fileInputStream2.read(bys)) != -1){
            System.out.println(new String(bys, 0, len));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fileInputStream != null){
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

2.输出流

public static void FileOutPuttest(){
    //通过字节流创建文件对象,会自动创建文件
    /*
        字节流操作过程:
            调用系统功能创建了文件;创建字节流对象;将字节流对象指向文件
     */
    //true表示写入的内容插入末尾
    FileOutputStream fileInputStream = null;
    try {
        fileInputStream = new FileOutputStream("myByteStream\\test1.txt", true);
        //写入字节,写入非字节内容时,要调用getBytes()方法
        fileInputStream.write(92);
        //插入换行符
        fileInputStream.write("\r\n".getBytes());
        fileInputStream.write("hello".getBytes());
        byte[] bys = {1,14,65,86};
        fileInputStream.write(bys);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fileInputStream != null){
            //关闭流
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3.字节缓冲流

BufferedOutputStream、BufferedInputStream。作用:提高读写数据的效率

//BufferedOutputStream
public static void BufferOpS(){
    FileOutputStream fOpS = null;
    BufferedOutputStream bfOpS = null;

    try {
        //写法一
        //fOpS = new FileOutputStream("myByteStream\\test1.txt", true);
        //bfOpS = new BufferedOutputStream(fOpS);

        //写法二
        bfOpS = new BufferedOutputStream(new FileOutputStream("myByteStream\\test1.txt", true));

        //写数据
        bfOpS.write("hello".getBytes());
        bfOpS.write("world".getBytes());

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fOpS != null){
            try {
                fOpS.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if ( bfOpS != null){
            try {
                bfOpS.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

//BufferedInputStream
public static void BufferIpS(){
    FileInputStream fIpS = null;
    BufferedInputStream bfIpS = null;

    try {
        //写法一
        //fIpS = new FileOutputStream("myByteStream\\test1.txt", true);
        //bfIpS = new BufferedOutputStream(fOpS);

        //写法二
        bfIpS = new BufferedInputStream(new FileInputStream("myByteStream\\test1.txt"));

        //读数据
        int by;
        while ((by=bfIpS.read()) != -1){
            System.out.println((char)by);
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fIpS != null){
            try {
                fIpS.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if ( bfIpS != null){
            try {
                bfIpS.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

练习

复制文本文件

public static void copyFileTest(){
    //把E:\\myFiltest\\java.txt文件的内容,复制到项目目录下的java.txt中
    FileInputStream fileIpS = null;
    FileOutputStream fileOpS = null;
    try {
        fileIpS = new FileInputStream("E:\\myFiletest\\java.txt");
        fileOpS = new FileOutputStream("myByteStream\\java.txt");

        //读取数据
        int file = 0;
        while ((file=fileIpS.read()) != -1){
            fileOpS.write(file);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fileIpS != null){
            try {
                fileIpS.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (fileOpS != null){
            try {
                fileOpS.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

复制图片文件

public static void copyImgTest(){
    FileInputStream fileIps = null;
    FileOutputStream fileOps = null;
    try {
        fileIps = new FileInputStream("E:\\myFiletest\\md.png");
        fileOps = new FileOutputStream("myByteStream\\md.png");

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

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fileIps != null){
            try {
                fileIps.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (fileOps != null){
            try {
                fileOps.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

复制视频

public static void copyVedio(){
    //记录开始时间
    long startTime = System.currentTimeMillis();

    //复制视频
    FileInputStream fIps = null;
    FileOutputStream fOps = null;
    BufferedInputStream bfIps = null;
    BufferedOutputStream bfOps = null;

    try {
        fIps = new FileInputStream("E:\\test\\test.avi");
        fOps = new FileOutputStream("myByteStream\\test.avi");

        // 1.普通方式
//            int by;
//            while ((by=fIps.read()) != -1){
//                fOps.write(by);
//            }
        // 2.字节数组方式
//            byte[] bys = new byte[1024];
//            int len;
//            while ((len=fIps.read(bys)) != -1){
//                fOps.write(bys, 0, len);
//            }
        // 3.使用字节缓冲流的普通方式
//            bfIps = new BufferedInputStream(fIps);
//            bfOps = new BufferedOutputStream(fOps);
//            int by;
//            while ((by=bfIps.read()) != -1){
//                bfOps.write(by);
//            }
        // 4.使用字节缓冲流读字节数组的方式,最推荐
        bfIps = new BufferedInputStream(fIps);
        bfOps = new BufferedOutputStream(fOps);
        byte[] bys = new byte[1024];
        int len;
        while ((len=bfIps.read(bys)) != -1){
            bfOps.write(bys, 0, len);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fOps != null){
            try {
                fOps.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (fOps != null){
            try {
                fOps.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (bfIps != null){
            try {
                bfIps.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (bfOps != null){
            try {
                bfOps.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //记录结束时间
    long endTime = System.currentTimeMillis();
    System.out.println("共耗时:" + (endTime-startTime) + "毫秒");;
}

字符流

解决字节流操作中文乱码问题,适合纯文本文件,字符流=字节流+编码表
一个汉子在GBK中占2个字节,在UTF8中占3个字节

1.字符输入流

Reader:FileReader、BufferedReader

public static void ReaderTest(){
   //FileReader
//        FileReader fileReader = null;
//        try {
//            fileReader = new FileReader("E:\\test\\java.txt");
//
//            //读文件
//            char[] chars = new char[1024];
//            int len = 0;
//            while ((len=fileReader.read(chars)) != -1){
//                //将字符数组转成字符串
//                String str = new String(chars, 0, len);
//                System.out.println(str);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            if (fileReader != null){
//                try {
//                    fileReader.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }

    //BufferedReader
    BufferedReader bufferedReader = null;
    try {
        bufferedReader = new BufferedReader(new FileReader("E:\\test\\java.txt"));
        //按行读数据
        String line;
        while ((line=bufferedReader.readLine()) != null){
            System.out.println(line);
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (bufferedReader != null){
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2.字符输出流

Writer:FileWriter、BufferedWriter

public static void WriterTest(){
    //FileWriter
//        FileWriter fileWriter = null;
//        String str = "java真好";
//        try {
//            fileWriter = new FileWriter("E:\\test\\java.txt", true);
//            //写文件
//            fileWriter.write(str);
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            if (fileWriter != null){
//                try {
//                    fileWriter.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }

    //BufferedWriter
    BufferedReader bufferedReader = null;
    BufferedWriter bufferedWriter = null;
    try {
        bufferedReader = new BufferedReader(new FileReader("E:\\test\\java.txt"));
        bufferedWriter = new BufferedWriter(new FileWriter("myCharStream\\java.txt"));

        //复制文件
        String line;
        while ((line=bufferedReader.readLine()) != null){
            bufferedWriter.write(line);
            //readLine不读换行符,因此要手动换行
            bufferedWriter.newLine();
            bufferedWriter.flush();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (bufferedReader != null){
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (bufferedWriter != null){
            try {
                bufferedWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

练习

集合到文件:
把ArrayList集合中的字符串数据写入到文本文件(每一个字符串元素作为文件中的一行数据)

public static void charStreamTest(){
//        BufferedWriter bufferedWriter = null;
//
//        //创建集合
//        ArrayList<String> list = new ArrayList<>();
//
//        //存数据
//        list.add("hello");
//        list.add("world");
//        list.add("java");
//        list.add("python");
//
//        //创建字符缓冲流对象
//        try {
//            bufferedWriter = new BufferedWriter(new FileWriter("E:\\test\\java.txt"));
//
//            //遍历集合
//            for (String str : list) {
//                //写数据
//                bufferedWriter.write(str);
//                bufferedWriter.newLine();
//                bufferedWriter.flush();
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            if (bufferedWriter != null){
//                try {
//                    bufferedWriter.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }

   //升级款,格式:学号,姓名,年龄,居住地
    //举例: 1,张三,30,广州
    BufferedWriter bufferedWriter = null;
    ArrayList<Student> list = new ArrayList<>();

    Student stu01 = new Student(001, "张三", 18, "广州南");
    Student stu02 = new Student(002, "李四", 28, "广州东");
    Student stu03 = new Student(003, "王五", 38, "广州北");

    list.add(stu01);
    list.add(stu02);
    list.add(stu03);

    //创建字符缓冲流对象
    try {
        bufferedWriter = new BufferedWriter(new FileWriter("E:\\test\\java.txt"));

        //遍历集合
        for (Student student : list) {
            //规定写入格式
            StringBuffer sb = new StringBuffer();
            sb.append(student.getStu_id()).append(",").append(student.getName()).append(",")
                    .append(student.getAge()).append(",").append(student.getAddress());
            bufferedWriter.write(sb.toString());
            bufferedWriter.newLine();
            bufferedWriter.flush();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (bufferedWriter != null){
            try {
                bufferedWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

文件到集合:
把文本文件中的数据读取到集合中,并遍历集合(文件中每一行数据是一个集合元素)

public static void charStreamTest2(){
//        BufferedReader bufferedReader = null;
//        ArrayList<String> list = new ArrayList<>();
//
//        try {
//            bufferedReader = new BufferedReader(new FileReader("E:\\test\\java.txt"));
//
//            String line;
//            while ((line=bufferedReader.readLine()) != null){
//                list.add(line);
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            if (bufferedReader != null){
//                try {
//                    bufferedReader.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//        //遍历集合
//        for (String str : list) {
//            System.out.println(str);
//        }

    //升级款,按格式切分文件中的数据并读入集合中
    //举例: itheima001,林青霞,30,西安
    BufferedReader bufferedReader = null;
    ArrayList<Student> list = new ArrayList<>();

    try {
        bufferedReader = new BufferedReader(new FileReader("E:\\test\\java.txt"));

        String line;
        while ((line=bufferedReader.readLine()) != null){
            //分割字符串
            String[] str = line.split(",");
            //赋值
            Student student = new Student();
            student.setStu_id(Integer.parseInt(str[0]));
            student.setName(str[1]);
            student.setAge(Integer.parseInt(str[2]));
            student.setAddress(str[3]);

            list.add(student);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (bufferedReader != null){
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //遍历集合
    for (Student str : list) {
        System.out.println(str.getStu_id()+","+str.getName()+","+str.getAge()+","+str.getAddress());
    }
}

点名器
有一个文件里面存储了班级同学的姓名,每一个姓名占一行,要求通过程序实现随机点名器

public static void charStreamTest3(){
    BufferedReader bufferedReader = null;
    ArrayList<String> list = new ArrayList<>();

    try {
        bufferedReader = new BufferedReader(new FileReader("E:\\test\\java.txt"));

        String line;
        while ((line=bufferedReader.readLine()) != null){
            list.add(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (bufferedReader != null){
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //取随机数
    Random random = new Random();
    int index = random.nextInt(list.size());

    //根据随机数索引去list中取值
    String name = list.get(index);
    System.out.println("幸运者是:" + name);
}

标准输入输出流

1.标准输入流

读取来自【键盘的输入】或【指定源的输入】
(是Scanner的底层)

BufferedReader bufferedReader2 = new BufferedReader(new InputStreamReader(System.in));
//实现输入字符串
System.out.println("请输入内容");
String strLine = bufferedReader2.readLine();
System.out.println("您输入的内容为:" + strLine);
//实现输入整数类型
System.out.println("请输入整数");
int i = Integer.parseInt(strLine);
System.out.println("您输入的内容为:" + i);

2.标准输出流

显示输出
(是System.out,println的底层)

PrintStream ps =  System.out;
ps.println("hh");
ps.print(100);

System.out.println("hh");
System.out.println(100);

3.字节打印流

PrintStream

PrintStream ps = new PrintStream("E:\\test\\java.txt");
ps.println(97);

4.字符打印流

PrintWriter

PrintWriter pw = new PrintWriter(new FileWriter("myPrintWriter\\java.txt"), true);
pw.writer("hello");
pw.writer("\r\n");
pw.flush();
//相当于
pw.println("hello");

pw.close();

练习

BufferedReader bufferedReader = null;
PrintWriter printWriter = null;

try {
    bufferedReader = new BufferedReader(new FileReader("myStream\\java.txt"));
    printWriter = new PrintWriter(new FileWriter("myStream\\copy.txt"));

    String strLint;
    while ((strLint=bufferedReader.readLine()) != null){
        printWriter.println(strLint);
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (bufferedReader != null){
        try {
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    if (printWriter != null){
        try {
            printWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5.对象序列化流

对象序列化:将对象保存在磁盘或网络传输对象中
对象序列化流:ObjectOutputStream,对象反序列化流:ObjectInputStream

6.Properties

Properties作为集合使用(Map)

Properties prop = new Properties( );

prop.put("001", "张三");
prop.put("002", "李四");
prop.put("003", "王五");
//遍历集合
Set<Object> keySet = prop.keySet();
for (object key : keySet) {
	Object value = prop.get( key );
	system.out.print1n(key + "," + value);
}
//Properties作为集合使用所特有的方法
prop.setProperty("004","赵六");		//setProperties()底层是调用Hashtable的put()
System.out.println(prop.getProperty("002"));		//根据键取值
Set<String> names = prop.stringProprtyNames();		//获取键的集合
for(String key:names){
	String value = prop.getProperty(key);
	System.out.println(key + "," + "value");
}

Properties与IO流结合使用

//从文件中读集合内容
    private static void PropertyIO_Load() {
        FileReader fileReader = null;
        Properties properties = new Properties();

        try {
            fileReader = new FileReader("myStream\\java.txt");

            properties.load(fileReader);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileReader != null){
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //把集合的内容写入文件
    private static void PropertyIO_Store() {
        FileWriter fileWriter = null;
        Properties properties = new Properties();

        properties.setProperty("001", "张三");
        properties.setProperty("002", "李四");
        properties.setProperty("003", "王五");

        try {
            fileWriter = new FileWriter("myStream\\java.txt");

            //store():将属性列表(键值对)写入Properties表中;load():从字节/字符流读取属性列表
            //store(param1, param2),param1:输出流对象,param2:对输出流对象的说明
            properties.store(fileWriter, null);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileWriter != null){
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

练习:游戏次数

//GuessNumber类
public class GuessNumber {
    public GuessNumber() {}

    public static void start() {
        Random r = new Random( ) ;
        int number = r.nextInt(100)+1;

        while (true){
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入你要猜的数字:");
            int guessNumber = scanner.nextInt( );

            if (guessNumber > number){
                System.out.println("你猜的数字"+ guessNumber +"大了");
            } else if (guessNumber < number) {
                System.out.println("你猜的数字" + guessNumber +"小了");
            } else {
                System.out.println("恭喜你猜中了");
                break;
            }
        }
    }
}
//game.txt文件
count=0;
//Game_Test测试类
private static void Game_Test() {
        FileReader fileReader = null;
        FileWriter fileWriter = null;
        Properties properties = new Properties();

        try {
            //读取记录次数的文件
            fileReader = new FileReader("myStream\\game.txt");
            properties.load(fileReader);

            //获取游戏次数
            String count = properties.getProperty("count");
            int number = Integer.parseInt(count);

            //判断次数
            if (number >= 3){
                System.out.println("游戏试玩已结束");
            } else {
                //玩游戏
                GuessNumber.start();

                number++;
                //更新次数
                properties.setProperty("count", String.valueOf(number));
                //将次数写回记录次数的文件
                fileWriter = new FileWriter("myStream\\game.txt");
                properties.store(fileWriter, null);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileReader != null){
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileWriter != null){
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

线程

1.线程简介

进程:可以理解为一个程序(进程是静态的)
线程:可以理解为程序的各个方法(线程是动态的,是CPU调度和执行的基本单位,一个进程中可以由很多个线程)

2.多线程的创建方法

方式一:继承Thread类
由于Java仅支持单继承,故不推荐使用

// 1.继承Thread类
public class Thread_Test extends Thread{
	// 2.重写run()方法
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 10; i++) {
            System.out.println("我在学代码" + i);
        }
    }

    //main线程(主线程)
    public static void main(String[] args) {
        //开启多线程
        Thread_Test threadTest = new Thread_Test();
		// 3.调用start()方法开启线程(主线程与其它线程会同时运行)
        threadTest.start();

        //主线程
        for (int i = 0; i < 1000; i++) {
            System.out.println("我在学多线程" + i);
        }
    }
}

在这里插入图片描述
在这里插入图片描述

方式二:实现Runnable接口(推荐)
因为java是单继承机制,故使用Runnable更好

// 1.实现Runnable接口
public class Runnable_Test implements Runnable{
    // 2.重写run()
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 10; i++) {
            System.out.println("我在学代码" + i);
        }
    }

    //main线程(主线程)
    public static void main(String[] args) {
        // 3.开启多线程
        // (1)创建runnbale接口的实现类对象
        Runnable_Test runnableTest = new Runnable_Test();
        // (2)创建线程对象,通过线程对象调用实现类对象,开启多线程
        /*Thread thread = new Thread(runnableTest);
        thread.start();     //等价于下面的写法*/
        new Thread(runnableTest).start();

        //主线程
        for (int i = 0; i < 1000; i++) {
            System.out.println("我在学多线程" + i);
        }
    }
}

//小练习:龟兔赛跑,谁先走100步谁赢
public class Race implements Runnable{
    //定义胜利者
    private static String winner;

    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            //兔子休息
            if (Thread.currentThread().getName().equals("兔子") && i%10==0){
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            //判断比赛是否结束
            boolean flag = gameOver(i);
            if (flag){
                break;
            }
            System.out.println(Thread.currentThread().getName() + "跑了" + i + "步");
        }
    }

    //判断是否结束比赛
    private boolean gameOver(int step){
        //判断是否由胜利者
        if (winner != null){
            return true;
        }
        //代码块
        {
            if (step >= 100){
                winner = Thread.currentThread().getName();
                System.out.println("winner is:" + winner);
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        Race race = new Race();

        new Thread(race, "兔子").start();
        new Thread(race, "乌龟").start();
    }
}

3.实现Callable接口
好处:1.可以定义返回值;2.可以抛出异常

3.线程安全问题

线程不同步

public class Runnable_Test implements Runnable{
    //定义票数
    private int ticketNum = 10;

    @Override
    public void run() {
        while (true){
            if (ticketNum <= 0)
                break;
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNum-- + "张票");
        }
    }

    public static void main(String[] args) {
        Runnable_Test ticket = new Runnable_Test();

        new Thread(ticket, "张三").start();
        new Thread(ticket, "李四").start();
        new Thread(ticket, "王五").start();
    }
}

在这里插入图片描述

4.静态代理模式

真实对象和代理对象要实现同一个接口,代理对象代理真实对象
思想:代理对象替真实对象完成一系列操作,而真实对象专注实现自己的操作即可

public class StaticProxy {
    public static void main(String[] args) {
        Who who = new Who();
        new WeddingCompany(who).getMarry();
    }
}
interface Marry{
    void getMarry();
}
//真实对象
class Who implements Marry{
    @Override
    public void getMarry() { System.out.println("张三要跟李四结婚了"); }
}
//代理对象
class WeddingCompany implements Marry{
    //代理对象要代理的真实对象
    private Marry target;

    public WeddingCompany(Marry target) { this.target = target; }

    @Override
    public void getMarry() {
        marryBefore();
        this.target.getMarry();
        marryAfter();
    }

    private void marryBefore() { System.out.println("订酒店,摆宴席"); }

    private void marryAfter() { System.out.println("数礼金"); }
}

5.Lambda表达式

作用:1.避免匿名内部类使用过多,2.让代码更简洁
只适用于函数式接口
函数式接口:一个接口中只有一个抽象方法(可以用Lambda表达式来创建该类接口的对象)

public class Lambda_Test {
    //局部内部类
    static class FITtest implements FunctionItf{
        @Override
        public void lambda(int test) {
            System.out.println("局部内部类:lambda->>>" + test);
        }
    }

    public static void main(String[] args) {
        //调用局部内部类输出
        FITtest fiTtest = new FITtest();
        fiTtest.lambda(1);

        //匿名内部类
        FunctionItf functionItf = new FunctionItf() {
            @Override
            public void lambda(int test) {
                System.out.println("匿名内部类:lambda->>>" + test);
            }
        };
        functionItf.lambda(2);          //调用匿名内部类输出

        //Lambda表达式
        FunctionItf functionItf_lambda = (int test)->{
            System.out.println("lambda表达式:lambda->>>" + test);
        };
        functionItf_lambda.lambda(3);   //使用Lambda表达式输出

        //简化版的Lambda表达式
        functionItf_lambda = (test)->{
            System.out.println("简化的lambda表达式(去掉了类型):lambda->>>" + test);
        };
        functionItf_lambda.lambda(4);   //使用简化的Lambda表达式输出

        //二次简化的Lambda表达式
        functionItf_lambda = test->{
            System.out.println("二次简化的lambda表达式(去掉了类型和(),有多个参数时得加括号):lambda->>>" + test);
        };
        functionItf_lambda.lambda(5);   //使用二次简化的Lambda表达式输出

        //三次简化的Lambda表达式
        functionItf_lambda = test->System.out.println("三次简化的lambda表达式(去掉了类型、()、{},使用于单行操作的):lambda->>>" + test);
        functionItf_lambda.lambda(6);   //使用三次简化的Lambda表达式输出

        //四次简化的Lambda表达式
        functionItf_lambda.lambda(7);   //使用四次简化的Lambda表达式输出

    }
}

// 定义一个函数式接口
interface FunctionItf{
    void lambda(int test);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值