Java学习笔记
2021-09-06 13:53:01 15 举报
AI智能生成
更新注解
作者其他创作
大纲/内容
异常
用增强for循环遍历TreeSet集合时出现的异常
ClassCastException
D:\Develop\jdk\jdk12\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar=55074:D:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\bin" -Dfile.encoding=UTF-8 -classpath E:\IdeaProjects\AdvancedCode\out\production\day09_heima_hash_set com.itheima.hashset.job.test02.Test01
Exception in thread "main" java.lang.ClassCastException: class com.itheima.hashset.job.test02.Employee cannot be cast to class java.lang.Comparable (com.itheima.hashset.job.test02.Employee is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
at java.base/java.util.TreeMap.compare(TreeMap.java:1291)
at java.base/java.util.TreeMap.put(TreeMap.java:536)
at java.base/java.util.TreeSet.add(TreeSet.java:255)
at com.itheima.hashset.job.test02.Test01.main(Test01.java:25)
Process finished with exit code 1
Exception in thread "main" java.lang.ClassCastException: class com.itheima.hashset.job.test02.Employee cannot be cast to class java.lang.Comparable (com.itheima.hashset.job.test02.Employee is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
at java.base/java.util.TreeMap.compare(TreeMap.java:1291)
at java.base/java.util.TreeMap.put(TreeMap.java:536)
at java.base/java.util.TreeSet.add(TreeSet.java:255)
at com.itheima.hashset.job.test02.Test01.main(Test01.java:25)
Process finished with exit code 1
原因分析
没有重写
Markdown 常用语法
掌握&了解
掌握
了解
JavaSE单词
一 . Java基础
day01_环境搭建&快速入门
环境搭建
Java语言的背景介绍
Java跨平台性
JDK和JRE关系
子主题
day02_类型转换&运算符
day03_siwtch和循环语句
day04_idea&数组
day05_方法
day06_进制
什么是进制
进制是指进位制,是人们规定的一种进位方式,表示某一位置上的数,运算时是逢X进一位.
十进制是逢十进一,二进制是逢二进一,八进制是逢八进一
十进制是逢十进一,二进制是逢二进一,八进制是逢八进一
常见的进制
二进制 0~1
逢二进一,借一当十
任意进制到十进制的转换公式: 系数*基数的权次幂相加 :
例1: 0b110 --> (0*2^0=0)+(1*2^1)+(1*2^2)=6
例2: 0x110 --> (0*16^0=0)+(1*16^1)+(1*16^2)=272
例1: 0b110 --> (0*2^0=0)+(1*2^1)+(1*2^2)=6
例2: 0x110 --> (0*16^0=0)+(1*16^1)+(1*16^2)=272
以 0b开头
八进制 0~7
以0开头
十进制
运算规则:逢十进一,借一当十
十六进制0~7
以0x开头
原码反码补码
计算机中的数据都是以二进制补码的形式在运算,而补码则是通过反码和原码推算出开的
原码:看数据用的
反码:转数据用的
补码:运算数据用的
位运算
位与
取反
位移运算符
<<有符号左移运算
二进制位向左移动,左边符号位丢弃,右边补齐0
运算规则
向左移动几位,就是乘以2的几次幂
>>有符号右移运算
二进制位向右移动,使用符号位进行补位
运算规则
向右移动几位,就是除以2的几次幂
>>> 无符号右移运算
无论符号位是0还是1,都补0
day07_Debug和二维数组
day01_面向对象基础
System类
常见方法
day01_String 和 StringBuffer 和 StringBuilder 类
String
属性
Prototype
length
静态方法
fromCharCode(...Num)
fromCodePoint(...Num) -- 无效字符返回错误
常用方法
equals(String srt)
比较字符串的内容是否相等
equalsIgnoreCase()
比较两个字符串的内容是否相等,忽略大小写
charAt(int index);
返回输入的索引处的字符,索引从0开始
length();
返回字符串的长度
toCharArray();
将当前字符串拆分为字符数组并返回
substring(int index);
字符串的截取,从index索引处开始截取,直到末尾
substring(int starIndex,int endIndex);
从statindex索引位置开始截取到endindex处(不包含endindex)
replace("旧值" , "新值");
将旧值替换为新值,返回新的字符串(用于敏感词屏蔽)
String[] split = str.split(",");
根据 "," 切割字符串,返回一个数组
原型方法
anchor(name)
返回一个ahtml元素
charAt(index)
返回指定索性的字符串
charCodeAt(index)
返回指定索性的字符串的Unicode编码
concat(String)
返回字符串的拼接 -- 'a'.concat('b') ==> 'ab'
endsWith(String, [index结束位置])
判断指定字符串为目标字符串的结束为止,可指定结束值
includes(String,[index截至位置]
判断指定字符串是否存在目标字符串,可指定搜索位置
indexOf(String)
返回字符串是否存在目标字符串,存在返回位置,不存在返回-1
lastIndexOf(String)
返回字符串是否存在目标字符串的结束为止,不存在返回-1
link(url)
创建一个a标签
match(正则)
返回匹配符合正则规则的字符串
replace( 正则|String newSubStr|function )
search(正则)
返回匹配成功的首位索引。无返回-1
slice(start,End)
返回提取后的字符串,Start开始位置(如为-1表示length-1),end为结束位置,不传为length-1
split('分割’|正则,返回数量)
返回字符串的分割,带返回数量为返回指定数量的数组
startsWith('字符串‘, 起始位置)
查看字符串是否在起始位置,默认为0
substr(开始位置,截至位置)
提取字符串,开始位置默认为0(负数为length-值),截至默认为length(不包含)
substring(开始位置,截至位置)
提取字符串,开始位置默认为0(负数为length-值),截至默认为length(不包含)
toLowerCase()
返回字符串小写
toLocaleLowerCase()
返回字符串小写(针对特殊地区)
toUpperCase()
返回字符串大写
toLocaleUpperCase()
返回字符串的大写(针对特殊地区)
toString(String)
返回字符串形式
trim()
删除字符串两边的空格
StringBuilder
可变字符串
可变字符串
构造方法
StringBuilder sb = new StringBuilder();
创建一个空白可变字符串对象,不包含任何内容
StringBuilder sb = new StringBuilder("abc");
根据字符串的内容,来创建可变字符串对象
常用方法
sb.append(任意类型);
添加数据,返回对象本身
StringBuilder reverse = sb.reverse();
返回相反的字符序列
int length = sb.length();
返回长度(字符出现的个数)
String s = sb.toString();
将StringBuilder对象转换为String对象
作用
提高字符串的操作效率
StringBuffer
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder是一个可变字符串类,我们可以把它看成是一个容器
day01_ArrayList集合&综合案例
学生管理系统
分析
定义一个学生类
学生类
成员变量
构造方法
成员方法
主界面的代码实现
添加学生的代码实现
查看学生的代码实现
删除学生的代码实现
修改学生的代码实现
设计
编程
二 . JavaSE基础进阶
day01_
分类思想
分类思想的介绍
黑马信息管理系统分类
标准学生类,封装键盘录入的学生信息(id,name,age,birthday)
StudentDao类Dao: (Data Access Object)用于访问存储数据的数组或集合
StudentService类: 用来进行业务逻辑的处理(例如:判断录入的id时候存在)
StudentController类和用户打交道(接收用户需求,采集用户信息,打印数据到控制台)
分类思想
分工协作,专人干专事.
分工协作,专人干专事.
分包思想
包的概述
包的注意事项
类与类之间的访问
黑马信息管理系统
学生管理
老师管理
day02_继承
day03_封装
day04_多态
day05
day05_API 应用程序编程接口
(Application Programming Interface)
(Application Programming Interface)
简单来说:就是Java帮我们写好的一些方法,我们直接拿过来用就可以了
API文档
常用的类
Math
没有构造方法,所有的方法都是静态的,直接通过类名.调用
常用类
返回参数的绝对值
abs(int a);
向上取整
ceil(double b);
向下取整
floor(double b);
四舍五入
round(float a);
返回两个int值中的较大值
max(int a, int b);
返回两个int值中的较小值
min(int a, int b);
返回b的次幂的值
pow(double a, double b);
返回值为double的正值[0.1,1.0)
random();
System
常用方法
exit(int status);
终止当前运行的Java虚拟机,零为正常停止,非零表示异常终止
System.currentTimeMillis();
获取1970年1月1日0时0分0秒到当前时间经历过的毫秒值
arraycopy(数据源数组 , 起始索引, 目标数组 , 起始索引 ,拷贝个数);
数组拷贝
Object
概述
每一个类都可以将Object作为父类. 所有类都直接或者间接的继承自该类.
构造方法:
public Object();
Objects
常用方法
toString(对象);
返回参数中对象的字符串表示形式
toString(对象, 默认字符串);
返回对象的字符串表示形式
isNull(对象);
判断对象是否为空
noNull(对象);
判断对象是否不为空
BigDecimal
(用于高精度计算)
(用于高精度计算)
构造方法
BigDecimal(double val)
参数为: double
BigDecimal(String val)
参数为: String
如果想要进行精确运算,使用字符串的构造
常用方法
包装类
基本类型的包装类
byte----Byte
short----Short
int----Integer
Integer
类
类
常用方法
获取int的最大值
Integer.MAX_VALUE
获取int的最小值
Integer.MIN_VALUE
Integer.valueOf(String str);
Integer.valueOf(int i)
子主题
long----Long
float----Float
double----Double
char----Character
boolean----Boolean
自动装箱和自动拆箱
包装类的数据转换
JDK7的日期时间类
Date类
SimpleDateFormat类
JDK8新增的日期类
LocalDateTime获取对象
LocalDateTime的获取方法
LocalDateTime的转换方法
LocalDateTime的格式化和解析
LocalDateTime加减运算方法
LocalDateTime设置时间的方法
时间间隔类
Period类
Duration类
数组的高级操作
二分查找
冒泡排序
递归
Arrays
数组工具类
数组工具类
day06_
异常
异常类的继承体系
异常的处理
Throwable的方法
throw 产生一个异常
自定义异常
异常的小结
JavaSE常见的异常
day07_数组和集合的区别
集合的体系结构
Collection接口
迭代器遍历
增强for遍历
数据结构
LinkedList类特有方法
day08_泛型,Set,二叉树
泛型
泛型类
泛型方法
泛型接口
泛型的总结
泛型限定
day09_红黑树、HashSet、Map
集合框架
Collection接口
方法
boolean add(E element)
Iterator iterator()
int size()
boolean isEmpty()
boolean contains(Object obj)
boolean containsAll(Collection c)
boolean addAll(Collection from)
boolean remove(Object obj)
boolean removeAll(Collection c)
void clear()
boolean retainAll(Collection c):删除所有与c集合中的元素不同的元素
Object[] toArray()
T[] toArray(T[] arrayToFill)
子类
List接口
ArrayList:动态列表
LinkedList:可以在任何位置进行高效插
List.of(元素1,元素2....); 这个方法底层会给你创建一个List接口的实现类对象,但是呢,这个对象既不是ArrayList也不是LInkedList;
但是给你返回的List集合是一个不可变的集合
但是给你返回的List集合是一个不可变的集合
Deque接口
方法
void addFirst(E item)
void addLast(E item)
boolean offerFirst(E item)
boolean offerLast(E item)
E removeFirst()
E removeLast()
E pollFirst()
E pollLast()
E getFirst()
E getLast()
E peekFirst()
E peekLast()
子类
ArrayDeque:双端队列
Queue接口
方法
boolean add(E item)
boolean offer(E item)
E remove()
E poll()
E element()
E peek()
子类
PriorityQueue:优化级队列
Set接口
HashSet:没有重复元素的无序集合
HashSet的底层原理
JDK7底层HashSet的原理
JDK8底层HashSet的原理
如果同一个hashCode值位置的元素超过8个,把就链表改为红黑树
JDK8底层HashSet的数据结构:数组+链表+红黑树
JDK8底层HashSet的数据结构:数组+链表+红黑树
TreeSet:没有重复元素的有序集合
1. 自然排序Comparable
2. 比较器排序Comparator
3.如何选择排序规则
EnumSet:包含枚举类型值的集合
LinkedHashSet:可以记住元素插入顺序的集合
SortedSet
E first():返回集合中最小的元素
E last():返回集合中最大的元素
NavigableSet
E higher(E value)
E lower(E value)
E ceiling(E value)
E floor(E value)
E pollFirst()
E pollLast()
Map接口
Map.Entry 静态内部类
K getKey()
V getValue()
V setValue(V newValue)
常用方法
Set keySet()
Collection values()
Set> entrySet()
V get(Object key)
V put(K key, V value) :向map集合中添加键值对
map集合变量.get(K hey); 根据键获取map集合中的值
String ls = map.remove("2号丈夫"); 根据键删除键对应的值,返回的是,删除的值
map.keySet();获取所有的键,返回存储Set的集合
void putAll(Map entries)
boolean containsKey(Object key)
boolean containsValue(Object value)
子类
HashMap:存储键值关联的数据结构
HashMap集合的底层原理
TreeMap:键值有序排列的映射表
TreeMap集合的底层原理
EnumMap:键值属于枚举类型的映射表
LinkedHashMap:可以记住键值添加顺序的映射表
SortedMap
K firstKey():返回最小元素
K lastKey():返回最大元素
WeakHashMap:如果值以后不再被使用则可以被GC回收的映射表
IdentityHashMap:用 == 而不是equals比较键值的映射表
Map集合的基本使用
Map集合的遍历
iterator接口
E next()
boolean hasNext()
void remove()
排序
Comparable接口
作用:让一个类实现此接口,那么这个类的集合就具有了排序功能
方法
int compareTo(T other)
Comparator接口
作用:让一个类实现此接口,这个类可以根据自己的定义的属性灵活的进行排序
方法
int compare(T a, T b)
Collections工具类
void sort(List items):对列表中的元素排序
void sort(List items, Comparator c):对列表中的元素排序
void shuffle(List items):随机地打乱列表中的元素
void shuffle(List items, Random r):随机地打乱列表中的元素
void reverse(List items):逆转列表中元素的顺序
Comparator reverseOrder():返回一个比较器
Comparator reverseOrder(Comparator c):返回一个比较器
T min(Collection items)
T max(Collection items)
T min(Collection items, Comparator c)
T max(Collection items, Comparator c)
void copy(List to, List from)
void fill(List l, T value)
boolean addAll(Collection items, T... values)
boolean replaceAll(List items, T oldValue, T newValue)
int frequency(Collection items, Object o):返回列表中与对象o相同的元素个数
boolean disjoint(Collection c1, Collection c2):如果两个集合没有共同的元素,则返回true
Collection synchronizedCollection(CollectionM c)
List synchronizedList(List c)
Set synchronizedSet(Set c)
SortedSet synchronizedSortedSet(SortedSet c)
Map synchronizedMap(Map map)
SortedMap synchronizedSortedMap(SortedMap map)
Arrays工具类
List asList(E... array):返回一个数组元素的列表视图。
二叉树
红黑树
子主题
扩展内容
小细节
可变参数
day11_Stream(流)
流程
获取流
中间操作
终结操作
Stream流练习
练习
练习1
练习2
练习3
day12_File 和 IO流
File类
创建File类对象的方式
File类创建功能
方法名
boolean newFile = dir.createNewFile();
如果文件存在,那么创建失败,返回false
如果文件不存在,那么创建成功,返回true
不管调用者有没有后缀名,只能创建文件
文件所在的文件夹必须存在
boolean mkdir = dir.mkdir();
只能创建单级文件夹,不能创建多级文件夹
不管调用者有没有后缀名,只能创建单级文件夹
boolean mkdirs = dir.mkdirs();
可以创建单级文件夹,也可以创建多级文件夹
不管调用者有没有后缀名,只能创建文件夹
三个构造方法
File(String pathname)
把String类型的字符串变成File对象
File(String pathname,String child)
把两个路径进行拼接
File(File parent,String child)
把一个File对象和String字符串进行拼接成为一个新的File对象
相对路径和绝对路径
绝对路径
绝对路径:从盘符开始的路径
绝对路径 C:\\IdeaProjects\javase\myModule\a.txt
绝对路径 C:\\IdeaProjects\javase\myModule\a.txt
File file1 = new File("E:\\IdeaProjects\\AdvancedCode\\day11_heima_IOStream\\src\\test01\\a.txt");
相对路径
相对路径: 相对于项目的根目录,下面的路径
//假设项目的根路径是C:\\IdeaProjects\javase
相对路径:myModule\a.txt
//假设项目的根路径是C:\\IdeaProjects\javase
相对路径:myModule\a.txt
File dir = new File("day11_heima_IOStream\\src\\test01\\a.txt");
File类删除功能
boolean delete = dir.delete();
删除后不能在回收站找回
如果是删除的是文件,那么直接删除,
如果删除的是文件夹,那么只能删除空文件夹
如果删除的是文件夹,那么只能删除空文件夹
如何要删除一个有内容的文件夹,只能先进入到这个文件夹,
把里面的内容全部删除完毕,才能再次删除这个文件夹
把里面的内容全部删除完毕,才能再次删除这个文件夹
File类的常用方法
创建
删除
判断
获取
public String getName()
获取文件或者文件夹的名称
获取文件或者文件夹的名称
返回由此抽象路径名表示的文件或目录的名称
如果调用者是文件,那么获取的是文件名和后缀名
如果调用者是一个文件夹,那么获取的是文件夹的名字
练习
遍历文件夹的方法
File操作文件夹练习
File类中的高级获取功能
File[] files = file.listFiles();
进入文件夹,获取这个文件夹里面所有的文件和文件夹的File对象,
并把这些File对象都放在一个数组中返回,包括隐藏文件和隐藏文件夹都可以获取
并把这些File对象都放在一个数组中返回,包括隐藏文件和隐藏文件夹都可以获取
注意事项:
当调用者不存在时
返回null
当调用者是一个文件时
返回为null
当调用者时一个空文件夹时
返回一个长度为0的数组
当调用者是一个有内容的文件夹时
将文件夹内的全部File对象返回
当调用者是一个有权限才能进入的文件夹时
返回null
练习
删除一个多级文件夹及文件
思路
先删除这个文件夹里面的所有文件内容
递归方法,在方法体中调用自己
注意:
可以解决所有文件夹里面所有内容的File对象
步骤
进入------得到file文件夹里面所有内容的File对象
遍历
判断
如果遍历得到的File对象是文件,就删除
判断
递归
删除自己
File对象的常见方法
操作
删除文件夹
思路
删除文件夹的思路:先删除里面的内容,然后再删除外面空的文件夹
IO流
分类
按流向
输入流: 读数据
输出流: 写数据
按照读写的数据类型分类
字节流:读写任意类型的文件(图片、视频、文字、游戏...)
字节输入流:InputStream,用来读取字节数据
- FileInputStream:读取文件中的字节
- BufferedInputStream: 对已有的InputStream进行包装,提高读取的效率
- BufferedInputStream: 对已有的InputStream进行包装,提高读取的效率
字节输出流:OutputStream,用来写字节数据
FileOutputStream fos= new FileOutputStream("test01\\b.txt");
如果文件不存在,会帮我们创建
如果文件存在,会清空文件
fos.write(97)
向硬盘中的b.txt文件写入数据(a)
换行
fos.write("\r\n".getBytes());
Windows换行
Linux换行
Mac换行
写数据,进行追加
FileOutputStream outStr = new FileOutputStream("test01\\b.txt",true);
- FileOutputStream: 写入文件中的字节
- BufferedOutputStream:对已有的OutputStream进行包装,提高写入的效率
- BufferedOutputStream:对已有的OutputStream进行包装,提高写入的效率
字符流
读写文本文件(用记事本打开,能看懂的就是文本文件)
包括Java文件,txt文件等
字符输入流: Reader
- FileReader
- BufferedReader
- BufferedReader
字符输出流: Writer
- FileWriter
- BufferedWriter
- BufferedWriter
学习IO流的步骤
1.创建流对象(搭桥)
2.读写数据(过桥)
3.释放资源(过河拆桥)
字节流写数据
//创建输出流对象(搭桥),需要关联一个文件
//如果文件不存在,会自动创建一个
//如果文件存在,会把原来的文件覆盖掉。
FileOutputStream fos=new FileOutputStream("myModule11\\a.txt");
//如果文件不存在,会自动创建一个
//如果文件存在,会把原来的文件覆盖掉。
FileOutputStream fos=new FileOutputStream("myModule11\\a.txt");
//写数据(过桥)
fos.write("helloworld".getBytes());
fos.write("\r\n".getBytes()); //写一个换行
fos.write("你好世界".getBytes());
fos.write("helloworld".getBytes());
fos.write("\r\n".getBytes()); //写一个换行
fos.write("你好世界".getBytes());
//写单个字节
fos.write(97); //97对应字符'a'
fos.write(97); //97对应字符'a'
//写多个字节
byte[] bs={97,98,99,100,101}; //'a','b','c','d','e'
byte[] bs={97,98,99,100,101}; //'a','b','c','d','e'
//字节数组的一部分
fos.write(bs,0,3);
fos.write(bs,0,3);
//释放资源(过河拆桥)
fos.close();
fos.close();
字节流读数据
字节流复制文件【重点】
字节缓冲流复制文件【重点】
IO流的异常处理
IO流重点掌握知识点
普通流文件复制
需求:把a.txt文件中的内容,复制到b.txt文件中
一次复制一个字节
//1.创建输入、输出流对象
FileInputStream fis = new FileInputStream("day11/a.txt");
FileOutStream fos = new FileOutStream("day11/b.txt");
//2.一边读一边写
int b; //记录每次读取的一个字节
while((b=fis.read())!=-1){
fos.write(b);
}
//3.关闭流
fos.close();
fis.close();
FileInputStream fis = new FileInputStream("day11/a.txt");
FileOutStream fos = new FileOutStream("day11/b.txt");
//2.一边读一边写
int b; //记录每次读取的一个字节
while((b=fis.read())!=-1){
fos.write(b);
}
//3.关闭流
fos.close();
fis.close();
一次复制多个字节【重点】
//1.创建输入、输出流对象
FileInputStream fis = new FileInputStream("day11/a.txt");
FileOutStream fos = new FileOutStream("day11/b.txt");
//2.一边读一边写
byte[] bs = new byte[1024];
int count; //记录每次读取的字节有效个数
while((count=fis.read(bs))!=-1){
fos.write(bs,0,count);
}
//3.关闭流
fos.close();
fis.close();
FileInputStream fis = new FileInputStream("day11/a.txt");
FileOutStream fos = new FileOutStream("day11/b.txt");
//2.一边读一边写
byte[] bs = new byte[1024];
int count; //记录每次读取的字节有效个数
while((count=fis.read(bs))!=-1){
fos.write(bs,0,count);
}
//3.关闭流
fos.close();
fis.close();
缓冲流文件复制
一次复制一个字节
//1.创建缓冲输入、输出流对象
BufferedInputStream bis =
new BufferedInputStream(new FileInputStream("day11/a.txt"));
BufferedOutputStream bos =
new BufferedOutputStream(new FileOutputStream("day11/b.txt"));
//2.一边读一边写
int b; //记录每次读取的一个字节
while((b=bis.read())!=-1){
bos.write(b);
}
//3.关闭流
bis.close();
bos.close();
BufferedInputStream bis =
new BufferedInputStream(new FileInputStream("day11/a.txt"));
BufferedOutputStream bos =
new BufferedOutputStream(new FileOutputStream("day11/b.txt"));
//2.一边读一边写
int b; //记录每次读取的一个字节
while((b=bis.read())!=-1){
bos.write(b);
}
//3.关闭流
bis.close();
bos.close();
一次复制多个字节【重点】
//1.创建缓冲输入、输出流对象
BufferedInputStream bis =
new BufferedInputStream(new FileInputStream("day11/a.txt"));
BufferedOutputStream bos =
new BufferedOutputStream(new FileOutputStream("day11/b.txt"));
//2.一边读一边写
byte[] bs = new byte[1024];
int count; //记录每次读取的字节有效个数
while((count=bis.read(bs))!=-1){
bos.write(bs,0,count);
}
//3.关闭流
bis.close();
bos.close();
BufferedInputStream bis =
new BufferedInputStream(new FileInputStream("day11/a.txt"));
BufferedOutputStream bos =
new BufferedOutputStream(new FileOutputStream("day11/b.txt"));
//2.一边读一边写
byte[] bs = new byte[1024];
int count; //记录每次读取的字节有效个数
while((count=bis.read(bs))!=-1){
bos.write(bs,0,count);
}
//3.关闭流
bis.close();
bos.close();
练习
1. 字节输出流:向文件中写入数据(FileOutputStream)
2. 字节输入流(FileInputStream)的练习
3. 字节输入流的批量读取数据
文件的拷贝
利用byte文件的拷贝
利用缓冲字节流和byte数组来拷贝文件
day13_多线程
多线程概述
多线程的实现方案
继承Thread方式
实现Runnable接口的方式
实现 Callable方式创建线程
三种线程实现方式的区别
线程的常用方法
线程安全问题
卖票案例
死锁
生产者和消费者案例
阻塞队列
day16_类加载器&反射
类加载器
反射
day17_XML
掌握
反射调用获取方法
作用
语法规则
xml的特殊字符
父主题
练习1
day18_枚举&注解&日志
枚举
枚举的常用方法
注解
单元测试(Junit)
日志
子主题
分支主题
快捷键
idea快捷键
ctrl+alt+t 选择用什么语句进行包裹
ctrl+alt+m 将选中的内容抽取为方法
ctrl+p 输入提示
Windows
计算器
win+r
calc
JavaWeb
MySQL数据库管理系统
MySQL的安装
子主题
0 条评论
下一页