打印流:
打印流写数据:
1.write(数据类型 ~):
2.print(数据类型 ~):
3.println(数据类型 ~):自动换行;
自动刷新:
PrintWriter pw=new PrintWriter(Writer out,boolean autoFlush);
刷新println,printf,format;
标准输入输出流:
System中的字段:in,out;
它们各代表了系统标准的输入和输出设备;
默认输入设备为键盘,输出设备是显示器;
System.in的类型是InputStream;
System.out的类型是PrintStream;
PrintStream是OutputStream的子类FilterOutputStream的子类;
键盘录入数据:
1.main方法的args获取参数;
2.Scanner(jdk5以后);
3.BufferedReader br=new BufferedReader(new OutputStreamReader(System.in));
随机访问流:
RandomAccessFile:
RandomAccessFile类不属于流,是Object类的子类,但它融合了InputStream和OutputStream的功能,支持对随机访问文件的读取和写入;
构造方法:
RandomAccessFile(File file,String mode):创建随机访问流,由File参数指定;
RandomAccessFile(String name,String mode):创建随机访问流,该文件具有指定名称;
mode参数允许的值及其含义:
1."r":以只读方式打开,调用结果对对象的任何write方式抛出IOException;
2."rw":打开以便读取和写入,如文件不存在,则尝试创建文件;
3."rws":打开以便读取和写入,对于"rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备;
4."rwd":打开以便读取和写入,对于"rw",还要求对文件内容的每个更新都同步写入到底层存储设备;
获取文件指针:
long getFilePointer();
seek(int ~):设置文件指针;
合并流:
Sequence InputStream:
可以将多个输入流串流在一次,合并为一个输入流,因此,该流也被称为合并流;
构造方法:
1.Sequence InputStream(InputStream s1,InputStream s2):将两个输入流合并为一个合并流 ;
2.Sequence InputStream(Enumeration <? extends InputStream> e):将多个输入流合并为一个合并流;
合并多个输入流的方式:
Vector<InputStream> v=new Vector<>();
将输入流存入Vector;
Enumeration<InputStream> en=v.elements();
将en作为参数传入构造方法2;
序列化流:
ObjectOutputStream:把对象以流的方式存入文本文件或在网络中传输;
注:对象所在类需要实现serializable接口;
反序列化流:
ObjectInputStream:把文本文件中的流对象数据或网络中的流对象数据还原成对象;
构造方法(序列化流):
protected ObjectOutputStream():
ObjectOutputStream(OutputStream on);
成员方法:
writeObject(Object obj):将指定对象写入流;
readObject():还原对象;
注意事项:
1.设置默认serialversionUID;
2.使用transient关键字声明不需要序列化的成员变量;
Properties集合:
概述:
属性集合集,是一个可以和IO流相结合的集合类,可以保存在流中或从流中加载,属性列表中每个键及其对应值都是一个字符串;
是一个Map集合;
不是泛型类;
注:Property存储的文件数据必须是键值对形式(即张三=男,李四=女);
特殊功能:
1.public Object setProperty(String key,Stringvalue):添加元素;
2.public String getProperty(String key):获取元素;
3.public set<String> PropertyNames():获取键集;
Properties和IO流的结合使用:
1.public void load(Reader reader):把文件中的数据添加到集合中;
2.public void store(Writer writer,String comment):把集合中的数据传输到文件中,comment为描述信息;
NIO包下的IO流:
NIO就是新IO的意思:
jdk4出现NIO,新IO使用内存映射文件的方式,将文件或文件的一段区域映射到内存中,就可以像访问内存一样的来访问文件了,这种方式效率比旧IO高很多;
多线程:
概述:
进程:正在运行的程序,是系统进行资源分配和调用的独立单位;
每一个进程都有它自己的内存空间和系统资源;
线程:是进程中的单个顺序控制流,是一条执行路径;
一个进程如果只有一条执行路径,该进程就是单线程程序;
一个进程如果有多条执行路径,改进程就是多线程程序;
在同一个进程内可移植性多个任务,而这每一个人物就可以看成一个线程
线程是程序的执行单位,路径,是程序使用CPU的基本单元;
存在意义:
提高应用程序的使用率;
并发和并行:
前者是物理上的同时发生,指在某一个时间点同时运行多个程序;
后者是逻辑上同时发生,指在某一个时间内同时运行多个程序;
java程序运行原理:
java命令后会启动虚拟机和jvm,等于启动了一个应用程序,也就是启动了一个进程,改进程自动生成一个主线程,然后线程去调用某个类的main方法,所以,main方法运行在主线程中,在此之前的所有程序都是单线程的;
jvm虚拟机是否是多线程:
是,至少运行了垃圾回收线程;
实现多线程:
方式1:
继承Thread类
步骤:
1.自定义类继承Thread类;
2.重写run方法;
3.创建对象;
4.启动线程(start());
方式2:
实现runnable接口;
步骤:
1.创建自定义类实现runnable接口;
2.重写run方法;
3.将实现类作为形式参数传给Thread的构造方法Thread(Runnable r,String name);
4.启动线程(start());
方式2的好处:
适合多个相同的代码去处理同一个资源的情况,把线程同程序的代码,数据有效分离,较好的体现了面向对象思想;
Thread:
成员方法:
public final String getName():获取线程的名称;
public final void setName(String name):设置线程的名称;
还可以用方式1的带参构造方法调用super(name)实现设置线程名称;
public static Thread currentThread():返回当前正在执行的线程对象;
线程调度:
线程的两种调度模式:
1.分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片;
2.抢占式调度模型(java):优先让优先级高的线程使用CPU,如果优先级相同,随机选择;
优先级:
1.public final int getPriority():返回对象的优先级;
注:线程默认优先级为5;
2.public final void setPriority(int newpriority):更改线程的优先级;
优先级范围(1-10);
线程优先级高表示获取CPU时间片几率高,但只有多次运行才能看到比较好的效果;
线程控制:
线程休眠:
public static void sleep(long millis):休眠指定毫秒数;
线程加入:
public final void join():等待线程中止;
线程礼让:
public static void yield():暂停当前线程,执行其他线程;
后台线程(守护):
public final void setDaemon(boolean on):将线程标记为守护线程或者用户线程,当剩下的线程都为守护线程时,程序自动停止;
中断线程:
public final void stop():已过时,让线程停止;
public void interrupt():中断线程,把线程的状态停止,冰刨出一个InterruptedException;
线程的生命周期:
新建:创建线程对象;
就绪:有执行资格,没有执行权;
运行:有执行资格,有执行权;
阻塞:由于一些操作让线程处于该状态;
没有执行资格,没有执行权,激活后处于就绪状态;
死亡:线程对象变成垃圾,等待被回收;
解决线程安全问题思想:
是否是多线程环境;
是否有共享数据;
是否有多条语句操作共享数据;
同步代码块:
格式:
synchronized(对象){需要同步的代码}
同步可以解决安全问题的根本原因就在那个对象上,该对象如同锁的功能;
多个线程必须是同一把锁;
前提好处弊端:
前提:
多个线程,多个线程使用的是同一个锁对象;
好处:
同步的出现解决了多线程的安全问题;
弊端:
当线程足够多时,因为每个线程都会去判断同步上的锁,很耗费资源,无形中降低了程序的运行效率;
同步代码块的锁对象:
任意对象
同步方法的格式及锁对象问题:
把同步关键字加在方法上即为同步方法;
同步方法的锁:this;
静态方法的锁:
该类的字节码文件对象;