guyanqing 1 year ago
parent
commit
d64355cff6

+ 6 - 0
.idea/encodings.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/game.dat" charset="UTF-16" />
+  </component>
+</project>

+ 2 - 0
src/main/java/com/sf/day16/homework/Student2.java

@@ -1,5 +1,7 @@
 package com.sf.day16.homework;
 
+import org.junit.Test;
+
 import java.util.Comparator;
 import java.util.Set;
 import java.util.TreeSet;

+ 21 - 0
src/main/java/com/sf/day17/Test01.java

@@ -0,0 +1,21 @@
+package com.sf.day17;
+
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Test01 {
+    @Test
+    public void t1(){
+        Map<String, String> map = new HashMap<String, String>();
+        map.put("username","zhangsan");
+        map.put("username1","zhangsan");
+        map.put("username2","zhangsan");
+        map.put("username3","zhangsan");
+        for (Map.Entry<String, String> entry : map.entrySet()) {
+            System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
+        }
+
+    }
+}

+ 0 - 346
src/main/java/com/sf/ioioioioi/test01.java

@@ -1,346 +0,0 @@
-package com.sf.ioioioioi;
-
-import org.junit.Test;
-
-import java.io.*;
-import java.util.Arrays;
-import java.util.Date;
-
-public class test01 {
-    public static void main(String[] args) {
-        String pathname = "c:\\aaa.txt";
-        File file = new File(pathname);
-
-        // 文件路径名
-        String pathname2 = "D:\\aaa\\bbb.txt";
-        File file2 = new File(pathname2);
-
-        // 通过父路径和子路径字符串
-        String parent = "d:\\aaa";
-        String child = "bbb.txt";
-        File file3 = new File(parent, child);
-
-        // 通过父级File对象和子路径字符串
-        File parentDir = new File("d:\\aaa");
-        String childFile = "bbb.txt";
-        File file4 = new File(parentDir, childFile);
-    }
-
-    @Test
-    public void t2(){
-        File f1 = new File("d:\\a.txt");
-        System.out.println("文件/目录的名称:" + f1.getName());
-        System.out.println("文件/目录的构造路径名:" + f1.getPath());
-        System.out.println("文件/目录的绝对路径名:" + f1.getAbsolutePath());
-        System.out.println("文件/目录的父目录名:" + f1.getParent());
-    }
-
-    @Test
-    public void t3(){
-        File f3 = new File("a.txt");
-        System.out.println("user.dir =" + System.getProperty("user.dir"));
-        System.out.println("文件/目录的名称:" + f3.getName());
-        System.out.println("文件/目录的构造路径名:" + f3.getPath());
-        System.out.println("文件/目录的绝对路径名:" + f3.getAbsolutePath());
-        System.out.println("文件/目录的父目录名:" + f3.getParent());
-    }
-
-    @Test
-    public void t4(){
-        File f = new File("d:/aaa/bbb.txt");
-        System.out.println("文件构造路径:"+f.getPath());
-        System.out.println("文件名称:"+f.getName());
-        System.out.println("文件长度:"+f.length()+"字节");
-        System.out.println("文件最后修改时间:" + f.lastModified());
-
-        File f2 = new File("d:/aaa");
-        System.out.println("目录构造路径:"+f2.getPath());
-        System.out.println("目录名称:"+f2.getName());
-        System.out.println("目录长度:"+f2.length()+"字节");
-        System.out.println("文件最后修改时间:" + new Date(f.lastModified()));
-    }
-
-    @Test
-    public void t5(){
-        File dir = new File("d:/ruanjian");
-        String[] subs = dir.list();
-        System.out.println(Arrays.toString(subs));
-        for (String sub : subs) {
-            System.out.println(sub);
-        }
-    }
-
-    @Test
-    public void t6(){
-        File file1 = new File("d:/a.txt");
-        File file2 = new File("d:/b.txt");
-        System.out.println(file1.getName());
-        boolean b = file1.renameTo(file2);
-        System.out.println(b);
-    }
-
-    @Test
-    public void t7(){
-        File f = new File("d:\\a.txt");
-        File f2 = new File("d:\\tmp");
-        // 判断是否存在
-        System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists());
-        System.out.println("d:\\aaa 是否存在:"+f2.exists());
-        // 判断是文件还是目录
-        System.out.println("d:\\aaa 文件?:"+f2.isFile());
-        System.out.println("d:\\aaa 目录?:"+f2.isDirectory());
-    }
-
-    @Test
-    public void t8() throws IOException {
-        // 文件的创建
-        File f = new File("aaa.txt");
-        System.out.println("aaa.txt是否存在:"+f.exists());
-        System.out.println("aaa.txt是否创建:"+f.createNewFile());
-        System.out.println("aaa.txt是否存在:"+f.exists());
-
-        // 目录的创建
-        File f2= new File("newDir");
-        System.out.println("newDir是否存在:"+f2.exists());
-        System.out.println("newDir是否创建:"+f2.mkdir());
-        System.out.println("newDir是否存在:"+f2.exists());
-
-        // 创建一级目录
-        File f3= new File("newDira\\newDirb");
-        System.out.println("newDira\\newDirb创建:" + f3.mkdir());
-        File f4= new File("newDir\\newDirb");
-        System.out.println("newDir\\newDirb创建:" + f4.mkdir());
-        // 创建多级目录
-        File f5= new File("newDira\\newDirb");
-        System.out.println("newDira\\newDirb创建:" + f5.mkdirs());
-
-        // 文件的删除
-        System.out.println("aaa.txt删除:" + f.delete());
-
-        // 目录的删除
-        System.out.println("newDir删除:" + f2.delete());
-        System.out.println("newDir\\newDirb删除:" + f4.delete());
-    }
-
-    @Test
-    public void t9() throws IOException {
-        //利用File构造器,new一个文件目录file
-        // 在其中创建 当前日期目录 之后创建helloworld.java文件
-        //编写方法,实现删除file中指定文件的操作
-        File file = new File("D:\\file");
-        boolean mkdirs = file.mkdirs();
-        if (mkdirs) {
-            File file1 = new File("D:\\file\\a.java");
-            file1.createNewFile();
-        }
-    }
-
-    /**
-     * 判断指定目录下是否有后缀名为.jpg的文件。如果有,就输出该文件名称
-     */
-    @Test
-    public void t10(){
-        File srcFile = new File("d:\\demo");
-        String[] fileNames = srcFile.list();
-        for(String fileName : fileNames){
-            if(fileName.endsWith(".jpg")){
-                System.out.println(fileName);
-            }
-        }
-    }
-
-    /**
-     * 方法二
-     * 判断指定目录下是否有后缀名为.jpg的文件。如果有,就输出该文件名称
-     */
-    @Test
-    public void t11(){
-        File srcFile = new File("d:\\demo");
-        File[] listFiles = srcFile.listFiles();
-        for(File file : listFiles){
-            if(file.getName().endsWith(".jpg")){
-                System.out.println(file.getAbsolutePath());
-            }
-        }
-    }
-
-    /**
-     *判断指定目录下是否有后缀名为.jpg的文件。如果有,就输出该文件名称
-     * * File类提供了两个文件过滤器方法
-     * 	 * public String[] list(FilenameFilter filter)
-     * 	 * public File[] listFiles(FileFilter filter)
-     */
-    @Test
-    public void t12(){
-        File file = new File("d:\\demo");
-        File[] files = file.listFiles(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return name.endsWith(".jsp");
-            }
-        });
-        for (File file1 : files) {
-            System.out.println(file1.getAbsolutePath());
-        }
-    }
-
-    /**
-     * 练习3:遍历指定目录所有文件名称,包括子文件目录中的文件。
-     *  拓展1:并计算指定目录占用空间的大小
-     *  拓展2:删除指定文件目录及其下的所有文件
-     */
-    @Test
-    public void t13(){
-        /**
-         * 代码在另外一个类(ListFilesTest)中的主函数中
-         */
-    }
-
-    /**
-     * 读取hello.txt文件中的字符数据,并显示在控制台上
-     */
-    @Test
-    public void t14() throws IOException {
-        // 1、创建file类的对象  对应着物理磁盘上的某个文件
-        File file = new File("d:\\a.txt");
-        //2 、创建fileReader对象  将file类的对象作为参数传递到fileRead的构造器中
-        FileReader fr = new FileReader(file);
-        //3、通过相关流的方法  读取文件中的数据
-        int data;
-        while ((data = fr.read()) !=-1){
-            System.out.println((char) data);
-        }
-        //4、关闭相关的流资源  避免出现内存泄露
-        fr.close();
-    }
-
-
-    /**
-     * 实现方法3  调用read(char[] cbuf),每次从文件中读取多个字符     FileReader --read()
-     * @throws IOException
-     */
-    @Test
-    public void t15() throws IOException {
-        FileReader fr = null;
-        try {
-            //1. 创建File类的对象,对应着物理磁盘上的某个文件
-            File file = new File("d:\\a.txt");
-            //2. 创建FileReader流对象,将File类的对象作为参数传递到FileReader的构造器中
-            fr = new FileReader(file);
-            //3. 通过相关流的方法,读取文件中的数据
-            char[] cbuf = new char[5];
-            /*
-             * read(char[] cbuf) : 每次将文件中的数据读入到cbuf数组中,并返回读入到数组中的
-             * 字符的个数。
-             * */
-            int len; //记录每次读入的字符的个数
-            while ((len = fr.read(cbuf)) != -1) {
-                //处理char[]数组即可
-                //正确:
-                String str = new String(cbuf, 0, len);
-                System.out.print(str);
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            //4. 关闭相关的流资源,避免出现内存泄漏
-            if (fr != null)
-                fr.close();
-        }
-    }
-
-    @Test
-    public void t16() throws IOException {
-        // 使用文件名称创建流对象
-        FileWriter fw = new FileWriter(new File("d:\\fw.txt"));
-        // 写出数据
-        fw.write(97); // 写出第1个字符
-        fw.write('b'); // 写出第2个字符
-        fw.write('C'); // 写出第3个字符
-        fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。
-        //关闭资源
-        fw.close();
-    }
-
-    @Test
-    public void t17() throws IOException {
-        // 使用文件名称创建流对象
-        FileWriter fw = new FileWriter(new File("fw.txt"));
-        // 字符串转换为字节数组
-        char[] chars = "爱扣钉".toCharArray();
-        // 写出字符数组
-        fw.write(chars); // 爱扣钉
-        // 写出从索引1开始,2个字符。
-        fw.write(chars,1,2); // 钉钉
-        // 关闭资源
-        fw.close();
-    }
-
-    @Test
-    public void t18() throws IOException {
-        FileWriter fw = null;
-        try {
-            //1. 创建File的对象
-            File file = new File("personinfo.txt");
-            //2. 创建FileWriter的对象,将File对象作为参数传递到FileWriter的构造器中
-            //如果输出的文件已存在,则会对现有的文件进行覆盖
-            fw = new FileWriter(file);
-//            fw = new FileWriter(file,false);
-            //如果输出的文件已存在,则会在现有的文件末尾写入数据
-//            fw = new FileWriter(file,true);
-
-            //3. 调用相关的方法,实现数据的写出操作
-            //write(String str) / write(char[] cbuf)
-            fw.write("hello world");
-            fw.write("world".toCharArray());
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            //4. 关闭资源,避免内存泄漏
-            try {
-                if (fw != null)
-                    fw.close();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-
-    @Test
-    public void t19() throws IOException {
-//复制文件  b.txt  到 upload下
-        FileReader fr = new FileReader("d:\\a.txt");
-        FileWriter fw = new FileWriter("d:\\b.txt",true);
-        //数组
-        char[] chars = new char[1024*8];
-
-        int len;
-        while (  (len=fr.read(chars)) != -1 ){
-            fw.write(chars,0,len);
-        }
-
-        //关闭
-        fw.close();
-        fr.close();
-    }
-
-    @Test
-    public void t20() throws IOException {
-        // 使用文件名称创建流对象
-        FileWriter fw = new FileWriter("fw.txt");
-        // 写出数据,通过flush
-        fw.write('刷'); // 写出第1个字符
-        fw.flush();
-        fw.write('新'); // 继续写出第2个字符,写出成功
-        fw.flush();
-
-        // 写出数据,通过close
-        fw.write('关'); // 写出第1个字符
-        fw.close();
-        fw.write('闭'); // 继续写出第2个字符,【报错】java.io.IOException: Stream closed
-        fw.close();
-    }
-}
-
-
-

+ 59 - 0
src/main/java/com/sf/iotest/Employee.java

@@ -0,0 +1,59 @@
+package com.sf.iotest;
+
+import java.io.Serializable;
+
+public class Employee implements Serializable {
+    //static final long serialVersionUID = 23234234234L;
+    public static String company; //static修饰的类变量,不会被序列化
+    public String name;
+    public String address;
+    public transient int age; // transient瞬态修饰成员,不会被序列化
+
+    public Employee(String name, String address, int age) {
+        this.name = name;
+        this.address = address;
+        this.age = age;
+    }
+
+    public static String getCompany() {
+        return company;
+    }
+
+    public static void setCompany(String company) {
+        Employee.company = company;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public int getAge() {
+        return age;
+    }
+
+    public void setAge(int age) {
+        this.age = age;
+    }
+
+    @Override
+    public String toString() {
+        return "Employee{" +
+                "name='" + name + '\'' +
+                ", address='" + address + '\'' +
+                ", age=" + age +
+                ", company=" + company +
+                '}';
+    }
+}

+ 1 - 1
src/main/java/com/sf/ioioioioi/ListFilesTest.java → src/main/java/com/sf/iotest/ListFilesTest.java

@@ -1,4 +1,4 @@
-package com.sf.ioioioioi;
+package com.sf.iotest;
 
 import org.junit.Test;
 

+ 36 - 0
src/main/java/com/sf/iotest/ReadWriteCollection.java

@@ -0,0 +1,36 @@
+package com.sf.iotest;
+
+import org.junit.Test;
+
+import java.io.*;
+import java.util.ArrayList;
+
+public class ReadWriteCollection {
+    @Test
+    public void save() throws IOException {
+        ArrayList<Employee> list = new ArrayList<>();
+        list.add(new Employee("张三", "哈尔滨", 23));
+        list.add(new Employee("李四", "北京", 24));
+        list.add(new Employee("王五", "上海", 25));
+        // 创建序列化流对象
+        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("employees.dat"));
+        // 写出对象
+        oos.writeObject(list);
+        // 释放资源
+        oos.close();
+    }
+
+    @Test
+    public void reload() throws IOException, ClassNotFoundException {
+        // 创建反序列化流
+        FileInputStream fis = new FileInputStream("employees.dat");
+        ObjectInputStream ois = new ObjectInputStream(fis);
+        // 读取一个对象
+        ArrayList<Employee> list = (ArrayList<Employee>) ois.readObject();
+        // 释放资源
+        ois.close();
+        fis.close();
+
+        System.out.println(list);
+    }
+}

+ 33 - 0
src/main/java/com/sf/iotest/ReadWriteObject.java

@@ -0,0 +1,33 @@
+package com.sf.iotest;
+
+import org.junit.Test;
+
+import java.io.*;
+
+public class ReadWriteObject {
+    @Test
+    public void save() throws IOException {
+        Employee.setCompany("爱扣钉");
+        Employee e = new Employee("小明", "北京", 23);
+        // 创建序列化流对象
+        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("employee.dat"));
+        // 写出对象
+        oos.writeObject(e);
+        // 释放资源
+        oos.close();
+        // 姓名,地址被序列化,年龄没有被序列化。
+    }
+
+    @Test
+    public void reload() throws IOException, ClassNotFoundException {
+        // 创建反序列化流
+        FileInputStream fis = new FileInputStream("employee.dat");
+        ObjectInputStream ois = new ObjectInputStream(fis);
+        // 读取一个对象
+        Employee e = (Employee) ois.readObject();
+        // 释放资源
+        ois.close();
+        fis.close();
+        System.out.println(e);
+    }
+}

+ 1 - 1
src/main/java/com/sf/ioioioioi/TTT.java → src/main/java/com/sf/iotest/TTT.java

@@ -1,4 +1,4 @@
-package com.sf.ioioioioi;
+package com.sf.iotest;
 
 public class TTT {
     static int x,y,z;

+ 860 - 0
src/main/java/com/sf/iotest/test01.java

@@ -0,0 +1,860 @@
+package com.sf.iotest;
+
+import org.junit.Test;
+
+import java.io.*;
+import java.util.*;
+
+public class test01 {
+    public static void main(String[] args) {
+        String pathname = "c:\\aaa.txt";
+        File file = new File(pathname);
+
+        // 文件路径名
+        String pathname2 = "D:\\aaa\\bbb.txt";
+        File file2 = new File(pathname2);
+
+        // 通过父路径和子路径字符串
+        String parent = "d:\\aaa";
+        String child = "bbb.txt";
+        File file3 = new File(parent, child);
+
+        // 通过父级File对象和子路径字符串
+        File parentDir = new File("d:\\aaa");
+        String childFile = "bbb.txt";
+        File file4 = new File(parentDir, childFile);
+    }
+
+    @Test
+    public void t2(){
+        File f1 = new File("d:\\a.txt");
+        System.out.println("文件/目录的名称:" + f1.getName());
+        System.out.println("文件/目录的构造路径名:" + f1.getPath());
+        System.out.println("文件/目录的绝对路径名:" + f1.getAbsolutePath());
+        System.out.println("文件/目录的父目录名:" + f1.getParent());
+    }
+
+    @Test
+    public void t3(){
+        File f3 = new File("a.txt");
+        System.out.println("user.dir =" + System.getProperty("user.dir"));
+        System.out.println("文件/目录的名称:" + f3.getName());
+        System.out.println("文件/目录的构造路径名:" + f3.getPath());
+        System.out.println("文件/目录的绝对路径名:" + f3.getAbsolutePath());
+        System.out.println("文件/目录的父目录名:" + f3.getParent());
+    }
+
+    @Test
+    public void t4(){
+        File f = new File("d:/aaa/bbb.txt");
+        System.out.println("文件构造路径:"+f.getPath());
+        System.out.println("文件名称:"+f.getName());
+        System.out.println("文件长度:"+f.length()+"字节");
+        System.out.println("文件最后修改时间:" + f.lastModified());
+
+        File f2 = new File("d:/aaa");
+        System.out.println("目录构造路径:"+f2.getPath());
+        System.out.println("目录名称:"+f2.getName());
+        System.out.println("目录长度:"+f2.length()+"字节");
+        System.out.println("文件最后修改时间:" + new Date(f.lastModified()));
+    }
+
+    @Test
+    public void t5(){
+        File dir = new File("d:/ruanjian");
+        String[] subs = dir.list();
+        System.out.println(Arrays.toString(subs));
+        for (String sub : subs) {
+            System.out.println(sub);
+        }
+    }
+
+    @Test
+    public void t6(){
+        File file1 = new File("d:/a.txt");
+        File file2 = new File("d:/b.txt");
+        System.out.println(file1.getName());
+        boolean b = file1.renameTo(file2);
+        System.out.println(b);
+    }
+
+    @Test
+    public void t7(){
+        File f = new File("d:\\a.txt");
+        File f2 = new File("d:\\tmp");
+        // 判断是否存在
+        System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists());
+        System.out.println("d:\\aaa 是否存在:"+f2.exists());
+        // 判断是文件还是目录
+        System.out.println("d:\\aaa 文件?:"+f2.isFile());
+        System.out.println("d:\\aaa 目录?:"+f2.isDirectory());
+    }
+
+    @Test
+    public void t8() throws IOException {
+        // 文件的创建
+        File f = new File("aaa.txt");
+        System.out.println("aaa.txt是否存在:"+f.exists());
+        System.out.println("aaa.txt是否创建:"+f.createNewFile());
+        System.out.println("aaa.txt是否存在:"+f.exists());
+
+        // 目录的创建
+        File f2= new File("newDir");
+        System.out.println("newDir是否存在:"+f2.exists());
+        System.out.println("newDir是否创建:"+f2.mkdir());
+        System.out.println("newDir是否存在:"+f2.exists());
+
+        // 创建一级目录
+        File f3= new File("newDira\\newDirb");
+        System.out.println("newDira\\newDirb创建:" + f3.mkdir());
+        File f4= new File("newDir\\newDirb");
+        System.out.println("newDir\\newDirb创建:" + f4.mkdir());
+        // 创建多级目录
+        File f5= new File("newDira\\newDirb");
+        System.out.println("newDira\\newDirb创建:" + f5.mkdirs());
+
+        // 文件的删除
+        System.out.println("aaa.txt删除:" + f.delete());
+
+        // 目录的删除
+        System.out.println("newDir删除:" + f2.delete());
+        System.out.println("newDir\\newDirb删除:" + f4.delete());
+    }
+
+    @Test
+    public void t9() throws IOException {
+        //利用File构造器,new一个文件目录file
+        // 在其中创建 当前日期目录 之后创建helloworld.java文件
+        //编写方法,实现删除file中指定文件的操作
+        File file = new File("D:\\file");
+        boolean mkdirs = file.mkdirs();
+        if (mkdirs) {
+            File file1 = new File("D:\\file\\a.java");
+            file1.createNewFile();
+        }
+    }
+
+    /**
+     * 判断指定目录下是否有后缀名为.jpg的文件。如果有,就输出该文件名称
+     */
+    @Test
+    public void t10(){
+        File srcFile = new File("d:\\demo");
+        String[] fileNames = srcFile.list();
+        for(String fileName : fileNames){
+            if(fileName.endsWith(".jpg")){
+                System.out.println(fileName);
+            }
+        }
+    }
+
+    /**
+     * 方法二
+     * 判断指定目录下是否有后缀名为.jpg的文件。如果有,就输出该文件名称
+     */
+    @Test
+    public void t11(){
+        File srcFile = new File("d:\\demo");
+        File[] listFiles = srcFile.listFiles();
+        for(File file : listFiles){
+            if(file.getName().endsWith(".jpg")){
+                System.out.println(file.getAbsolutePath());
+            }
+        }
+    }
+
+    /**
+     *判断指定目录下是否有后缀名为.jpg的文件。如果有,就输出该文件名称
+     * * File类提供了两个文件过滤器方法
+     * 	 * public String[] list(FilenameFilter filter)
+     * 	 * public File[] listFiles(FileFilter filter)
+     */
+    @Test
+    public void t12(){
+        File file = new File("d:\\demo");
+        File[] files = file.listFiles(new FilenameFilter() {
+            @Override
+            public boolean accept(File dir, String name) {
+                return name.endsWith(".jsp");
+            }
+        });
+        for (File file1 : files) {
+            System.out.println(file1.getAbsolutePath());
+        }
+    }
+
+    /**
+     * 练习3:遍历指定目录所有文件名称,包括子文件目录中的文件。
+     *  拓展1:并计算指定目录占用空间的大小
+     *  拓展2:删除指定文件目录及其下的所有文件
+     */
+    @Test
+    public void t13(){
+        /**
+         * 代码在另外一个类(ListFilesTest)中的主函数中
+         */
+    }
+
+    /**
+     * 读取hello.txt文件中的字符数据,并显示在控制台上
+     */
+    @Test
+    public void t14() throws IOException {
+        // 1、创建file类的对象  对应着物理磁盘上的某个文件
+        File file = new File("d:\\a.txt");
+        //2 、创建fileReader对象  将file类的对象作为参数传递到fileRead的构造器中
+        FileReader fr = new FileReader(file);
+        //3、通过相关流的方法  读取文件中的数据
+        int data;
+        while ((data = fr.read()) !=-1){
+            System.out.println((char) data);
+        }
+        //4、关闭相关的流资源  避免出现内存泄露
+        fr.close();
+    }
+
+
+    /**
+     * 实现方法3  调用read(char[] cbuf),每次从文件中读取多个字符     FileReader --read()
+     * @throws IOException
+     */
+    @Test
+    public void t15() throws IOException {
+        FileReader fr = null;
+        try {
+            //1. 创建File类的对象,对应着物理磁盘上的某个文件
+            File file = new File("d:\\a.txt");
+            //2. 创建FileReader流对象,将File类的对象作为参数传递到FileReader的构造器中
+            fr = new FileReader(file);
+            //3. 通过相关流的方法,读取文件中的数据
+            char[] cbuf = new char[5];
+            /*
+             * read(char[] cbuf) : 每次将文件中的数据读入到cbuf数组中,并返回读入到数组中的
+             * 字符的个数。
+             * */
+            int len; //记录每次读入的字符的个数
+            while ((len = fr.read(cbuf)) != -1) {
+                //处理char[]数组即可
+                //正确:
+                String str = new String(cbuf, 0, len);
+                System.out.print(str);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            //4. 关闭相关的流资源,避免出现内存泄漏
+            if (fr != null)
+                fr.close();
+        }
+    }
+
+    @Test
+    public void t16() throws IOException {
+        // 使用文件名称创建流对象
+        FileWriter fw = new FileWriter(new File("d:\\fw.txt"));
+        // 写出数据
+        fw.write(97); // 写出第1个字符
+        fw.write('b'); // 写出第2个字符
+        fw.write('C'); // 写出第3个字符
+        fw.write(30000); // 写出第4个字符,中文编码表中30000对应一个汉字。
+        //关闭资源
+        fw.close();
+    }
+
+    @Test
+    public void t17() throws IOException {
+        // 使用文件名称创建流对象
+        FileWriter fw = new FileWriter(new File("fw.txt"));
+        // 字符串转换为字节数组
+        char[] chars = "爱扣钉".toCharArray();
+        // 写出字符数组
+        fw.write(chars); // 爱扣钉
+        // 写出从索引1开始,2个字符。
+        fw.write(chars,1,2); // 钉钉
+        // 关闭资源
+        fw.close();
+    }
+
+    @Test
+    public void t18() throws IOException {
+        FileWriter fw = null;
+        try {
+            //1. 创建File的对象
+            File file = new File("personinfo.txt");
+            //2. 创建FileWriter的对象,将File对象作为参数传递到FileWriter的构造器中
+            //如果输出的文件已存在,则会对现有的文件进行覆盖
+            fw = new FileWriter(file);
+//            fw = new FileWriter(file,false);
+            //如果输出的文件已存在,则会在现有的文件末尾写入数据
+//            fw = new FileWriter(file,true);
+
+            //3. 调用相关的方法,实现数据的写出操作
+            //write(String str) / write(char[] cbuf)
+            fw.write("hello world");
+            fw.write("world".toCharArray());
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            //4. 关闭资源,避免内存泄漏
+            try {
+                if (fw != null)
+                    fw.close();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    @Test
+    public void t19() throws IOException {
+//复制文件  b.txt  到 upload下
+        FileReader fr = new FileReader("d:\\a.txt");
+        FileWriter fw = new FileWriter("d:\\b.txt",true);
+        //数组
+        char[] chars = new char[1024*8];
+
+        int len;
+        while (  (len=fr.read(chars)) != -1 ){
+            fw.write(chars,0,len);
+        }
+
+        //关闭
+        fw.close();
+        fr.close();
+    }
+
+    @Test
+    public void t20() throws IOException {
+        // 使用文件名称创建流对象
+        FileWriter fw = new FileWriter("fw.txt");
+        // 写出数据,通过flush
+        fw.write('刷'); // 写出第1个字符
+        fw.flush();
+        fw.write('新'); // 继续写出第2个字符,写出成功
+        fw.flush();
+
+        // 写出数据,通过close
+        fw.write('关'); // 写出第1个字符
+        fw.close();
+        fw.write('闭'); // 继续写出第2个字符,【报错】java.io.IOException: Stream closed
+        fw.close();
+    }
+
+    @Test
+    public void t21() throws IOException {
+        // 使用文件名称创建流对象
+        FileInputStream fis = new FileInputStream("D:\\a.txt");
+        // 读取数据,返回一个字节
+        int read = fis.read();
+        System.out.println((char) read);
+        read = fis.read();
+        System.out.println((char) read);
+        read = fis.read();
+        System.out.println((char) read);
+        read = fis.read();
+        System.out.println((char) read);
+        read = fis.read();
+        System.out.println((char) read);
+        read = fis.read();
+        System.out.println((char) read);
+        read = fis.read();
+        System.out.println((char) read);
+        read = fis.read();
+        System.out.println((char) read);
+        read = fis.read();
+        System.out.println((char) read);
+        read = fis.read();
+        System.out.println((char) read);
+        // 读取到末尾,返回-1
+        read = fis.read();
+        System.out.println(read);
+        // 关闭资源
+        fis.close();
+    }
+
+    @Test
+    public void t22() throws IOException {
+        // 使用文件名称创建流对象
+        FileInputStream fis = new FileInputStream("D:\\a.txt");
+        // 定义变量,保存数据
+        int b;
+        // 循环读取
+        while ((b = fis.read())!=-1) {
+            System.out.println((char)b);
+        }
+        // 关闭资源
+        fis.close();
+    }
+    @Test
+    public void t23()throws IOException{
+        // 使用文件名称创建流对象.
+        FileInputStream fis = new FileInputStream("D:\\a.txt"); // 文件中为abcde
+        // 定义变量,作为有效个数
+        int len;
+        // 定义字节数组,作为装字节数据的容器
+        byte[] b = new byte[2];
+        // 循环读取
+        while (( len= fis.read(b))!=-1) {
+            // 每次读取后,把数组变成字符串打印
+            System.out.println(new String(b));
+        }
+        // 关闭资源
+        fis.close();
+        /*
+        输出结果:
+        ab
+        cd
+        ed
+        最后错误数据`d`,是由于最后一次读取时,只读取一个字节`e`,数组中,
+        上次读取的数据没有被完全替换,所以要通过`len` ,获取有效的字节
+         */
+    }
+
+    @Test
+    public void t24()throws IOException{
+        // 使用文件名称创建流对象.
+        FileInputStream fis = new FileInputStream("D:\\a.txt"); // 文件中为abcde
+        // 定义变量,作为有效个数
+        int len;
+        // 定义字节数组,作为装字节数据的容器
+        byte[] b = new byte[2];
+        // 循环读取
+        while (( len= fis.read(b))!=-1) {
+            // 每次读取后,把数组的有效字节部分,变成字符串打印
+            System.out.println(new String(b,0,len));//  len 每次读取的有效字节个数
+        }
+        // 关闭资源
+        fis.close();
+        /*
+        输出结果:
+        ab
+        cd
+        e
+         */
+    }
+
+    @Test
+    public void t25() throws IOException {
+        // 使用文件名称创建流对象
+        FileOutputStream fos = new FileOutputStream("fos.txt");
+        // 写出数据
+        fos.write(97); // 写出第1个字节
+        fos.write(98); // 写出第2个字节
+        fos.write(99); // 写出第3个字节
+        // 关闭资源
+        fos.close();
+        /*  输出结果:abc*/
+    }
+
+    @Test
+    public void t26() throws IOException {
+        // 使用文件名称创建流对象
+        FileOutputStream fos = new FileOutputStream("fos.txt");
+        // 字符串转换为字节数组
+        byte[] b = "abcde".getBytes();
+        // 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。
+        fos.write(b,2,2);
+        // 关闭资源
+        fos.close();
+    }
+
+    @Test
+    public void t27() throws IOException{
+        // 使用文件名称创建流对象
+        FileOutputStream fos = new FileOutputStream("fos.txt",true);
+        // 字符串转换为字节数组
+        byte[] b = "abcde".getBytes();
+        fos.write(b);
+        // 关闭资源
+        fos.close();
+    }
+
+    //使用FileInputStream\FileOutputStream,实现对文件的复制
+    @Test
+    public void test28() {
+        FileInputStream fis = null;
+        FileOutputStream fos = null;
+        try {
+            //1. 造文件-造流
+            //复制图片:成功
+//            fis = new FileInputStream(new File("pony.jpg"));
+//            fos = new FileOutputStream(new File("pony_copy1.jpg"));
+
+            //复制文本文件:成功
+            fis = new FileInputStream(new File("D:\\a.txt"));
+            fos = new FileOutputStream(new File("D:\\hello1.txt"));
+
+            //2. 复制操作(读、写)
+            byte[] buffer = new byte[1024];
+            int len;//每次读入到buffer中字节的个数
+            while ((len = fis.read(buffer)) != -1) {
+                fos.write(buffer, 0, len);
+            }
+            System.out.println("复制成功");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            //3. 关闭资源
+            try {
+                if (fos != null)
+                    fos.close();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            try {
+                if (fis != null)
+                    fis.close();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+    }
+
+
+    //图片的复制
+    @Test
+    public void t29() throws Exception {
+        FileInputStream fis = new FileInputStream("C:\\Users\\Lenovo\\Desktop\\123.jpg");
+        FileOutputStream fos = new FileOutputStream("C:\\Users\\Lenovo\\Desktop\\3.jpg");
+        //数组 缓冲
+        byte[] bytes = new byte[8192];
+        int len;
+        //循环读取
+        while (  ( len = fis.read(bytes) ) != -1 ){
+            //输出
+            fos.write(bytes,0,len);
+        }
+
+        //关闭
+        fos.close();
+        fis.close();
+    }
+
+
+    @Test
+    public void t30() {
+        /*
+         * 图片的加密
+         * */
+            FileInputStream fis = null;
+            FileOutputStream fos = null;
+            try {
+                File file1 = new File("C:\\Users\\Lenovo\\Desktop\\123.jpg");
+                File file2 = new File("C:\\Users\\Lenovo\\Desktop\\3.jpg");
+                fis = new FileInputStream(file1);
+                fos = new FileOutputStream(file2);
+
+                //方式1:每次读入一个字节,效率低
+//            int data;
+//            while((data = fis.read()) != -1){
+//                fos.write(data ^ 5);
+//            }
+                //方式2:每次读入一个字节数组,效率高
+                int len;
+                byte[] buffer = new byte[1024];
+                while ((len = fis.read(buffer)) != -1) {
+
+                    for (int i = 0; i < len; i++) {
+                        buffer[i] = (byte) (buffer[i] ^ 5);
+                    }
+
+                    fos.write(buffer, 0, len);
+
+                }
+
+
+                System.out.println("加密成功");
+            } catch (IOException e) {
+                e.printStackTrace();
+            } finally {
+
+                try {
+                    fos.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+                try {
+                    fis.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+
+    /*
+     * 图片的解密
+     * */
+    @Test
+    public void t31(){
+        FileInputStream fis = null;
+        FileOutputStream fos = null;
+        try {
+            File file1 = new File("C:\\Users\\Lenovo\\Desktop\\3.jpg");
+            File file2 = new File("C:\\Users\\Lenovo\\Desktop\\12345.jpg");
+            fis = new FileInputStream(file1);
+            fos = new FileOutputStream(file2);
+
+            //方式1:每次读入一个字节,效率低
+//            int data;
+//            while((data = fis.read()) != -1){
+//                fos.write(data ^ 5);
+//            }
+            //方式2:每次读入一个字节数组,效率高
+            int len;
+            byte[] buffer = new byte[1024];
+            while((len = fis.read(buffer)) != -1){
+
+                for(int i = 0;i < len;i++){
+                    buffer[i] = (byte) (buffer[i] ^ 5);
+                }
+
+                fos.write(buffer,0,len);
+
+            }
+
+            System.out.println("解密成功");
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+
+            try {
+                fos.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            try {
+                fis.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 缓存流
+     */
+
+    public void copyFileWithFileStream(String srcPath,String destPath) throws IOException{
+        FileInputStream fis = null;
+        FileOutputStream fos = null;
+        try {
+            //1. 造文件-造流
+            fis = new FileInputStream(new File(srcPath));
+            fos = new FileOutputStream(new File(destPath));
+
+            //2. 复制操作(读、写)
+            byte[] buffer = new byte[100];
+            int len;//每次读入到buffer中字节的个数
+            while ((len = fis.read(buffer)) != -1) {
+                fos.write(buffer, 0, len);
+            }
+            System.out.println("复制成功");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            //3. 关闭资源
+            fos.close();
+            fis.close();
+        }
+    }
+
+    @Test
+    public void t32() throws IOException{
+        String srcPath = "D:\\ruanjian\\WeChat\\WeChat.exe";
+        String destPath = "D:\\ruanjian\\WeChat\\01_WeChat.exe";
+
+        long start = System.currentTimeMillis();
+
+        copyFileWithFileStream(srcPath,destPath);
+
+        long end = System.currentTimeMillis();
+
+        System.out.println("花费的时间为:" + (end - start));//46毫秒
+    }
+
+    //方法2:使用BufferedInputStream\BufferedOuputStream实现非文本文件的复制
+    public void copyFileWithBufferedStream(String srcPath,String destPath){
+        FileInputStream fis = null;
+        FileOutputStream fos = null;
+        BufferedInputStream bis = null;
+        BufferedOutputStream bos = null;
+        try {
+            //1. 造文件
+            File srcFile = new File(srcPath);
+            File destFile = new File(destPath);
+            //2. 造流
+            fis = new FileInputStream(srcFile);
+            fos = new FileOutputStream(destFile);
+
+            bis = new BufferedInputStream(fis);
+            bos = new BufferedOutputStream(fos);
+
+            //3. 读写操作
+            int len;
+            byte[] buffer = new byte[100];
+            while ((len = bis.read(buffer)) != -1) {
+                bos.write(buffer, 0, len);
+            }
+            System.out.println("复制成功");
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            //4. 关闭资源(如果有多个流,我们需要先关闭外面的流,再关闭内部的流)
+            try {
+                if (bos != null)
+                    bos.close();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            try {
+                if (bis != null)
+                    bis.close();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+
+        }
+    }
+    @Test
+    public void t33(){
+        String srcPath = "D:\\ruanjian\\WeChat\\WeChat.exe";
+        String destPath = "D:\\ruanjian\\WeChat\\01_WeChat.exe";
+
+        long start = System.currentTimeMillis();
+
+        copyFileWithBufferedStream(srcPath,destPath);
+
+        long end = System.currentTimeMillis();
+
+        System.out.println("花费的时间为:" + (end - start));//3毫秒
+    }
+
+
+    /**
+     * 字符缓冲流特有方法
+     */
+
+    @Test
+    public void t34() throws IOException{
+        // 创建流对象
+        BufferedReader br = new BufferedReader(new FileReader("out.txt"));
+        // 定义字符串,保存读取的一行文字
+        String line;
+        // 循环读取,读取到最后返回null
+        while ((line = br.readLine())!=null) {
+            System.out.println(line);
+        }
+        // 释放资源
+        br.close();
+    }
+
+    @Test
+    public void testNewLine() throws IOException{
+// 创建流对象
+        BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));
+        // 写出数据
+        bw.write("爱");
+        // 写出换行
+        bw.newLine();
+        bw.write("扣");
+        bw.newLine();
+        bw.write("钉");
+        bw.newLine();
+        // 释放资源
+        bw.close();
+    }
+
+
+    @Test
+    public void t35() throws IOException{
+        //字符
+        BufferedReader br = new BufferedReader(new FileReader("out.txt"));
+        BufferedWriter bw = new BufferedWriter(new FileWriter("out1.txt"));
+
+        //map集合
+        HashMap<String,Integer> map = new HashMap<>();
+
+        String s;
+        while ( (s =br.readLine()) != null ){
+            //获取 s的第一个字符
+            char name = s.charAt(0);
+
+            if (map.containsKey(name)){
+                Integer integer = map.get(name);
+                integer++;
+                //key Steing  value Integer
+                map.put(String.valueOf(name),integer);
+            }else{
+                map.put(String.valueOf(name),1);
+            }
+        }
+
+        //循环map 输出
+        Set<Map.Entry<String, Integer>> entries = map.entrySet();
+        //循环输出
+        for (Map.Entry<String, Integer> entry : entries) {
+            bw.write(entry.getKey()+":"+entry.getValue());
+            bw.newLine();
+        }
+
+        bw.close();
+        br.close();
+    }
+
+    /**
+     * 使用`FileReader` 读取项目中的文本文件。由于IDEA设置中针对项目设置了UTF-8编码,
+     * 当读取Windows系统中创建的文本文件时,如果Windows系统默认的是GBK编码,则读入内存中会出现乱码。
+     */
+    @Test
+    public void t36() throws IOException{
+        FileReader fileReader = new FileReader("D:\\File_GBK.txt");
+        int data;
+        while ((data = fileReader.read()) != -1) {
+            System.out.print((char)data);
+        }
+        fileReader.close();
+    }
+
+    /**
+     * 序列化和反序列化
+     */
+
+    @Test
+    public void save() throws IOException {
+        String name = "巫师";
+        int age = 300;
+        char gender = '男';
+        int energy = 5000;
+        double price = 75.5;
+        boolean relive = true;
+
+        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("game.dat"));
+        oos.writeUTF(name);
+        oos.writeInt(age);
+        oos.writeChar(gender);
+        oos.writeInt(energy);
+        oos.writeDouble(price);
+        oos.writeBoolean(relive);
+        oos.close();
+    }
+
+    @Test
+    public void reload()throws IOException{
+        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("game.dat"));
+        String name = ois.readUTF();
+        int age = ois.readInt();
+        char gender = ois.readChar();
+        int energy = ois.readInt();
+        double price = ois.readDouble();
+        boolean relive = ois.readBoolean();
+
+        System.out.println(name+"," + age + "," + gender + "," + energy + "," + price + "," + relive);
+
+        ois.close();
+    }
+}
+
+
+

BIN
target/classes/com/sf/day16/homework/Student2$1.class


BIN
target/classes/com/sf/day16/homework/Student2.class


BIN
target/classes/com/sf/day17/Test01.class


BIN
target/classes/com/sf/ioioioioi/Employee.class


BIN
target/classes/com/sf/ioioioioi/ReadWriteCollection.class


BIN
target/classes/com/sf/ioioioioi/ReadWriteObject.class


BIN
target/classes/com/sf/ioioioioi/test01$1.class


BIN
target/classes/com/sf/ioioioioi/test01.class