20200805_容器类HashMap(相当于python字典)以及IO流(读写操作)

1、作业题参考

一.新建一个类ArrayListDemo,使用今天上课讲解api完成下面需求。 

 1、定义老师类Teacher,私有属性:name,age,提供空参有参构造,提供get/set方法

 2、创建老师对象t1,name:张三,age:25 

 3、创建老师对象t2,name:李四,age:35 

 4、创建老师对象t3,name:老王,age:19 

 5、创建老师对象t4,name:赵六,age:29

 6、创建ArrayList集合对象存储t1,t2,t3,t4 

 7、通过普通for循环和增强for循环打印所有老师数据。打印出对应的name和age属性。 

 8、请求出集合中的老师平均年龄。 

import java.util.ArrayList;

public class ArrayListDemo {

    public static void main(String[] args) {
        //  2、创建老师对象t1,name:张三,age:25
        //    3、创建老师对象t2,name:李四,age:35
        //    4、创建老师对象t3,name:老王,age:19
        //    5、创建老师对象t3,name:赵六,age:29
        Teacher t1 = new Teacher("张三", 25);
        Teacher t2 = new Teacher("李四", 35);
        Teacher t3 = new Teacher("老王", 19);
        Teacher t4 = new Teacher("赵六", 29);
        //    6、创建ArrayList集合对象存储t1,t2,t3,t4
        ArrayList<Teacher> arraylist = new ArrayList<Teacher>();
        arraylist.add(t1);
        arraylist.add(t2);
        arraylist.add(t3);
        arraylist.add(t4);

        //通过普通for循环和增强for循环打印所有学生数据。打印出对应的name和age属性。
        System.out.println("9.通过普通for循环和增强for循环打印所有学生数据。打印出对应的name和age属性");
        for (int i = 0; i < arraylist.size(); i++) {
            System.out.println(arraylist.get(i).getName());
            System.out.println(arraylist.get(i).getAge());
        }
        for (Teacher teacher : arraylist) {
            System.out.println(teacher.getName());
            System.out.println(teacher.getAge());
        }

        //请求出集合中的老师平均年龄。
        //count存储老师数量
        int count = 0;
        //sum存储老师总成绩
        int sum = 0;
        for (Teacher teacher : arraylist) {
            sum += teacher.getAge();
            count++;
        }
        int result = sum / count;
        System.out.println("求出集合中的老师平均年龄:" + result);
    }

}

 二.新建一个类HashSetDemo,使用今天上课讲到的api完成下面的要求。 

 1、往这个HashSet对象里添加如下String类型的数据:“张三”,“李四”,“王五”,“张三”,”赵六” 

 2、判断这个集合是否为空,并打印判断的结果。 

 3、打印这个集合的大小。 

 4、判断这个集合是否包含数据"王五"。 

 5、将”张三”这条数据删掉。 

 6、利用迭代器迭代获取set集合中的每个元素,并打印。 

import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo {
    public static void main(String[] args) {
        HashSet<String> hashSet = new HashSet<String>();
        //1、往这个HashSet对象里添加如下String类型的数据:“张三”,“李四”,“王五”,“张三”,”赵六”
        hashSet.add("张三");
        hashSet.add("李四");
        hashSet.add("王五");
        hashSet.add("张三");
        hashSet.add("赵六");
        //2、判断这个集合是否为空,并打印判断的结果。
        System.out.println(hashSet.isEmpty());
        //3、打印这个集合的大小。
        System.out.println(hashSet.size());
        //4、判断这个集合是否包含数据"王五"。
        System.out.println(hashSet.contains("王五"));
        //5、将”张三”这条数据删掉。
        hashSet.remove("张三");
        //6、利用迭代器迭代获取set集合中的每个元素,并打印。
        Iterator<String> ite = hashSet.iterator();
        while (ite.hasNext()) {
            System.out.println(ite.next());
        }

    }
}

2、HashMap特点

  • 以键值对的形式来保存数据 ~~Json
  • 键名不可以重复,重复时,后者键值对覆盖前者 --HashSet
  • 键和值支持的数据类型-引用类型

3、HashMap常用Api

  • 添加数据-put(…)
  • 取值-get(…)
  • 移除-remove(…)
  • 获取所有的键名-keyset(…)
  • 获取所有的键值-values(…)
  • 获取集合大小-size()
  • 包含指定的键-containsKey(…)
  • 包含指定的值-containsValue(…)
import java.util.Collection;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

ublic class HashMapTest {
    public static void main(String[] args) {
        //1、创建hashMap对象 -- 指定键名数据类型 键值得数据类型
        HashMap<String,String> hashMap = new HashMap<String,String>();
        //2、添加数据 put
        hashMap.put("name","张三");
        hashMap.put("age","20");
        hashMap.put("address","长沙");
        hashMap.put("height","180");
        hashMap.put("age","25");
        //3、获取数据 get --根据键名获取键值
        //System.out.println(hashMap.get("name"));
        //System.out.println(hashMap.get("age"));
        //4、移除数据remove
        //hashMap.remove("height");
        //5、获取到集合得大小
        //System.out.println(hashMap.size());
        //6、获取到所有的键名 keySet()
        /*Set<String> allkeys = hashMap.keySet();
        for (String key : allkeys){
            System.out.println(key);
        }*/
        //7、获取所有的键值 values()
        //Collection<String> allValues = hashMap.values();
        /*for(String value : allValues){
            System.out.println(value);
        }*/

        //用自定义类型作为hashMap的键名存储类型
        /*HashMap<Teacher,String> hashMap1 = new HashMap<Teacher,String>();
        Teacher teacher = new Teacher("张三",20);
        hashMap1.put(teacher,"长沙");*/

        //8、包含指定的键名 containsKey
       //System.out.println( hashMap.containsKey("name"));
       //9、包含指定的键值 containsValue
        //System.out.println(hashMap.containsValue("180"));

        //10、对HashMap进行循环遍历 entrySet--获取到所有键值对的组合
        Set<Entry<String,String>> allKeyValues =  hashMap.entrySet();
        for (Entry<String,String> keyValue : allKeyValues){
            //键值对对应的键名
            System.out.println("键名:"+keyValue.getKey());
            System.out.println("键值:"+keyValue.getValue());
        }
    }
}

4、迭代HashMap

4.1迭代获取所有的键

Set<String> keySet = hashMap.keySet();
for(String key : keySet){
System.out.println(key);
}

4.2 迭代获取所有的值

Collection<String> values = hashMap.values();
for(String value : values){
  System.out.println(value);
}

4.3 迭代获取所有的键值对

Set<Entry<String,String>> entries = hashMap.entrySet();
for(Entry<String,String> entry : entries){
  System.out.println("键:"+entry.getKey()+",值:"+entry.getValue());
}

5、IO流是Java操作文件读写的技术

  • I:input(输入流,读取文件内容到流对象)
  • O:output(输出流,写文件内容到文件)按照流向划分:

输入流

  • InputStream
  • FileInputStream
  • FileReader

输出流

  • OutputStream
  • FileOutputStream
  • FileWriter

按照类型划分:

  • 字符流(只能读写纯文本文件)
  1. FileReader
  2. FileWriter
  • 字节流(读写任意文件) 字节的类型的数据 -- 比如说图片
  1. FileInputStream
  2. FileOutputStream

6、读写操作,以及复制操作示例代码

import java.io.*;
public class IOTest {
    public static void main(String[] args) throws Exception {
        //普通文本文件读写
        //readFile("C:\Users\Administrator\Desktop\test.txt");
        //writeFile("C:\Users\Administrator\Desktop\testWrite.txt");
        //图片/视频文件 -二进制文件 复制粘贴 先去读-》写到一个新的文件中
        copyFile("C:\Users\Administrator\Desktop\testInputStream.png"
                ,"C:\Users\Administrator\Desktop\testAfter.png");
    }

    public static void copyFile(String srcFilePath,String targetFilePath) throws IOException {

        File srcFile = new File(srcFilePath);
        File targetFile = new File(targetFilePath);
        //创建FileInputStream对象
        FileInputStream fileInputStream = new FileInputStream(srcFile);
        //创建FileOutputStream对象
        FileOutputStream fileOutputStream = new FileOutputStream(targetFile);
        //缓冲流-字节读取
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        //缓冲流-字节写入
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        while(true){
            //规定每一次读取的字节长度 1MB=1024KB=1024*1024字节
            byte[] arr = new byte[1024];
            //read返回值不是用来保存读取的结果,读取的状态 为-1 已经读到文件末尾
            int status = bufferedInputStream.read(arr);
            //写入
            bufferedOutputStream.write(arr);
            //没有意义
            /*for (byte data:arr){
                System.out.println(data);
            }*/
            if(status == -1){
                break;
            }
        }
        //读取结束,关闭流
        bufferedInputStream.close();
        bufferedOutputStream.close();
    }

    public static void writeFile(String filePath) throws Exception {
        File file = new File(filePath);
        //创建FileWriter对象
        FileWriter fileWriter = new FileWriter(file);
        //缓冲流 -写
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        bufferedWriter.write("hello");
        //换一行 写换行符
        bufferedWriter.newLine();
        bufferedWriter.write("java");
        bufferedWriter.newLine();
        bufferedWriter.write("python");
        //bufferedWriter.newLine();
        //关闭流
        bufferedWriter.close();
    }

    public static void readFile(String filepath) throws IOException {
        //1、普通文本文件的读取 --字符流 FileReader
        //创建file文件对象 参数传入文件的路径
        File file = new File(filepath);
        //创建fileReader对象  参数传入File文件对象
        //(1)异常处理的方式,try catch
        /*try {
            FileReader fileReader = new FileReader(file);
        }catch (FileNotFoundException e){
            //捕捉异常
            //e.printStackTrace(); //StackTrace  方法调用栈,顺序
            System.out.println("文件找不到,检查文件路径是否正确");
        }*/
        //(2)异常的处理方式:不在当前处理,而是把异常抛给上一级调用者
        // eg:方法名后面加throws FileNotFoundException
        //fileReader读取一次性把文件的全部内容读取到内存中
        FileReader fileReader = new FileReader(file);
        // 缓冲流  每一次读取一行,内存中的空间只有这一行  减少内存压力/提高效率
        //BufferedReader参数是为Reader类型 ,传fileReader对象
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String line = "";
        while((line=bufferedReader.readLine()) != null){
            //每一次读取一行
            System.out.println(line);
        }
        //关闭流
        bufferedReader.close();
    }
}

7、 读写的一般步骤--为什么能接收不一样的类,因为多态(ctrl+h快捷键)

  • 1、创建file文件对象,一般是string类型的路径参数filepath传入,做为文件的路径-- File file = new File(filepath);
  • 2、创建fileReader对象或者 参数传入File文件对象-- FileReader fileReader = new FileReader(file);
  • 3、fileReader读取一次性把文件的全部内容读取到内存中--FileReader fileReader = new FileReader(file);
  • 4、缓存流,每一次读取一行,内存中的空间只有这一行 减少内存压力/提高效率BufferedReader参数是为Reader类型 ,传fileReader对象--BufferedReader bufferedReader = new BufferedReader(fileReader);
  • 5、关闭流--bufferedReader.close();

第4步注意:加上:while(bufferedReader.readLine()!= null) 会输入跳行的数据
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line = "";
while((line=bufferedReader.readLine()) != null){
//每一次读取一行
System.out.println(line);
}

8、异常处理

方式1:
通过try...catch来捕捉异常并进行处理,语法如下:

try{
//可能出现异常的语句
}catch(XXException e){ //异常类 异常对象
//异常处理
}

方式2:

异常直接抛出,给上一级调用者去处理,直到被处理,如果所有上级调用者都不处理就会由java虚拟机处理
使用throws关键字抛出异常

如下图所示:

原文地址:https://www.cnblogs.com/shishibuwan/p/13763907.html