6.19实训笔记
- 6.19
- 一、座右铭
- 二、知识回顾
- 2.1 Java集合体系
- 2.2 工具类Utils
- 三、JavaIO流
- 3.1 File类
- 3.2 File类的使用
- 3.2.1 File文件/文件夹类的创建
- 3.2.2 File类的获取操作
- 3.2.3 File类判断操作--boolean
- 3.2.4 File类对文件/文件夹的增删改
- 3.2.5 、File类的获取子文件夹以及子文件的方法
- 3.3 Java中IO流多种纬度的纬度
- 3.3.1 按照流向--Java程序
- 3.3.2 按照流的大小分类
- 3.3.3 按照流的功能分类
- 3.4 JavaIO流的四大基类
6.19
一、座右铭
我的故事你说,我的文字我落,我值几两你定,我去何方我挑。
二、知识回顾
2.1 Java集合体系
-
单列集合Collection–Iterable迭代器、增强的for循环
-
List集合:可以重复、而且加入有序,提供几个可以使用素引进行取值默值的操作
- Vector:数组
- ArrayList:数组
- LinkedList:双向链表–内部类Node
-
Set集合:不可重复
-
HashSet:无序
-
LinkedHashSet:加入有序
-
TreeSet:大小有序、需要借助比较器实现
不可重复
1、hashCode
2、Equals方法
-
-
Queue集合–接触不多
-
Collection—Java给我们提供的封装了单列集合常用的工具方法的工具类–提供的方法针对List集合体系
代码示例
List<Integer> list = Arrays.asList(3,2,1,5,4,6); Collections.sort(list,new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1>o2?-1:(o1==o2?0:1); }});System.out.println(list);//[6, 5, 4, 3, 2, 1]int i = Collections.binarySearch(list, 7);System.out.println(i);//-7List<Object> list2 = Collections.emptyList();Collections.reverse(list);System.out.println(list);//[6, 4, 5, 1, 2, 3]Collections.shuffle(list);System.out.println(list);//[3, 1, 4, 6, 5, 2]
-
接口JDK1.8版本以后增加了两个新的内容:静态方法、默认方法
List<Integer> list = List.of(1,2,3,4,5);Map<String,Integer> of = Map.of("zs", 1, "ls", 2);System.out.println(list);System.out.println(of);
-
-
双列集合Map
-
特点
- 每一行数据都是有两列组成的,其中第一列称为key,第二列称为value
- 其中在Map集合当中,key值不允许重复,value允许重复的。Map集合底层所有的key值通过Set集合来进行存储的,Value值通过Collection集合进行存储的
- 如果Map集合增加了重复性的key值,会把原有的key值对应的value数据替换掉
-
Map接口的常用方法
-
> 代码示例```javaMap<String,Double> map = new HashMap<>();System.out.println(map.size());//查看集合的元素个数 //0System.out.println(map.isEmpty());//判断map集合是否为空 //true//map集合添加元素--添加重复性元素 会覆盖原有的旧的value值map.put("香酥鸡", 69.0);map.put("糖醋丸子", 21.5);map.put("北京烤鸭", 21.5);map.put("鸡公煲", 60.0);map.put("香酥鸡", 99.0);map.put("红烧鱼", 128.0);System.out.println(map); //{北京烤鸭=21.5, 糖醋丸子=21.5, 香酥鸡=99.0, 鸡公煲=60.0, 红烧鱼=128.0}//判断map集合是否包含某个key值System.out.println(map.containsKey("清蒸鲈鱼"));//falseSystem.out.println(map.containsKey("香酥鸡"));//true//根据key值获取map集合对应的value值 如果key值不存在,那么会得到一个null值double price = map.get("香酥鸡");System.out.println(price);//99.0Double price1 = map.get("香酥鸭");System.out.println(price1);//null//map集合为了预防获取不存在的key值导致的空指针问题,提供了一个获取数据的方法并且防止null值Double default1 = map.getOrDefault("红烧鱼", 0.0);System.out.println(default1);//128.0//清空集合// map.clear();// System.out.println(map);//map集合元素替换--key对应的valuemap.replace("红烧鱼", 158.0);System.out.println(map);//{北京烤鸭=21.5, 糖醋丸子=21.5, 香酥鸡=99.0, 鸡公煲=60.0, 红烧鱼=158.0}//根据key移除map集合中某个元素Double remove = map.remove("红烧鱼");System.out.println(map);//{北京烤鸭=21.5, 糖醋丸子=21.5, 香酥鸡=99.0, 鸡公煲=60.0}/*** Map集合的遍历:* 1、keySet():Set<K> 获取map集合中的所有key值,返回的是set集合* 2、entrySet():Set<Entry<K,V>>: 获取map集合中所有元素,变成一个set集合,只不过map集合每一条的key和value使用内部类Entry封装起来*/// Set<String> set = map.keySet();// for (String key : set) {// Double double1 = map.get(key);// System.out.println(key+"="+double1);// }Set<Entry<String,Double>> entrySet = map.entrySet();for(Entry<String,Double> entry : entrySet) {System.out.println(entry.getKey()+"="+entry.getValue());//北京烤鸭=21.5//糖醋丸子=21.5//香酥鸡=99.0//鸡公煲=60.0}```3. Map接口的常用实现类1. Map接口的常用实现类2. LinkedHashMap:有序,加入有序3. Hashtable:无序> Properties:一般是用来读取一些配置文件数据的。4. TreeMap:key的大小有序,key值必须都有比较器> 代码示例```javaMap<String,Double> map = new TreeMap<>();map.put("xiangsuji", 69.0);map.put("tangcuwanzi", 21.5);map.put("beijingkaoya", 21.5);map.put("jigongbao", 60.0);map.put("xiangsuji", 99.0);map.put("hongshaoyu", 128.0);System.out.println(map);//{beijingkaoya=21.5, hongshaoyu=128.0, jigongbao=60.0, tangcuwanzi=21.5, xiangsuji=99.0}```
2.2 工具类Utils
工具类就是把项目或者是某些技术的共有的方法抽取到同一个类中,实现代码的解耗合和可重复利用性,工具类为了便于开发者使用,一般工具类中提供的方法都是纯静态方法、因此工具类一般不需要构建对象、工具类的构造器都是私有化的。
三、JavaIO流
Java Input/Output,一般情况指的是Java操作一些外部数据时,使用IO流的形式进行操作,外部数据主要包括文件、网络等等。
3.1 File类
JavaIO既可以操作文件外部数据,还可以操作网络端口这种外部数据,如果Java要操作文件数据,必须要借助一个类File文件对象类
File类是Java中对文件/文件夹的抽象表示,通过这个File类,我们可以将操作系统本地的一个文件/文件夹加载到Java程序当中,随后通过File对象可以对文件进行增删改查等操作
File类只能操作文件的外部内容、而文件当中有哪些数据,这个操作File类做不到
代码示例
/*** key-value均是Object类型*/Properties prop = new Properties();prop.put("zs", 1);System.out.println(prop);//{zs=1}/*** prop除了map集合有的方法以外,还多了三个方法:* load()* setProperty(String key,String value)===put* getProperty(String key)===get*/prop.load(new FileInputStream("F:\\eclipse-workspace\\java-study-619\\project.properties"));System.out.println(prop);//{password=123456, zs=1, username=zs}String value = prop.getProperty("username");System.out.println(value);//zsprop.setProperty("username", "ls");System.out.println(prop);//{password=123456, zs=1, username=ls}
3.2 File类的使用
3.2.1 File文件/文件夹类的创建
- 根据全路径创建
- 根据父子路径创建
- 根据父子路径创建,只不过父路径也是File对象
3.2.2 File类的获取操作
方法名 |
---|
getName |
getParent |
getPath |
getAbsolutePath |
3.2.3 File类判断操作–boolean
方法名 |
---|
exists() |
isFile() |
isDirectory() |
isHidden() |
canRead() |
canWrite() |
canExecute() |
3.2.4 File类对文件/文件夹的增删改
-
创建
- 创建文件
createNewFile()
:要求父目录必须存在 - 创建文件夹
mkdir()/mkdirs()
- 创建文件
-
删除
delete()
–如果是目录,目录必须空目录 -
修改
renameTo(File):boolean
代码示例
/*** File类的使用* 静态属性* @author 11018** windows: \* mac/linux: /*/ //在eclipse中,因为创建的是Java项目,Java项目中所有的相对路径,指的都是项目名下的某个路径 而非Java源文件的同级路径File file = new File("lzc/a.txt");//获取文件名 路径的最后一个文件/文件夹的名字String fileName = file.getName();System.out.println(fileName);//a.txt//获取文件的父路径 取决于你再构建File对象时有没有传入父路径String parent = file.getParent();System.out.println(parent);//lzc//获取文件的路径 ---传入的路径String path = file.getPath();System.out.println(path);//lzc\a.txt//获取文件的绝对路径--传入路径没有关系的String absolutePath = file.getAbsolutePath();System.out.println(absolutePath);//F:\eclipse-workspace\java-study-619\lzc\a.txtSystem.out.println(file.exists());//falseSystem.out.println(file.isFile());//falseSystem.out.println(file.isDirectory());//falseSystem.out.println(file.isHidden());//falseSystem.out.println(file.canRead());//falseSystem.out.println(file.canWrite());//falseSystem.out.println(file.canExecute());//falseboolean mkdir = file.mkdirs();System.out.println(mkdir);//trueboolean createNewFile = file.createNewFile();System.out.println(createNewFile);//false// boolean delete = file.delete();
// System.out.println(delete);//重命名要求两个路径必须在同一个路径下boolean result = file.renameTo(new File("c:\\dnn"));System.out.println(result);//falseSystem.out.println(file.lastModified());//1687161837429//只能获取文件的大小,无法获取文件夹的大小System.out.println(file.length());//0
3.2.5 、File类的获取子文件夹以及子文件的方法
listFiles()
list()
:返回指定目录下的下一级的文件或者文件夹
3.3 Java中IO流多种纬度的纬度
3.3.1 按照流向–Java程序
-
输入流 Input/Reader
-
输出流 Output/Writer
3.3.2 按照流的大小分类
-
字节流:Stream:什么样的数据都可以处理
-
字符流:Reader/Writer:只能处理纯文本类型的数据
3.3.3 按照流的功能分类
-
节点流:直接对接到数据源上的流
文件流
数组流
网络流
-
处理流:无法直接对接到数据源上,而是包装了节点流,在节点流基础之上提供了更加强大的功能
3.4 JavaIO流的四大基类
-
Javaio流中所有的流都有四个顶尖父类,四个顶尖父类是四个抽象类,四个抽象类当中封装了和流有关的很多的公用方法。
-
InputStream
:java中所有字节输入流的顶尖父类方法名 read:int available:int close() -
OutputStream
:Java中所有字节输出流的顶尖父类方法名 write:写出的字节 close() -
Reader
:Java中所有字符输入流的顶尖父类方法名 read:int close() -
Writer
:Java中所有字符输出流的顶尖父类方法名 write close–底层调用了flush方法 flush
Reader、Writer:
因为要根据编码集进行数据的读取,一次要读取一个字符,而一个字符对应了多个字节。
编码集只有纯文本才有
代码示例
InputStream is = null;try {is = new FileInputStream("lzc/b.txt");//读取数据源的一个字节 read方法每一次读取完成,下一次再进行读取,基于上一次读取的结果向后读/** int read = is.read();* System.out.println(read);* //返回值 如果是read()方法,代表的是每一次读取完成的字节的值,read(byte[])的话返回值不做研究* //不管什么情况下 read的返回值一旦为-1 那么代表数据源没数据了* int read2 = is.read();* System.out.println(read2);*///字节流中可以利用的字节数有多少int available = is . available ( ) ;System.out.println(available);//12byte[] array = new byte[3];int read = is.read(array);String string = new String(array,"UTF-8");System.out.println(string);//中int read2 = is.read();System.out.println(read2);//229} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if (is != null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
/*** 方法递归:就是类似于循环的概念* 当我们在执行一个逻辑的时候,需要重复性的执行某段代码,但是我们不清楚代码需要调用多少次* 我们清楚代码在什么时候调用结束,这种情况下我们就可以方法递归来完成。* 递归返回中必须有两个核心要素点:----if else分支* 1、递归的出口* 2、递归的入口----自己调用自己的逻辑* @author lenovo**/ File file = new File ( "c:/users/lenovo/desktop/demo" ) ;String[] files = file.list () ;System . out . println (Arrays.toString(files)) ; //[a.txt]File[] files2=file.listFiles();for ( File f : files2 ) {System.out.println(f.getAbsolutePath());//c:\\users\\lenovo\\desktop\\demo\\a.txt
/*** InputStream:字节输入流* */InputStream is = null;try {is = new FileInputStream("lzc/b.txt");//读取数据源的一个字节 read方法每一次读取完成,下一次再进行读取,基于上一次读取的结果向后读/** int read = is.read();* System.out.println(read);* //返回值 如果是read()方法,代表的是每一次读取完成的字节的值,read(byte[])的话返回值不做研究* //不管什么情况下 read的返回值一旦为-1 那么代表数据源没数据了* int read2 = is.read();* System.out.println(read2);*///字节流中可以利用的字节数有多少int available = is . available ( ) ;System.out.println(available);//12byte[] array = new byte[3];int read = is.read(array);String string = new String(array,"UTF-8");System.out.println(string);//中int read2 = is.read();System.out.println(read2);//229} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if (is != null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
/*** OutputStream基类提供的常用方法:* write(int 字节)* @author lenovo**/OutputStream os = null;try {os = new FileOutputStream(new File("lzc/b.txt"));os.write(97);//aos.write("中国加油".getBytes("UTF-8"));//中国加油os.write("中国加油".getBytes("UTF-8"),0,6);//中国} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if (os !=null) {try {os.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}
/*** Reader的常用方法* close()* @author lenovo**/
try {Reader r = new FileReader(new File("lzc/b.txt"));int read = r.read();System.out.println(read);//97int read2 = r.read();System.out.println(read2);//20013char c = (char)read2;System.out.println(c);//中char[] buf = new char[5];r.read(buf);System.out.println(Arrays.toString(buf));//[国, 加, 油, 中, 国]r.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}
Writer w = new FileWriter(new File("lzc/b.txt"));//w.append('a');w.write("zs123");w.write("1s123");w.write("1s123");w.flush();w.close();}
//文件复制InputStream is = null;OutputStream os = null;try {is = new FileInputStream(new File ("c:/users/lenovo/desktop/A.jpg")) ;os = new FileOutputStream("c:/users/lenovo/desktop/B.jpg");int read;byte[] buf = new byte[1024*1024];while((read =is.read())!=-1){//while((read =is.read(buf))!=-1){os.write(read);//os.write(read^5);//os.write(buf);}} catch(FileNotFoundException e){//TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if (os != null) {try {os.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }if (is != null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
//加密照片 FileReader is = null;OutputStream os = null;try {is = new FileReader(new File ("c:/users/lenovo/desktop/A.png")) ;os = new FileOutputStream("c:/users/lenovo/desktop/A.png");int read;byte[] buf = new byte[1024*1024];while((read =is.read())!=-1){//while((read =is.read(buf))!=-1){//os.write(read);os.write(read^5);//os.write(buf);}} catch(FileNotFoundException e){//TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if (os != null) {try {os.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }if (is != null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}