本帖最后由 小石姐姐 于 2018-4-25 17:01 编辑
关于第8-13天笔记整理
IO流:
体系结构:
字节流
|_ InputStream 字节输入流
| |_ FileInputStream 专门操作文件的字节输入流
| |_ BufferedInputStream 带有缓冲区的字节输入流, 效率高
| |_ ObjectInputStream 对象输入流
|
|_ OutputStream 字节输出流
|_ FileOutputStream 专门操作文件的字节输出流
|_ BufferedOutputStream 带有缓冲区的字节输出流, 效率高
|_ ObjectOutputStream 对象输出流
|_ PrintStream 字节打印流
字符流
|_ Reader 字符输入流
| |_ BufferedReader 带有缓冲区的字符输入流, 效率高
| |_ InputStreamReader 将字节流转换为字符流输入的转换输入流
| |_ FileReader 专门操作文件的字符输入流
|
|_ Writer 字符输出流
|_ BufferedWriter 带有缓冲区的字符输出流, 效率高
|_ OutputStreamWriter 将字符流转换为字节流输出的转换输出流
|_ FileWriter 专门操作文件的字符输出流
|_ PrintWriter 字符打印流
结尾是Stream是字节流
是Writer reader的是字符流
标准流:
标准错误流:System.err
标准输入流:System.in 属于InputStream,属于字节输入流
标准输出流:System.out 属于OutputStream的子类PrintStream属于字节输出流
转换流:
InputStreamReader:字节输入流转字符输入流
是Reader的子类,属于字符输入流
OutputStreamWriter:字节输出流转字符输出流
是Writer的子类,属于字符输出流
打印流:
PrintStream:字节打印流
PrintWriter:字符打印流
PrintWriter特点:
可以自动换行,根据系统自动确定,
可以通过构造方法实现自动刷新(只有在调用println,printf,format时有用)
包装流,自身没有写出功能
可以把字节输出流转换为字符输出流
关流不会异常
构造方法:
PrintWriter (Writer out,boolean autoFlush):创建对象,同时设置是否自动刷型
PrintWriter(OutputStream out, boolean autoFlush):创建对象,同时设置是否自动刷新
打印只是输出操作,所以打印流没有输入
成员方法:
write(String s ):写一个字符串
print(String s ):输出字符串,没有换行
paintln(String s):输出字符串并换行
printf(Locale i ,String format,Object...args):使用指定格式字符串和参数将格式化的字符串写入输出流
format(Locale i,String format,Object..args):使用指定格式字符串和参数格式化的字符串写入输出流
File类:
File的概述:文件和路径名的抽象表现形式
File的常见构造方法:
File (File parent, String child):传入一个File类型的父级路径和子级路径
File(String pathname):把一个字符串路径封装成File对象
File(String parent, String child):传入一个父级路径和子级路径
路径包含相对路径和绝对路径
相对路径:不能以盘符开头,相对某个参照物
绝对路径:以盘符开头,固定不可变
File类常用的创建功能:
createNewFile();当指定路径不存在时创建文件
mkdir():创建单个文件夹
mkdirs():创建多个文件夹
删除功能: delete:删除文件或者删除单个文件夹
File类常用的判断功能:
exists():判断指定路径的文件或文件夹是否存在
isFile():判断当前路径是否是文件
isDirectory()判断路径是否是文件夹
File类常用的获取功能:
getName():获取文件或文件夹的名称,返回一个字符串
getPath():获取File对象中封装的路径
long length():返回文件的字节数
long lastModified():以毫秒值返回最后修改时间,可以通过毫秒值算出准确日期
重要获取功能:
String[] list():获取当前路径下索引的文件和目录名称,不包含父路径File对象必须是目录,否则会报错
File[] listFiles():获取当前路径下所有文件和目录的FIle对象,File对象必须是目录
static Filep[ listRoots():返回系统所有的根路径
Serializable接口:
标记接口,用于标记该类可以序列号
private static final long serialVersionUID:序列版本号,用于确定对象和类定义是否一直
InvalidCalssException用对象读取流时发生的异常原因:
该类的序列版本号与从流中读取的类描述的版本号不匹配
该类包含未知数据类型(可能添加了新的元素)
该类没有可访问的无参构造方法
读取对象异常的优化操作
在对象流中只保存了一个对象,通过该对象保存其他对象
比如用聚合存储了多个同类型的对象
定义一个类,期中包含不同类型的其他类型对象
Properties:
继承Hashtable<K,V>,实现Map<K,V>
作用:将信息以键值对方式保存到文本文件,通常作为程序的配置文件
注意:
不能存null的键和值
只能保存英文字符和符号,默认使用ISO-8859-1编码,存中文会乱码
如果配置文件保存为.txt,会变成GBK编码,可以显示中文,但是一般都存在.properties,使用ISO-8859-1,显示不了中文
构造方法:
Properties()
成员方法:
可以使用Map的方法
void list(PrintWriter out):将Propertues输出到指定的字符打印输出流,会自动添加一个listing properties --文件头
void list(PrintStream out):将Properties输出到指定的字节打印输出流,会自动添加一个listting properties---文件头
void store(Writer writer,String comments):将Properties表中的属性写入输出字符
void store(OutputStream ,String comments):将Properties表中的属性列表写入输出流
list方法和store方法的区别:
list只能接收打印流(PrintStream,PrintWriter)
store可以接收任何输出流(OutputStream,Writer)
编码表:
将计算机二进制数据转换为不同语言的字符
常见编码表:
ASCLL:美国标准码
ISO-8859-1:西方语言编码
GB2312:国标码
GBK:国标扩展码
Unicode:万国码,支持多国语言字符
UTF-8:Unicode的一种实现方法,长度可以的码表,一个字符占1个或2个字节
ANSI:本地编码表
Java String类对于字节和编码的操作
byte[] getBytes()`: 获取字符串的byte数组, 使用默认编码
byte[] getBytes(String charsetName)`: 获取字符串的byte数组, 使用指定编码
String String(byte[] bytes)`: 将byte数组转化为字符串, 使用默认编码
String String(byte[] bytes, String charsetName)`: 将byte数组转换为字符串, 使用指定编码
String String(byte[] bytes, int offset, int len, String charsetName)`: 将byte数组的一部分转换为字符串, 使用指定编码
乱码:
原因:读的编码和写的编码不一致
解决方法:保证读和写的编码一直,
处理乱码的2中方式:
1.String通过指定编码转为byte数组,然后再创建String:(GBK字符串转UTF-8字符串写入文件)
再将byte数组转换为String
写入到文件
2. OutputStreamWriter可以指定编码写入文件,免去使用String通过编码转换为byte数组的步骤
OutputStreamWriter(OutputStreamout ,StringcharasetName)
创建转换流对象,并指定编码
多线程:
线程:是程序中执行的线程,java虚拟机运行程序并发的运行多个执行线程
单线程:安全性高,效率低
多线程:安全性低,效率高
并发:并行发生,同时发生
阻塞:上一代码正在执行,还没有执行完毕,程序就阻塞在这里了,下一行代码必须等上一行不再阻塞后才能执行
同步:sync,一步接一步的执行,一个执行完毕后再执行下一个
单线程就是同步
异步:async不是一步步执行,是同时执行多步,每个步骤合适结束不确定
多线程就是同步
多线程的实现方法:
继承Thread类,重写run方法
实现Runnable接口,仍然是(创建Threa对象),重写run方法
Thread:
构造方法:
Thread Thread(): 创建Thread对象
Thread Thread(Runnable r):通过对象创建Thread对象
Thread Thread(Runnable r,String threadName):通过Runnable对象创建Thread对象,并指定线程名
成员方法:
void run():让子类重写,表示线程要执行的任务
void start():启动线程,让线程执行run()方法中的代码
String getName():获取线程的名称
void SetName():赋予线程名字
静态方法:
static Thread currentThread():返回当前正在执行的线程对象的引用
static void sleep(long millis):让所在线程睡眠指定的毫秒
多线程中的常见问题:
资源共享:
共享资源定义位置:定义在多个线程能够共同使用的地方:
多个Thread共同用一个Runnable实现类对象,则定义为Runnable实现类非静态成员
如果只用Thread子类,则可以定义为Thread子类的静态成员变量
操作共享数据的线程安全问题:使用同步解决
同步代码块:
synchronized(锁对象){
锁对象
必须是多个线程共享的对象:
一个类的Class对象
如果是实现Runnable,则可以是this
}
同步方法:
public(static) synchronized void method(){}
锁对象
静态同步方法的锁对象是:方法所在类的Class对象
非静态同步方法的锁对象是this
网络编程:
Socket:套接字
描述IP地址和端口,是一种网络编程机制,通信的两端都有Socket
网络通信的三要素
传输协议: UDP TCP
IP地址: InteAddress
端口号:port
常见的两种通信协议:
UDP:
是一种无连接不可靠的协议
数据传送大小限制为64K一个包
数据发送速度快,不管对方是否收到数据
这种协议适合实时性要求强的场合,如网络电话
TCP:
一种需要建立连接的可靠协议
传送数据没有大小的限制
它的重发机制保证了数据传送的准确性,因为需要接收对方回应验证,所以数据发送时间长,数据流量大
适合准确性要求强的场合,如金融系统
静态方法:
static InetAddress getLocakHost():获取本机的InetAddress对象
static InetAddress getByName(String host):根据主机名或IP的字符串获取主机的InetAddress对象
static InetAddress getLoopbackAddress():获取回环地址的InetAddress对象
成员方法:
String getHostAddress():返回主机的IP地址
String getHostName():返回主机名
UDP相关类:
基于UDP协议的Socket
构造方法
DatagramSocket():创建DatagramSocket对象,随机分配端口号
DatagramSocket(in port):创建DatagramSocket对象,指定端口号
成员方法:
byte[] getData():获取包中的数据
int getPort():获取发送方端口号
int getLength():获取数据包中数据的长度,即byte数组的长度
InetAddress getAddress():获取数据包发送方的InetAddress对象
TCP相关类:
构造方法:
Socket(InetAddress add,int port)
成员方法:
OutputStream getOutputStream():获取输出流对象,用于发送数据
InputStream getInputStream():获取输出流,接收数据
void close():释放资源
java.net.ServerSocket:TCP服务端
构造方法:
ServerSocket(int port)
成员方法:
Socket accpet():监听数据,会阻塞。收到数据后返回Socket对象
void close():关闭Socket
反射:
获取字节码对象的三种方法:
对象.getClass()
类名.class
Class.forName(String fullClassName)
反射:通过字节码对象获取一个类所有的属性和方法。调用任意一个对象的所有属性和方法
获取构造方法:
Constructor<?>[] getConstructors():以数组形式返回该类中所有public修饰的构造方法,如果没有,则数组长度为0
Constructor<?>[] getDeclaredConstructor(Class<?>...parameterTypes):以数组形式返回根据参数列表返回指定的所有权限构造方法。包括private修饰的。参数列表填写参数的字节码对象
Constructor<T> getConstructor(Class<?>...parameterTypes):根据参数列表返回指定的public修饰的构造方法,参数列表填写参数的字节码对象
Constructor<T>getDeclaredConstructor(Class<?>...parameterTypes):根据参数列表返回指定的所有权限的构造方法,包括private修饰的
获取成员属性值
Field[] getFields():获取所有public修饰的变量
Field[] getDeclaredFields():获取所有权限的成员变量,包括private的
Field getField(String fieldName):通过指定的成员变量获取指定的public的成员变量
Field getDeclaredField(String fieldName):通过指定的成员变量获取成员变量
获取成员方法
Method[] getMethod():返回所有public的方法数组
Method[] getDeclaredMethods():返回所有权限的方法数组
Method getMethod(String name,Class<?>...parameterTypes):获取public的方法,传入方法名和方法形参字节码对象
Method getDeclaredMethod(String name,Class<?>...parameterTypes):获取所有权限的指定方法,传入方法名和方法形参字节码对象
创建对象:
T newInstance():使用该类的无参构造创建一个对象
T newInstance(Object...ininteargs):通过有参构造方法创建一个类的对象,传入构造方法所需的参数列表:
void setAccessibie(boolean canAccess):设置为true时禁用java的访问安全检查,可以访问所有权限的构造方法
成员方法对象:
Object invoke(Object obj,Object...args):调用指定对象的成员方法
JavaBean:
JavaBean是一个用于封装和存储数据的类
规范:
类必须是public修饰的
成员变量必须是private的
必须有public的set/get方法
有一个无参构造方法
实现Serializable接口(当对象需要通过IO流传输时)
BeanUtils
Apache组织提供的第三方类库Commons中的一个组件
作用:利用反射技术给一个类的成员属性获取值,用于快速封装数据
BeanUtils类常用的三个方法:
static void setProperty(Object bean,String name,Object value):给JavaBean对象的成员属性赋值,传入对象,成员属性名,属性值
sataic String getProperty(Object bean,String name)获取JavaBean成员属性的属性值,传入对象,成员属性名,返回属性值的字符串形式
static void populate(Object bean,Map properties):给JavaBean对象的成员属性赋值,传入对象,Map的key是属性名,value是属性值
|
|