> 文档中心 > 集合与IO流(输入输出)

集合与IO流(输入输出)

文章目录

  • 前言
  • 集合
    • List集合
    • set集合
    • Map集合
    • Collections工具
  • File与IO流
    • File类
    • IO字符流与字节流
      • 字符流
      • 字节流
    • 打印流
    • 缓冲流

前言

提示:本文来自老师授课内容,已获得老师同意在此当做本人学习笔记记录:

1.集合长度可变
2.数组中存基本数据类型,集合中存的都是对象

Collection表示一组对象,JDK不提供此接口的直接实现,它提供更具体的子接口。通常来传递collection。

增add addAll
删 remove removeAll
判断isEmpty contains
查询 size


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

集合

List集合

java.util.List接口和set继承自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合。
List有2个实现类ArrayList和LinkedList(链表结构:查询慢,增删快,包括大量操作首尾元素的方法)

1.可以重复 2.有索引 3.有顺序

public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。
public E get(int index):返回集合中指定位置的元素。
public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

public class Test {/*增 add(int index, E element)查 get(int index)删 remove(int index)改set(int index, E element)*/public static void main(String[] args)  {List<String> list = new ArrayList<String>();  //list.add("大娃");list.add("二娃");list.add("三娃");list.add(1,"四娃");System.out.println(list); //增list.remove(1);System.out.println(list); //删list.set(0, "大力士");System.out.println(list); //改,重写toStringSystem.out.println(list.get(2));//查三娃,索引为2的元素//for(int i=0;i<list.size();i++){//     System.out.println(list.get(i));// }//增强for:数组或者list、setfor(String i:list) {System.out.println(i);}}  }

练习:
(ArrayList)已知某学校的课程信息如下:
课程号 课程名
001 Java语言程序设计
002 Web开发与应用
003 软件工程
完成下列要求:
1) 编写课程类Course,包含id和name两个私有属性,带参的构造方法和两个属性的get方法
2) 创建ArrayList对象list,添加如上表所示的三个课程对象
3) 对list进行遍历,输出课程号和课程名
4) 查找是否存在“001”的课程,如果存在,删除
5)对list进行遍历,输出课程号和课程名
答:

package com.neu.edu;import java.util.ArrayList;import java.util.List;public class Test {public static void main(String[] args)  {List<Course> list = new ArrayList<Course>();  //Course c1 = new Course("001"," Java语言程序设计");Course c2 =new Course("002"," Web开发与应用");Course c3 =new Course("003"," 软件工程");list.add(c1);list.add(c2);list.add(c3);if(list.contains(c1)) {list.remove(c1);}System.out.println(list); for(Course i: list) {System.out.println(i.getId() + i.getName());}}  }class Course{private String id;private String name;public Course(String id, String name) {super();this.id = id;this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

set集合

1.不可以重复 2.没有索引

HashSet
​是Set接口的一个实现类,1它所存储的元素是不可重复的,2元素都是无序的(即存取顺序不一致)3底层是哈希表(查询速度快)。

import java.util.HashSet;import java.util.Iterator;import java.util.Set;public class Test {public static void main(String[] args)  {Set<Integer> set = new LinkedHashSet<Integer>();  //HashSet()set.add(10);set.add(25);//增set.add(25);//增不允许重复,重复不输出了set.remove(12);//删System.out.println("set = " + set);//1.使用增强for循环set集合for (Integer i : set) {     System.out.println(i); }//2.使用迭代器循环set集合Iterator<Integer>  it = set.iterator();while(it.hasNext()) { System.out.println(it.next());}}  }

Map集合

现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等, 这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即 java.util.Map 接口。

HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链 表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的 hashCode()方法、equals()方法。

加put 删remove 查get 改 replace() size isEmpty clear
代码如下(示例):

public static void main(String[] args)  {Map<String,String> map = new HashMap<String,String>();map.put("大娃", "大力士");map.put("二娃", "水娃");map.put("四娃", "千里眼");map.put("六娃", "隐身娃");//增System.out.println(map);map.remove("四娃");//删System.out.println(map);map.replace("六娃", "顺风耳");//改System.out.println(map.get("六娃"));//查for (String s : map.keySet()) {  System.out.println(s.toString() + " = " + map.get(s)); //s + " = " + map.get(s) }map.clear();  //清空mapSystem.out.println("元素数目:"+map.size()+"isEmpty:"+map.isEmpty());}  

Collections工具

是集合工具类,用来对集合进行操作。部分方法如下:

public static boolean addAll(Collection c, T… elements) :往集合中添加一些元素。
public static void shuffle(List list) 打乱顺序:打乱集合顺序。
public static void sort(List list):将集合中元素按照默认规则排序。
public static void sort(List list,Comparator ):将集合中元素按照指定规则排序。

public static void main(String[] args)  {List<Integer> list = new ArrayList<Integer>();//list.add(10);//list.add(15);//list.add(20);Collections.addAll(list, 10,15,20,25);//使用集合工具类往集合里加元素System.out.println(list);Collections.shuffle(list);//打乱顺序System.out.println(list);Collections.sort(list);System.out.println(list);//排序}  

File与IO流

File类

文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。

方法有三类:1获取、2判断、3创建或删除

public String getAbsolutePath() :返回此File的绝对路径名字符串。
public String getPath() :将此File转换为路径名字符串。
public String getName() :返回由此File表示的文件或目录的名称。
public long length() :返回由此File表示的文件的长度。

  • public boolean exists() :此File表示的文件或目录是否实际存在。
  • public boolean isDirectory() :此File表示的是否为目录。
  • public boolean isFile() :此File表示的是否为文件。

public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
public boolean delete() :删除由此File表示的文件或目录。
public boolean mkdir() :创建由此File表示的目录。
public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

public static void main(String[] args) throws Exception   {String pathSeparator = File.pathSeparator;  //路径分隔符String separator = File.separator;//文件名分隔符System.out.println(pathSeparator  +"文件名分隔符"+separator);File f = new File("D:\\Work\\aaa.txt");//System.out.println(f.getAbsolutePath());System.out.println(f.exists());//exists()` :此File表示的文件或目录是否实际存在System.out.println(f.isDirectory());//此File表示的是否为目录。System.out.println(f.isFile());//此File表示的是否为文件。System.out.println("----------------1---------------------------");File f2 = new File("newDir");System.out.println(f2.exists());//此File表示的文件或目录是否实际存在System.out.println(f2.mkdir());//创建由此File表示的目录System.out.println(f2.exists());//此File表示的文件或目录是否实际存在System.out.println(f2.getAbsolutePath());System.out.println("---------------2----------------------------");System.out.println(f2.delete());File f3 = new File("newDir\\newDirb");System.out.println(f3.mkdirs());}  

输出:

;文件名分隔符\falsefalsefalse----------------1---------------------------truefalsetrueE:\ENV20\20220905\newDir---------------2----------------------------falsefalse

IO字符流与字节流

输入流 输出流
字节流 字节输入流 InputStream 字节输出流 OutputStream
字符流 字符输入流 Reader 字符输出流 Writer

字符流

一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

输出流

public static void main(String[] args) throws IOException{ FileWriter fw = new FileWriter("fw.txt");  //创建输出流对象 fw.write(98);  //98对应字符'b' fw.write("b"); fw.write("c"); fw.write(30000);  //30000对应中文编码表里的汉字:田 fw.flush(); //刷新缓冲区,流对象继续使用 // fw.close();//刷新缓冲区,流对象不能继续使用 ,资源释放了 }

运行后,右键项目选择【Properties】,然后选择该文件的路径
集合与IO流(输入输出)集合与IO流(输入输出)

点进去就可以看到生成的【fw.txt】,输出:bbc田
集合与IO流(输入输出)集合与IO流(输入输出)

输入流

// 输入流,需要在文件路径下先建文件(这里建的是fr.txt)写东西public static void main(String[] args) throws IOException{ FileReader fr = new FileReader("fr.txt");  //创建字符输入流对象 int b;//b用来保存数据 while((b=fr.read()) != -1) {    //如果读到数据,那么就向下读  fr.read()每次可以读取一个字符的数据,读到文件末尾返回-1 System.out.print((char)b);    //如果直接输出b则以int型输出 } fr.close(); }

字节流

public static void main(String[] args) throws IOException{ DataInputStream in = new DataInputStream(new FileInputStream("fr.txt")); BufferedReader d  = new BufferedReader(new InputStreamReader(in));//逐行读取,br extends reader// String count;// while((count = d.readLine()) != null) {// System.out.println(count);// } DataOutputStream out = new DataOutputStream(new  FileOutputStream("test1.txt")); String count; while((count = d.readLine()) != null) {out.writeBytes(count+","); }  d.close(); out.close(); }

打印流

平时我们在控制台打印输出,是调用 print方法 和 println方法完成的,这两个方法都来自于 java.io.PrintStream类,该类能够方便地打印任意类型的值。

public static void main(String[] args) throws IOException{ System.out.println(97);   //正常参数类型为字符串型,如果没加引号,也是以打印流形式直接输出了 PrintStream ps = new PrintStream("ps.txt");  //实例化打印流对象,输出到ps.txt文件里 ps.write(99); //输出99对应的Ascii System.setOut(ps);//调用系统的打印流,改变输出语句的目的地址,保存在ps.txt文件里} 

缓冲流

能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。
这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,就像穿上铠甲的武士一样,相当于是对基本流对象的一种增强。

例:将括号内的文本信息恢复顺序
【5.半卷红旗临易水,7.报君黄金台上意,3.角声满天秋色里,1.黑云压城城欲摧,8.提携玉龙为君死!4.塞上燕脂凝夜紫。2.甲光向日金鳞开。6.霜重鼓寒声不起。】
1.使用HashMap
2.逐行读信息
3.读完之后把读到的信息放到HashMap
4.通过循环按顺序输出

首先在项目路径下新建一个txt文件,这里起名(ps.txt),然后把要恢复的内容放进去
在这里插入图片描述集合与IO流(输入输出)

public static void main(String[] args) throws IOException {// 创建map集合,保存文本数据,键为序号,值为文字HashMap<String, String> lineMap = new HashMap<>();// 创建流对象BufferedReader br = new BufferedReader(new FileReader("ps.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("fos.txt"));// 读取数据String line = null;while ((line = br.readLine()) != null) {// 解析文本String[] split = line.split("\\.");// 保存到集合lineMap.put(split[0], split[1]);}// 释放资源br.close();// 遍历map集合for (int i = 1; i <= lineMap.size(); i++) {String key = String.valueOf(i);// 获取map中文本String value = lineMap.get(key);// 写出拼接文本bw.write(key + "." + value);// 写出换行bw.newLine();}// 释放资源bw.close();}

这种写法就是在项目路径下生成了 fos.txt ,里面内容则是恢复顺序后的文本信息
集合与IO流(输入输出)

好看字体下载