黑马程序员技术交流社区
标题:
【石家庄校区】JAVAIO流 & 多线程 &网络编程 &反射
[打印本页]
作者:
ayangjianling
时间:
2018-4-23 15:26
标题:
【石家庄校区】JAVAIO流 & 多线程 &网络编程 &反射
本帖最后由 小石姐姐 于 2018-4-25 16:53 编辑
IO流
标准输入输出流概述
类字段:
静态成员变量
System 类的类字段
err : 标准错误输出流. 命令行输出错误信息
是PrintStream, OutputStream 的子类, 属于字节输出流.
in : 标准输入流. 键盘输入
是 InputStream 类, 属于字节输入流. InputStream in = System.in;
out : 标准输出流. 将数据输出到控制台
是PrintStream, OutputStream 的子类, 属于字节输出流. OutputStream out = System.out;
OutputStreamWriter概述和使用: 文件内容打印到控制台
OutputStreamWriter 类:
是 Writer 的子类, 属于字符输出流. 是字符流通向字节流的桥梁
作用: 以写出字符流的方式编写代码(char, char[], String), 而底层以字节流写出到文件(byte, byte[]) // 转换的作用
InputStreamReader的概述和使用: 控制台录入到文件
InputStreamReader 类
是 Reader 的子类, 属于字符输入流. 是字节流通向字符流的桥梁
作用: 以读取字符流的方式编写代码(char, char[], String), 而底层以字节流读取(byte, byte[])
打印流概述
打印流分类
PrintStream : 字节打印流
PrintWriter : 字符打印流, 我们学的
只有输出流, 因为打印是输出操作
打印流特有功能
PrintWriter类
构造方法
PrintWriter PrintWriter(String filepath) : 创建对象
PrintWriter PrintWriter(Writer out, boolean autoFlush) : 包装字符输出流创建对象, 同时设
置是否自动刷新
PrintWriter(OutputStream out, boolean autoFlush) : 包装字节输出流创建对象, 同时设置是否
自动刷新
成员方法
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) : 使用指定格式字符串和参数将格式化
的字符串写入输出流. 如果启动了自动刷新, 则会执行自动刷新写入数据
Object readObject() : 从对象输入流读取对象, 一次只读取一个对象. 当读不到时抛出
EOFException .
ObjectOutputStream
构造方法
ObjectOutputStream(OutputStream out) : 创建对象输出流
成员方法
void writeObject(Object o) : 将对象写入对象输出流
对象操作流概述
对象操作流 (都属于字节流)
ObjectInputStream
构造方法
ObjectInputStream(InputStream in) : 创建对象输入流
成员方法
Object readObject() : 从对象输入流读取对象, 一次只读取一个对象. 当读不到时抛出
EOFException .
ObjectOutputStream
构造方法
ObjectOutputStream(OutputStream out) : 创建对象输出流
成员方法
void writeObject(Object o) : 将对象写入对象输出流
java.io.Serializable 接口:
没有成员, 是一个标识接口
用于序列化
序列化: 将对象的信息转换为可存储的信息的过程
Properties概述
Properties概述
java.util.Properties
构造方法
Properties() : 创建对象
成员方法
可以使用Map接口的方法
String getProperty(String key) : 根据键获取值. 如果找不到该键, 则返回null
String getProperty(String key, String defaultValue) : 根据键获取值, 如果值不存在, 则使用
指定的默认值
void setProperty(String key, String value) : 设置键值对
继承了 Hashtable<K, V> , 实现 Map<K,V> 接口, 以键值对方式存储数据
Properties和IO流结合的功能
Properties类常用方法
从配置文件中加载到Properties集合
void load(InputStream in) : 从字节输入流中读取Properties
void load(Reader reader) : 同上, 只是流不同
从Properties集合写出到配置文件
void list(PrintStream out) : 将Properties输出到指定的字节打印输出流.
会自动加一个 -- listing properties -- 文件头
void list(PrintWriter writer) : 同上, 只是流不同
会自动加一个 -- listing properties -- 文件头
void store(Writer writer, String comments) : 将Properties输出到指定的输出流, 并添加一个
注释. 如不想增加注释可填写null.
无论是否有注释, 都会自动添加时间字符串
void store(OutputStream os, String comments) : 同上, 只是流不同
无论是否有注释, 都会自动添加时间字符
list() 和 store() 的区别
list只能接收打印流(PrintStream, PrintWriter)
store可以接收任何输出流(OutputStream, Writer)
Java中字符串的编码
编码:
是字节(byte)转换为字符(char)过程中的操作, 读写文本数据, 都要查询编码表
编码表:
保存数字和字符对应关系的表, 也称为 字符集(charset)
Java中的字符串的默认编码
ANSI 编码, 即当前系统是什么编码就是什么编码
String类中常用方法
构造方法
String(byte[] bytes) : 将byte数组转化为字符串, 使用默认编码
String(byte[] bytes, String charsetName) : 将byte数组转换为字符串, 使用指定编码
String(byte[] bytes, int offset, int len, String charsetName) : 使用指定编码, 将byte数组
的一部分转换为字符串
成员方法
byte[] getBytes() : 获取字符串的byte数组, 使用默认编码
byte[] getBytes(String charsetName) : 获取字符串的byte数组, 使用指定编码
多线程
进程:当前正在运行的程序,一个应用程序在内存中的执行区域
线程:进程中的一个执行控制单元,执行路径
一个进程可以有一个线程也可以有多个线程
单线程:安全性高,但是效率低(同一时间只做一件事)
多线程安全性低,效率高(同一时间做很多事)
并发:并行发生,同时发生多线程就可以实现并发
同步:sync 不是同时的意思,同步是指一步接一步的执行 一步执行完在执行下一步 单线程就是同步
异步: async 不是一步一步执行,而是同时执行多步 多线程就是异步
多线程的实现方式:
创建线程的第一种方式: 继承Thread类
java.lang.Thread 类: 实现了 Runnable 接口
构造方法
Thread Thread() : 创建Thead对象
Thread Thread(Runnable r) : 通过Runnable对象创建Thread对象
Thread Thread(Runnable r, String threadName) : 通过Runnable对象创建Thread对象并指定线
程名
成员方法
void run() : 用于让子类重写, 表示该线程要执行的任务. 不能直接调用
void start() : 启动线程, 即让线程开始执行 run() 方法中的代码
String getName() : 获取线程的名称
void setName(String name) : 设置线程名称
静态方法
static Thread currentThread() : 返回对当前正在执行的线程对象的引用
static void sleep(long millis) : 让所在线程睡眠指定的毫秒
创建线程的第二种方式: 实现Runnable接口
多线程中的线程安全问题: 使用同步代码块解决共享资源的问题
同步: 使用 synchronized 关键字:
格式: synchronized (锁对象) {
// 要同步执行的代码
}
同步方法:
synchronized 修饰的方法
网络编程
netstat -an 命令查看端口号
Ip地址:InetAddress
静态用类名调用
1. 为发送端创建Socket对象(DatagramSocket)
DatagramSocket datagramSocket = new DatagramSocket();
// 2. 创建数据并打包
DatagramPacket datagramPacket = new DatagramPacket(byte数组, 数组长度, InetAddress对象, 端口号);
// 3. 发送数据 datagramSocket.send(datagramPacket);
// 4. 释放资源 datagramSocket.close();
// 1. 创建客户端Socket对象(建立连接)
Socket socket = new Socket(InetAddress地址, 端口号);
// 2. 获取输出流对象
OutputStream outputStream = socket.getOutputStream();
// 3. 发送数据 outputStream.write(byte数组);
// 4. 释放资源 socket.close();
// 1. 创建服务端ServerSocket对象:
创建服务端ServerSocket对象
ServerSocket serverSocket = new ServerSocket(端口号); // 指定要监听的端口号 // 2. 监听数据
Socket socket = serverSocket.accept(); // 该方法会阻塞, 直到有客户端连接 // 3. 获取输入流对象
InputStream inputStream = socket.getInputStream(); // 4. 获取数据 int dataLength = inputStream.read(装数据的byte[]数组); String s = new String(byte[], 0, dataLength);
// 5. 输出数据
System.out.println(s);
// 6. 释放资源:
socket.close(); serverSocket.close();
反射
反射:在运行时,我们可以获取任意一个类的所有方法和属性
在运行时,让我们调用任意一个对象的所有方法和属性
获取构造方法
Constructor<?>[] getConstructors() : 以数组形式返回该类中所有public的构造方法.
如果没有public的, 则数组长度为0
Constructor<?>[] getDeclaredConstructors() : 以数组形式返回该类中所有权限的构造方 法, 包括private的. 如果该类是接口, 基本类型, 数组, void, 则数组长度为0 Constructor<T> getConstructor(Class<?>... parameterTypes) : 根据参数列表返回指定 的public的构造方法. 参数列表填写参数的字节码对象 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) : 根据参数列 表返回指定的所有权限的构造方法, 包括private的. 参数列表填写参数的字节码对象 创建对象
T newInstance() : 使用该类的无参构造创建一个对象 java.lang.reflect.Constructor 类: 构造方法对象 T newInstance() : 通过无参构造方法对象创建一个类的对象 T newInstance(Object... initargs) : 通过有参构造方法对象创建一个类的对象, 传入构造方 法所需的参数列表
void setAccessible(boolean canAccess) : 设置为true时禁用Java的访问安全检查, 可以访问所有 权限的构造方法
反射获取public成员变量: 设置和获取值
java.lang.Class 类中的获取成员变量的方法:
Field[] getFields() : 获取所有public的成员变量
Field[] getDeclaredFields() : 获取所有权限的成员变量, 包括private的 Field getField(String fieldName) : 通过指定的成员变量名获取指定的public的成员变量 Field getDeclaredField(String fieldName) : 通过指定的成员变量名获取指定的所有权限的成 员变量包括private的
java.lang.reflect.Field 类: 成员变量对象
Object get(Object obj) : 获取指定对象的属性值. 传入对象, 返回该对象的属性值 void set(Object obj, Object value) : 将指定对象的属性值设置为指定的值. 传入对象和属性值 void setAccessible(boolean canAccess) : 设置为true时禁用Java的访问安全检查, 可以访问所有权限 的成员属性
反射获取私有成员变量并修改
获取成员方法
Method[] getMethods() : 返回所有public的方法数组
Method[] getDeclaredMethods() : 返回所有权限的方法数组 Method getMethod(String name, Class<?>... parameterTypes) : 获取public的方法, 传入方法名和方法形参字节码对象
Method getDeclaredMethod(String name, Class<?>... parameterTypes) : 获取所有 权限的指定方法传入方法名和方法形参字节码对象 java.lang.reflect.Method 类: 成员方法对象
Object invoke(Object obj, Object... args) : 调用指定对象的成员方法
获取class字节码的三种方式:
1.对象.newInstance() -- getclass()
2.类名.class对象
3.class对象.forname("com.itheimao1.student")
JavaBean:
概念: 就是一个类
作用: 封装数据
规范: 类必须是public修饰
通过private的成员变量保存数据
通过public的get/set方法操作数据
至少提供一个无参构造方法
实现Serializable接口(用于使用IO流传输对象到文件或网络) BeanUtils概述和jar包
作用:
利用反射技术给一个类的对象的成员属性赋值或获取值, 用于快速封装数据到JavaBean } }
使用BeanUtils所需jar包
commons-beanutils
commons-logging
BeanUtils的常用方法
org.apache.commons.beanutils.BeanUtils 类
常用静态方法
static void setProperty(Object bean, String name, Object value) : 给对象的成员属性 赋值传入对象, 成员属性名, 属性值
static String getProperty(Object bean, String name) : 获取对象成员属性值. 传入对象, 成员 属性名, 返回属性值的字符串形式
static void populate(Object bean, Map properties) : 批量给对象的成员属性赋值, 传入 对象Map的key是属性名, value是属性值
自定义BeanUtils的赋值和获取方法实现
我们自己定义就直接通过反射操作Field即可
私有构造方法
定义2个静态方法
static void setProperty(Object bean, String name, Object value) static String getProperty(Object bean, String name)
beanutils:Apache commons提供的一个组件,主要功能就是为了简化javabean封装数据的操作 不是直接操作成员变量,而是操作和成员变量名有关的get和set方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2