合并流 — SequenceInputStream
功能: 可以把多个文件读成(合并)成一个流
需要使用到 Vector的特殊迭代器 该Vector中保存的是InputStream的子类
例
File f1 = new File("/Users/lanou/Desktop/Test/1.txt");
File f2 = new File("/Users/lanou/Desktop/Test/2.txt");
File f3 = new File("/Users/lanou/Desktop/Test/3.txt");
Vector<FileInputStream> vector = new Vector<>();
vector.add(new FileInputStream(f1));
vector.add(new FileInputStream(f2));
vector.add(new FileInputStream(f3));
Enumeration<FileInputStream> elements = vector.elements();
SequenceInputStream sis = new SequenceInputStream(elements);
FileOutputStream fos =
new FileOutputStream("/Users/lanou/Desktop/Test/4.txt");
byte[] b = new byte[1024];
int len = 0;
while ((len = sis.read(b)) != -1) {
fos.write(b, 0, len);
}
sis.close();
fos.close();
多线程
进程: 一个正在运行的程序(独立运行的程序)
进程中可以有单个线程 — 绝对安全 程序由上至下依次执行 效率不高
也可以有多个线程
线程: 相当于一个CPU的执行路径(大大提升了处理效率)
一个独立的运行单元
分时调度: CPU在不同线程之间进行切换
抢夺资源: 改变线程的优先级
并发执行: 同时进行
代码开启线程
JVM调用main方法 —> 找操作系统(CPU) —> 开启一个执行路径
main就是一个线程 main是线程的名字 又叫主线程
开启线程的两个方法
1.将类声明为 Thread 的子类
class MyThread extends Thread{
public MyThread() {
super();
// TODO Auto-generated constructor stub
}
public MyThread(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
// 获取当前线程名字 getName()
System.out.println(getName() +"--"+ i);
}
}
}
2.声明实现 Runnable 接口的类
class MyThreadTwo implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
// 获取当前线程名字 Thread.currentThread().getName()
System.out.println
(Thread.currentThread().getName() + "--" + i);
}
}
}
分别在main函数中创建
// 创建线程 1
MyThread mt = new MyThread("线程1");
mt.start();
// 创建线程 2
MyThreadTwo mtt = new MyThreadTwo();
Thread thread = new Thread(mtt, "线程2");
thread.start();
}
注意: 在main函数中创建线程时 直接调用线程中的fun()
方法 相当于把线程当成一个普通函数 是不会创建出线程的 需要用start()
方法才会创建出线程
在创建线程的方法1中 因为是继承Thread的 而构造方法又不能被继承 所以在给线程1附上名字的时候 需要在进程1的方法中重写构造方法才能附上名字