本帖最后由 小石姐姐 于 2018-4-27 10:40 编辑
日常笔记
Day09笔记(IO字符输出输入流):
File 类:
是文件和目录的路径名的抽象表现形式(也就是文件和目录在Java中的形式, 既能表示文件, 也能表示目录)
File类的构造方法(创建了File对象, 并将其指向该路径. 不会在磁盘上创建这个文件)
File File(String pathname) : 使用指定的路径名创建一个File对象.
File File(String parent, String child) : 根据指定的父路径和文件路径创建File对象.
File File(File parent, String child) : 根据指定的父路径File对象和文件路径创建File对象
常用成员方法
boolean createNewFile() : 创建一个新文件. 返回是否创建成功
boolean mkdir() : 创建目录, 返回是否创建成功
boolean mkdirs() : 创建多层目录, 包括指定路径中缺少的父级目录. 返回是否创建成功
注意: 创建目录就只创建目录, 不会创建文件. 即使有a.txt也会把他作为目录名创建目录
boolean delete() : 删除文件或目录. 返回是否删除成功
注意: 删除是永久删除, 回收站没有
String getPath() : 获取创建File对象时使用的路径(创建时是相对路径则返回相对路径, 是绝 对路径则返回绝对路径)
String getAbsolutePath() : 获取File对象的绝对路径字符串
File getAbsoluteFile() : 获取包含绝对路径的File对象
String getParent() : 获取File对象的父路径字符串
File getParentFile() : 获取File对象的父路径的File对象
String getName() : 获取File对象代表的文件名或目录名(不含上层目录)
long length() : 获取File对象所表示的文件的大小, 单位byte
注意: 如果File对象是一个目录, 则返回值不确定; 如果文件不存在, 则返回0L
long lastModified() : 获取文件上次修改时间
boolean exists() : 判断文件或目录是否存在
boolean isAbsolute() : 判断File中保存的是否是绝对路径
注意: 无论该文件是否真实存在, 只判断创建File时使用的路径字符串
boolean isDirectory() : 判断该File对象是否为目录
boolean isFile() : 判断该File对象是否为文件
boolean isHidden() : 判断该文件或目录是否为隐藏的
boolean renameTo(File dest) : 修改文件名
String[] list() : 获取当前路径下所有文件和目录名称(不包括父路径). File对象必须是目录, 否则会报错
File[] listFiles() : 获取当前路径下的所有文件和目录的File对象. File对象必须是目录
static File[] listRoots() : 返回系统的所有根路径. windows系统就是各种盘符
字节流
InputStream
操作文件的子类: FileInputStream类
int read() : 读取一个字节, 读完返回-1
注意返回值是int类型, 而不是byte
int read(byte[] b) : 读取字节到数组中, 返回读取的长度. 读完返回-1
close() : 释放资源
OutputStream
操作文件的子类: FileOutputStream类
void write(byte b) : 写一个字节
void write(byte[] b, int offset, int len) : 从字节数组的指定索引开始写入指定长度个 字节
close() : 释放资源
注意: 他们读写的是: byte, byte[]
Day10笔记(IO打印转换流):
标准流
System.err: 标准错误流. (命令行输出错误信息)
System.in: 标准输入流. (键盘输入)
是InputStream类, 属于字节输入流
System.out: 标准输出流. (控制台输出)
是OutputStream的子类PrintStream, 属于字节输出流
转换流
InputStreamReader: 字节输入流转字符输入流
是Reader的子类, 属于字符输入流
OutputStreamWriter: 字符输出流转字节输出流
是Writer的子类, 属于字符输出流
特点
转换流也是包装类, 需要传入实际的输入输出流对象
打印流
PrintStream: 字节打印流
PrintWriter: 字符打印流
注意
打印是输出操作, 所以打印流只有输出, 没有输入
PrintWriter打印流的特点
可以自动换行, println(). 会根据系统自动确定换行符
不能输出字节, 可以输出其他任意类型(要输出字节需要使用PrintStream)
通过构造方法的配置可以实现自动刷新(flush)(只在调用println, printf, format时有用)
也是包装流, 自身没有写出功能
可以把字节输出流转换为字符输出流
关流不会抛出异常(此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常)
成员方法
void write(String s): 写一个字符串
void print(String s): 输出字符串, 没有换行
void println(String s): 输出字符串并换行. 如果启动了自动刷新, 则会执行自动刷新写入数据
void printf(Locale l, String format, Object... args): 使用指定格式字符串和参数将格式化的字符串写入输出流. 如果启动了自动刷新, 则
会执行自动刷新写入数据
void format(Locale l, String format, Object... args): 使用指定格式字符串和参数将格式化的字符串写入输出流. 如果启动了自动刷新, 则 会执行自动刷新写入数据
对象操作流
作用: 读写对象到文件
ObjectInputStream: 对象输入流
ObjectOutputStream: 对象输出流
注意
使用对象输出流写出对象到文件, 该文件只能使用对象输入流读取对象
只能将实现了java.io.Serializable接口的对象写入流中
Day11笔记(多线程):
多线程的概念
进程: Process, 一个应用程序在内存中的执行区域
线程: Thread, 进程中的一条执行路径
并发: 并行发生, 同时发生, 多线程就可以实现并发
同步: 注意并不是同时的意思, 同步是指一步接一步的执行, 一个执行完毕再开始执行下一个. 单线程就是同步
异步: 不是一步一步执行, 而是同时执行多步, 每个步骤何时结束不确定. 多线程就是异步
阻塞: 上一行代码正在执行, 还没有执行完毕, 程序就阻塞在这里了, 下一行代码必须等上一行不再阻塞后才能执行
单线程和多线程的特点
单线程: 同一时间只做一件事, 安全性高, 效率低
多线程: 同一时间做多个事情, 安全性低, 效率高
多线程的实现方式
1. 继承Thread类, 重写run方法
2. 实现Runnable接口(仍然是创建Thread类对象), 重写run方法
Thread类: 实现了Runnable接口
成员方法
void start(): 启动线程, 即让线程开始执行run()方法中的代码
String getName(): 获取线程的名称
void setName(String name): 设置线程名称
静态方法
static Thread currentThread(): 返回对当前正在执行的线程对象的引用
static void sleep(long millis): 让所在线程睡眠指定的毫秒
多线程中的常见问题
1. 资源共享:
共享资源定义位置: 共享资源要定义在多个线程能够共同使用的地方, 如:
多个Thread共用同一个Runnable实现类对象, 则定义为Runnable实现类的非静态成员变量
如果只用Thread子类, 则可以定义为Thread子类的静态成员变量
操作共享数据的线程安全问题: 使用同步解决
同步代码块
synchronized (锁对象) {}
锁对象
必须是多个线程共享的对象:
一个类的Class对象
如果是实现Runnable, 则可以是this
同步方法
public (static) synchronized void method() {}
锁对象
静态同步方法, 锁对象是: 方法所在类的Class对象
非静态同步方法, 锁对象是: this
Day12笔记(网络编程及UDP&TCP协议):
Socket
套接字
用于描述IP地址和端口, 是一种网络编程机制, 通信的两端都会有Socket
网络通信3要素
传输协议
IP地址
端口号
常见通信协议
UDP
它是一种无连接的不可靠协议
数据传输大小限制为64K(一个包)
不需要建立连接即可传输
数据发送速度快, 发送方只发送数据, 不检查接收方是否真正接收到数据, 所以数据有丢包的情况
这种方式适合实时性要求强的场合, 比如网络电话, 网络游戏等环境, 这种协议延迟很小
TCP
它是一种需要建立连接的可靠协议
没有数据传输大小的限制
在传输前需要先建立连接(三次握手)
它的重发机制保证了数据传输的准确性, 但因为需要接收方发回验证信息, 所以数据发送时间长, 数据流量大
这种方式适合准确性要求强的场合, 比如金融系统, 视频点播, 用户可以等待数据传输但是不能忍受错误
InetAddress类: 用于表示IP地址对象, 可以获取主机名, IP地址等信息
静态方法
static InetAddress getLocalHost(): 获取本机的InetAddress对象
static InetAddress getByName(String host): 根据主机名或IP的字符串获取主机的InetAddress对象
static InetAddress getLoopbackAddress(): 获取回环地址的InetAddress对象
成员方法
String getHostAddress(): 返回主机的IP地址
String getHostName(): 返回主机名
UDP相关类
DatagramSocket类: 基于UDP协议的Socket
构造方法
DatagramSocket(): 创建DatagramSocket对象, 随机分配端口号
DatagramSocket(int port): 创建DatagramSocket对象, 指定端口号
成员方法
void send(DatagramPacket p): 发送数据包
void receive(DatagramPacket p): 接收数据, 数据保存在DatagramPacket对象中
void close(): 关闭通信, 释放资源
DatagramPacket类: UDP数据包
成员方法
byte[] getData(): 获取包中的数据, 以byte数组形式
int getLength(): 获取数据包中数据的长度, 即byte数组的长度
int getPort(): 获取发送方端口号
InetAddress getAddress(): 获取数据包发送方的InetAddress对象
TCP相关类
Socket类: 基于TCP协议的Socket
构造方法
Socket(InetAddress add, int port)
成员方法
OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
InputStream getInputStream(): 获取输出流, 即接收数据
void close(): 释放资源
ServerSocket: TCP服务端
成员方法
Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
void close(): 关闭Socket
UDP收发数据步骤
发送端
1. 为发送端创建Socket对象(DatagramSocket):
DatagramSocket udp = new DatagramSocket();
2. 创建数据并打包:
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
3. 发送数据:
DatagramSocket对象的void send(DatagramPackage p)
4. 释放资源:
DatagramSocket对象的void close()
接收端
1. 创建接收端Socket对象:
DatagramSocket DatagramSocket(int port)
2. 接收数据
创建包对象: DatagramPacket datagramPackage(byte[] buf, int length)
接收包: DatagramSocket对象的void receive(DatagramPacket p), 该方法会阻塞等待接收数据
3. 解析数据
获取发送端信息
DatagramPacket对象的InetAddress getAddress(): 获取客户端
DatagramPacket对象的byte[] getData(): 获取数据
DatagramPacket对象的int getLength(): 获取数据长度
4. 输出数据
5. 释放资源:
DatagramSocket对象的void close()
TCP收发数据步骤
客户端
1. 创建客户端Socket对象(建立连接):
Socket Socket(InetAddress add, int port)
2. 获取输出流对象:
Socket对象的OutputStream getOutputStream()
3. 发送数据:
OutputStream对象的void write(byte[] b)
4. 释放资源:
OutputStream对象的close()
Socket对象的close()
服务端
1. 创建服务端ServerSocket对象:
ServerSocket ServerSocket(int port)
2. 监听数据:
ServerSocket对象的Socket accept(), 获取客户端Socket对象
监听时是阻塞的
3. 获取输入流对象:
Socket对象的InputStream getInputStream()
4. 获取数据:
InputStream对象的int read(byte[] buf)
5. 输出数据:
将获取的字节数组转换为String打印输出
6. 释放资源:
Socket对象的void close()方法
ServerSocket对象的void close()方法
Day13笔记(反射与JavaBean):
反射
概念: 在程序运行时, 获取任何一个类的所有属性和方法(包括私有的). 调用任意一个对象的所有属性和方法(包括私有的)
前提:
获得字节码对象
获取字节码对象的3种方法
1. 对象.getClass()
2. 类名.class
3. Class.forName(String fullClassName)
反射能干的事
获取一个类的字节码对象, 通过该字节码对象:
获取一个类的构造方法(public或全部权限的)
创建一个类的对象
获取一个类的成员属性(public或全部权限的)
获取属性值
设置属性值
获取一个类的成员方法(public或全部权限的)
调用成员方法
反射使用的相关类和方法
Class类: 类的字节码对象
获取构造方法
Constructor<?>[] getConstructors(): 以数组形式返回该类中所有public的构造方法. 如果没有public的, 则数组长度为0
Constructor<?>[] getDeclaredConstructors(): 以数组形式返回该类中所有权限的构造方法, 包括private的. 如果该类是接口, 基本类型,
数组, void, 则数组长度为0
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): 通过指定的成员变量名获取指定的所有权限的成员变量, 包括private的
获取成员方法
Method[] getMethods(): 返回所有public的方法数组
Method[] getDeclaredMethods(): 返回所有权限的方法数组
Method getMethod(String name, Class<?>... parameterTypes): 获取public的方法, 传入方法名和方法形参字节码对象
Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取所有权限的指定方法, 传入方法名和方法形参字节码对象
JavaBean
就是一个类
作用: 用于封装和存储数据
规范
类必须是public修饰的
成员变量必须是private的
必须有public的set/get方法
至少提供一个无参构造方法
实现Serializable接口(当对象需要通过IO流传输时)
Jar包
Java ARchive, 后缀名为.jar, 是一个压缩文件, 里面包含编译后的class文件和说明信息
作用: jar包中是写好的代码编译出来的class文件, 有了这些类文件, 就可以调用其中的方法
导入jar包的步骤
项目根目录下创建名为lib的目录
复制jar文件, 粘贴到项目根目录下的lib目录下
选中项目中的jar包, 右键, 选择Build Path, 点击Add to Build Path. 此时项目中的Referenced Libraries中会出现jar包名称的奶瓶, 说明已经添加成功
导入的jar包整个项目都能使用
|