Javase 集合 IO输入输出流 异常处理

异常处理

  • 这个感觉目前还是用不了。只是在提示的时候加上。

  • try{
    //错误的方法
    }catch{

    //处理
    }可以多个catch处理多个异常
    finally{
    //最终执行代码
    }
    执行完会顺序执行后面的语句

  • throw ex; 抛出异常给上级
    throw 的作用是手工抛出异常类的实例化对象 将异常再次抛出,即使是处理了还可以
    throws 声明的方法表示该方法不处理异常,而由系统自动将所捕获的异常信息抛给上级调用方法。
    上级调用了throws声明的方法,

    自定义异常
    class 自定义异常类 extends 异常类{//必须继承java标准类库里意思相近的或者Java基类,Exception()
    }

  • 编译时异常: 程序正确,但因为外在的环境条件不满足引发。

    例如:用户错误及I/O问题—-程序试图打开一个并不存在的远程Socket端口。这不是程序本身的逻辑错误,
    而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。
    Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。

  • 运行期异常: 这意味着程序存在bug,如数组越界,0被除,入参不满足规范……这类异常需要更改程序来避免,
    Java编译器强制要求处理这类异常。

  • 父类与子类抛异常

  1. 若父类方法并没有抛异常
    a) 那么子类就重写父类方法就不可以抛出编译异常(IOException),可以抛运行时异常

  2. 子类重写方法的时候可以随时抛出运行时异常,包括空指针异常,数组越界异常等。

  3. 如果父类的方法抛出了一个异常,那么子类在方法重写的时候不能抛出比被重写方法
    申明更加宽泛的编译时异常。

    使用接口也是一样的


io输入输出流

  • 输入(input)是从硬盘读取到内存,是读数据
  • 输出(output)是从内存写入到硬盘,是存数据

File类

  • java.io.File 类用于表示文件(目录)
    只用于表示文件的信息(名称 , 大小),不能访问文件内容
  • File file = new File(“D:\java”);得用双斜杠
    File file = new File(“D:\java” , “日记.txt”);1
    File file = new File(“D:\java\日记.txt”);2
    1 2 是一样的
  • file.exists()查看目录是否存在 存在返回true
    file.mkdir()创建一级目录 file.delete()删除目录,file.mkdirs()创建多级目录
    file.isDirectory()判断是否为目录,是返回true
    file.isFile()判断是否为文件
    file.createNewFile()创建一个文件

字节流

  • InputStream/OutputStream
    - 是一个抽象类,所有输入输出类的超类
    - 子类都以该类名作为后缀
  • FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
    - int read() 从此输入流中读取一个数据字节。
    - int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
  • FileOutputStream(String name)
    创建一个向具有指定名称的文件中写入数据的输出文件流。
    - void write(int b) 将指定字节写入此文件输出流。
    - void write(byte[] b) 将 b.length 个字节从指定 byte 数组写入此文件输出流中。
  • 必须需要 void close()
    关闭此文件输入/出流并释放与此流有关的所有系统资源。
  • 要想换行可添加\n windows 是\r\n Linux 是\n mac 是\r
  • 追加写入 可在构造方法里加true
//文件复制模板
FileInputStream fis = new FileInputStream("D://aa.txt");
FileOutputStream fos = new FileOutputStream("D://a.txt");
byte[] bytes = new byte[1024];
int len;
while((len = fis.read(bytes))!=-1) {
	fos.write(bytes,0,len);
}
fis.close();
fos.close();
  • 这两个相当于修饰类,把一些方法封装,可以直接使用
    DataInputStream
    但是实例化对象时,需要DataInputStream dis = new DataInputStream(new FileInputStream(file));
    DataOutputStream

  • BufferedInputStream 带缓冲区 bis.flush刷新缓冲区
    write使用和FileInputStream差不多,就是先把字节读入缓冲区,然后写入文件,提高io性能

  • 字节流的copy 批量操作最快 就是从文件读取字节到字节数组,然后存入文件中比一个一个字节读取快,也比缓冲区读取快


字符流

  • 字符流 = 字节流 + 编码表

  • 储存为字节,怎么识别哪几个字节代表汉字?汉字的第一个字节都是负数,然后按照编码格式读取之后的字节,再拼接起来

  • 编码表:一般会有ASCll(用于显示现代英语) GBxxx(主要是GBK(双字节),用来显示中文)系列 Unicode(统一码,都可以用,一般使用UTF-8,汉字是三字节,英语是单字节)

  • 编码:byte[] getBytes();使用平台默认字符集编码,byte[] getBytes(String name)使用自己指定字符集编码。

  • 解码:String(byte[] bytes);使用字符串的构造方法,平台默认字符集解码。String(byte[] bytes , String name)使用自己指定的字符集解码

  • Reader/Writer 是抽象类

  • 子类有InputStreamReader/OutputStreamWriter

  • InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。

  • 可以直接write(字符串);

  • FileReader / FileWriter 和上面的InputStreamReader一样 , 就是构造可以直接放file或者一个路径
    没法加上文件编码,文件是utf-8你项目gbk就是乱码,没法修改,只能回归InputStreamReader

  • 字符的过滤器
    - BufferedReader
    readLine() 一次读一行 , 不能识别换行符,构造比较复杂,三层
    - BuffeedWriter/PrintWrite —>写一行,也不能换行
    newLine(); 写入一个行分隔符。
    PrintWrite 构造更简单,可以文件名
    PrintWriter(File file) 使用指定文件创建不具有自动行刷新的新 PrintWriter。
    Println(line) 写一行,然后终止该行。


特殊输入流

  • System.in 标准输入流,从键盘输入
  • 自己实现从键盘录入:BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  • 别人的类:Scanner s = new Scanner(System.in);
  • System.out.println一般是使用这个输出数据到控制台
  • System.out本质是一个字节输出流,返回是一个PrintStream类的对象,而该类的爷爷类是OutputStream,父类是FileOutputStream
对象序列化流
  • ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。

  • 学生类必须实现Serializable 接口 ,不需要重写方法

  • void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。

反对象序列化流
  • ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
  • Object readObject() 从 ObjectInputStream 读取对象。
  • 需要将Object强转成Student类型

集合

  • 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变

在这里插入图片描述

Collection

  • JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如 Set 和 List)实现。
  • 创建Collection集合的对象 , 需要多态的方式和一个具体的实现类
Collection<E> c = new ArrayList<E>();
  • 也具有一些方法
    - Iterator iterator() 返回在此 collection 的元素上进行迭代的迭代器。 Iterator迭代器,集合专用遍历方法
    - Iterator 是一个接口 常用方法:E next():返回迭代的下一个元素 boolean hasNext(): 判断有没有下一个元素
    - 会返回一个实现类对象,就是Iterator接口的具体实现类。故是通过多态形式的
//以这种迭代器方式遍历集合
Iterator<E> it = c.iterator();
while(it.hasNext()){
	System.out.println(it.next());
}

List

  • 有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
  • 与 set 不同,列表通常允许重复的元素
  • List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。
  • ListIterator listIterator() 返回此列表元素的列表迭代器(按适当顺序)。
ArrayList
  • 可调整大小的数组实现,是泛型
  • ArrayList() 构造一个初始容量为 10 的空列表。
  • boolean add(E e) 将指定的元素添加到此列表的尾部。
  • void add(int index, E element) 将指定的元素插入此列表中的指定位置。
  • void clear() 移除此列表中的所有元素。
  • E remove(int index) 移除此列表中指定位置上的元素,返回被删除的元素
  • boolean remove(Object o) 移除此列表中首次出现的指定元素(如果存在),返回删除是否成功
  • E set(int index, E element) 用指定的元素替代此列表中指定位置上的元素,返回被修改的元素
  • int size() 返回此列表中的元素数。
  • E get(int index) 返回此列表中指定位置上的元素。
  • 底层实现是数组,查询快,增删慢

LinkedList
  • List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。

  • 底层实现是链表,查询慢,增删慢

  • 是List的具体实现类,所以一些方法是一样的。但是有因为是链表,所以还是有一些针对头尾节点的方法

  • void addFirst(E e) 将指定元素插入此列表的开头。

  • void addLast(E e) 将指定元素添加到此列表的结尾。

  • E getFirst() 返回此列表的第一个元素。

  • E getLast() 返回此列表的最后一个元素。

  • E removeFirst() 移除并返回此列表的第一个元素。

  • E removeLast() 移除并返回此列表的最后一个元素。


Set

  • 一个不包含重复元素的 collection
  • 没有带有索引的方法,不能使用普通for循环遍历
  • 哈希值:是JDK根据对象的地址,字符串,或者数字算出来的int类型的数值
  • Object类中有返回对象哈希值的方法,public int hashCode()返回该对象的哈希码值。同一个对象的哈希值是相同的,不是的话则不相同
HashSet
  • 此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
  • 底层数据结构是哈希表,不保证存入和取出数据顺序相同,同时也具备Set的特点
  • 哈希表:JDK8之前底层是使用链表+数组,可以说是一个元素为链表的数组。JDK8之后,在长度比较长时,实现了优化
  • 首先是一个长度为16的数组,然后每个对象%16 余几就在几的位置。若余数相同,则比较哈希值,不一样的话在同一个位置开始产生链表。哈希值还一样,则比较内容。这样就保证了哈希表内容的不重复

TreeSet
  • 使用元素的自然顺序(a-z)对元素进行排序,或者根据创建 set 时提供的 Comparator(自定义排序) 进行排序,具体取决于使用的构造方法
  • TreeSet() 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
  • TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。
  • 元素有序,但是不是根据存储的有序,而是根据一种指定的排序方式。
  • 元素,不可重复。没有带索引的方法,不能使用普通for可以使用迭代器和foreach

Comparable 自然排序

  • 你的学生类需要实现这个接口,得重写compareto()方法(只有这一个)
  • int compareTo(T o)比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
  • 每次使用add的时候就会比较一次,或者多次(猜的)
  • (条件)?a:b 若条件满足,则为a,否则为b

Comparator 比较器排序

  • 可以使用TreeSet的带参构造方法,TreeSet(Comparator<? super E> comparator)
  • 需要的是一个实现Comparator接口的实现类。可以通过匿名内部类的方式搞
TreeSet(new Comparator<E>(){
  public int compare(E e1 , E e2){
  	return 0;
  }
})      

Map

  • public interface Map<K,V> K - 此映射所维护的键的类型,V - 映射值的类型,双列
  • 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射一个值。就是单射,一 一 对应
  • V put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。 当Key第一次出现,用来添加元素。之后就是修改元素
  • V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 根据建来删除元素
  • boolean containsKey(Object key) 判断是否包括key
  • boolean containsValue(Object value) 判断是否包含指定value
  • boolean isEmpty() 判断是否为空
  • V get(Object key) 根据key返回value
  • Set keySet() 返回key的集合
  • Collection values() 返回value的集合
  • Set<Map.Entry<K,V>> entrySet() 返回键值对对象得集合
//第一种,遍历Map集合
Map<E><E> map = new Map<E><E>();
Set<E> keySet = map.keySet();
for(E key :keySet){
	E value = map.get(key);
	System.out.println(key +","+ value);
}
 //第二种
 Set<Map.Entry<K,V>>  entrySet = new map. entrySet();
 for(Map.Entry<K,V> me : entrySet ){
 	System.out.println(me.getKey() +"," + me.getValue() );
 }

Collections

  • 具体类,全是静态方法,针对集合操作的工具类
  • static <T extends Comparable<? super T>> void sort(List list)
    根据元素的自然顺序 对指定列表按升序进行排序。
  • static void reverse(List<?> list) 反转指定列表中元素的顺序。
  • static void shuffle(List<?> list) 使用默认随机源对指定列表进行置换。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值