IO流
/水流
/电流
字节流:
- InputStream
- OutputStream
字符流:
- Reader
- Writer
输入流
输出流
File
文件和目录路径名的抽象表示形式
用户界面和操作系统使用与系统相关的路径名字符串 来命名文件和目录
“E://DNF/File/a.txt”
无论是抽象路径名还是路径名字符串,都可以是绝对路径名或相对路径名
绝对路径:
相对路径:…/图解/1.png
file类的实例是不可变的
也就是说,一旦创建,file对象表示的抽象路径名将永不改变。
构造器:
File(File parent,String child)
根据parent抽象路径名和child路径名字符串创建一个新File实例
Flie(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新File实例
File(String parent,String child)
根据parent路径名字符串和child路径名字符串创建一个新File实例
方法:
创建功能:
mkdir();创建 单层目录
mkdirs();创建多层文件目录
createNewFile()当文件不存在时进行创建新的文件
判断功能:
isFile();判断是否文件
isDirectory();判断是否文件夹
exists();测试此抽象类路径名表示的文件或目录是否存在
canWrite();是否可写
canRead();是否可读
获取功能:
File getAbsoluteFile();返回此抽象路径名的绝对路径名形式
String getAbsoluePath();返回此抽象路径名的绝对路径名字符串
getName(); 返回由此抽象路径名表示的文件或目录的名称。
length(): 长度
getPath(): 获取路径的字符串
lastModified() : 返回此抽象路径名表示的文件最后一次被修改的时间。
list(): 返回文件夹中文件和文件的名称。
listFiles(): 文件的抽象路径实例。
删除功能:
delete: 删除文件,删除空的文件夹。
重命名:
renameTo(File dest): 重新命名此抽象路径名表示的文件
字节流:
InputStream:
此抽象类是表示字节输入流的所有类的超类
read()
OutputStream:
write();
write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
此抽象类是表示输出字节流的所有类的超类。
FileInputStream:
FileInputStream 用于读取诸如图像数据之类的原始字节流
read(): 下一个数据字节;如果已到达文件末尾,则返回 -1。
read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
close() 关闭此文件输入流并释放与此流有关的所有系统资源。
使用read 一个一个字节去读取和写入速度太慢了。
所以使用数组来转入读取的数据:
byte [] by = new byte[1024];
int len = 0;
while(( len = inputStream.read(by))!=-1) {
//将数组中的数据写入目标文件
// outputStream.write(by);
System.out.println(len);
//将数组中的数据写入文件,有多少写多少(根据数组的内容实际长度决定)
进程:
正在运行的程序,是系统运行和资源调度的独立单位。
每一个进程都有自己的内存空间和系统资源。
由系统开辟内存空间运行的程序。
线程:
是进程中的单个顺序的控制流程是一条执行路径。
一个进程如果只有一条执行路径称之为单线程。
一个进程有多个执行路径称之为多线程。
由进程开辟空间,运行在进程中的任务。
一个进程至少有一个线程。
多线程:
一个进程中有多个线程。
java 中我们学习多线程。但是java并没有多线程的东西。
我们java中多线程其实是调用C/C++写好的多线程的内容.
学习多线程的第一步:
1.开辟一个进程。
2. 在进程中开辟线程。
main 方法是单线程。
多线程创建方式:
创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。
该子类应重写 Thread 类的 run 方法。
一般我们在多线程中去运行的代码比较复杂,简单的代码不会加入到多线程中去。
多线程的思想:(单核的电脑上)
电脑 在运行多个程序的时候,CPU(原子性)。
交叉运行程序。
start() : 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
sleep(); 线程睡眠 毫秒数
setName()设置线程的名字
getName()获取线程的名字。
currentThread() : 返回对当前正在执行的线程对象的引用。
多线程是对资源实现共享吧。
多线程实现的第二种方式:
创建线程的另一种方法是声明实现 Runnable 接口的类。
该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动
实现Runnable 接口:
重写run方法
再去通过线程的类态进程多线程操作。
线程的操作:
线程不能重复启动。
start 和 run的区别:
yield() :线程礼让
stop(): 线程停止 太暴力了
sleep():线程休眠
join(): 线程等待终止
interrupted : 线程中断
wait(): 线程等待
notify: 线程唤醒
notifyAll()
多线程的安全问题:
现在对同一资源共享出现0票?
1. 有资源共享
2. 多线程抢占统一资源。
3. 网络延迟
怎么解决:
加锁:
java中关键字: synchronized 同步
我们还需要锁。
锁有这么几种情况
1. 任意锁 synchronized(任意对象) 解决不了安全问题
2. 使用this 作为锁
3.同步方法的锁是this 关键字
数据的操作
方法摘要
方法 | 解释 |
---|---|
delete from (表名) where (字段名) = (值); | 删除数据 |
update (表名) set (字段名)=(值) where id = (值); | 修改数据 |
select (字段1),(字段2) from (表名); | 查询多个字段数据 |
select * from (表名) where (字段)=(值) and (字段)=(值) |
复合查询,多个条件 |
select * from (表名) where (字段)=(值) or (字段)=(值) |
任意条件查询 |
select distinct (字段),(字段) from (表名) | 去重查询(一个字段或多个字段都可以) |
select * from (表名) where (字段) like “%(关键字)%” | 模糊查询 |
select * from (表名) where (字段) like “___(关键字)” | 占位符查询(占几位就打几个“_”) |
1.删除数据
删除数据:当数据删除后,再次添加进表的数据id会随着上一次自增后的值+1,而不是替换了被删除数据的id
mysql> select * from student;
+----+-------+---------+--------------+------+
| id | name | address | email | age |
+----+-------+---------+--------------+------+
| 1 | admin | 西安 | 1234@qq.com | 18 |
| 2 | joke | 北京 | 1224@qq.com | 22 |
| 3 | joke | 上海 | 1224@126.com | 22 |
| 4 | admin | 上海 | 1231@126.com | 32 |
| 5 | jumn | 北京 | 1230@qq.com | 19 |
| 6 | 张三 | 南京 | 123@103.com | 26 |
| 7 | mnum | 西安 | 123@163.com | 26 |
+----+-------+---------+--------------+------+
7 rows in set (0.00 sec)
mysql> delete from student where id = 6;
Query OK, 1 row affected (0.02 sec)
mysql> select * from student;
+----+-------+---------+--------------+------+
| id | name | address | email | age |
+----+-------+---------+--------------+------+
| 1 | admin | 西安 | 1234@qq.com | 18 |
| 2 | joke | 北京 | 1224@qq.com | 22 |
| 3 | joke | 上海 | 1224@126.com | 22 |
| 4 | admin