黑马程序员技术交流社区
标题: 【石家庄校区】就业班Day9-11整理资料 [打印本页]
作者: cwb.. 时间: 2018-9-28 14:08
标题: 【石家庄校区】就业班Day9-11整理资料
本帖最后由 小石姐姐 于 2018-10-11 17:22 编辑
第九天的整理笔记:
IO流的分类和功能:
字节流(byte) 字符流(char String)
分输入流(读)和输出流(写)
字节输出流格式:
FileOutputStream fos = new FileOutputStream("路径");
fos.write(字节或字节的数组);
fos.close; //释放资源
字节输入流格式:
FileInputStream fis = new FileInputStream("文件路径");
int by (数据) = fis.read(); // 一次读一个字节
int len (个数) = fis.read(数组); // 一次读一个字节数组
fis.close(); // 释放资源
读数据read方法的原理:
byte[] bytes = new byte[2]; ABCDE
read(bytes); // AB 2个字节
read(bytes); // CD 2个字节
read(bytes); // ED 1个字节
使用字节流完成文件的复制:
FileInputStream fis = ...; // 数据源
FileOutputStream fos = ..; // 目的地
int by;
while ((by = fis.read()) != -1) { //循环读写,一次写一个字节
fos.write(by);
}
//或者这种一次读写一个数组
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
close; //释放资源
使用FileWriter字符流写数据到文件:
//创建对象
FileWirter file = new FileWirter(路径);
file.write(写内容(char char[] String ) );
file.close; //释放资源
FileWriter中关闭和刷新的区别:
close(): 刷新缓冲区,并释放,不能操作流程对象
flush(): 刷新缓冲区,能操作流对象
FileWriter写数据实现换行和追加写:
windows系统:"\r\n";
追加写: boolean append构造后 传true
使用FileReader读数据:
//创建流对象
FileReader fr = new FileReader(路径);
read()
char/char[]
fr.close; //释放资源
使用FileReader读数据一次一个字符数组:
char[] chs = new char[1024];
int len;
while ((len = fr.read(chs))!=-1){}
Properties类
基本的存储方法
public Object setProperty(String key, String value) : 保存一对属性。
public String getProperty(String key) :用此属性列表中指定的键搜索属性值。
public Set<String> stringPropertyNames() :所有键的名称的集合。
day09补充总结:
IO流: Input 和 Output 数据流
输入:从硬盘文件读取到内存 输出:从内存(java程序)写入到硬盘
入和出是相对于内存说的 输入是read 输出是write
字节流:
字节输入流 InputStream
字节输出流 OutputStream
字符流:
字符输入流: Reader和FileReader:
字符输出流: Writer和FileWriter
字节流 和 字符流 如何选择:
1. 如果不确定读写的是什么类型的数据, 用字节流最通用
2. 如果确定读写的就是文本, 用字符流最方便
Properties双列集合:
键和值都是 String 类型
java.util.Properties类: 属性集, 属于Map的双列集合, 继承自Hashtable
FileWriter fw = new FileWriter("day09\\prop.txt");
// 将Properties集合中的数据, 写入到文件 store()
properties.store(fw, null);
添加流对象:
Properties properties = new Properties();
// 创建文件字符输入流对象
FileReader fr = new FileReader("day09\\prop.properties");
// 从硬盘上读取到集合: load()
properties.load(fr);
第十天的整理笔记:
使用字节缓冲流读取数据到程序:格式
BufferedInputStream bis = new BufferedInputStream(FileInputStream的对象);
bis.read( ); //读取文件
bis.close(); //释放资源
使用字节缓冲流写出数据到文件:格式
BufferedOutputStream bos = new BufferedOutputStream(FileOutputStream的对象);
bos.write() ; //写文件
bos.close(); //释放资源
字符缓冲流的作用和用法;
BufferedReader / BufferedWriter //提高基本流的读写效率
格式:
BufferedReader br = new BufferedReader (FileReader对象);
br.read(); //读取文件
br.close(); //释放资源
BufferedWriter bw = new BufferedWriter (FileWriter对象);
bw.write(); //写文件
bw.close(); //释放资源
缓冲流的特殊功能:
BufferedReader
String readLine(): 不会返回换行符
BufferedWriter
void newLine(): 可以根据系统自动确定换行符
使用转换流读取和写入指定编码的文本文件:
InputStreamReader / OutputStreamWriter
new InputStreamReader(基本流,"编码");
new OutputStreamWriter(基本流,"编码");
打印流的特点:
1.只有输出,没有输入
2.不会抛出IOException
Day10补充总结:
缓冲流
字节缓冲流
|_ BufferedInputStream # 缓冲字节输入流
|_ BufferedOutputStream # 缓冲字节输出流
字符缓冲流
|_ BufferedReader # 缓冲字符输入流
|_ BufferedWriter # 缓冲字符输出流
缓冲流的原理:
底层也是使用基本流来读写,但缓冲流内部定义了一个缓冲数组, 在读的时候类似于我们一次读一个数组的方式, 减少磁盘操作次数, 主要功能就是提高了程序效率。
转换流
java.io.Reader
|_ InputStreamReader: 转换字符输入流 byte --查指定码表--> char, char[], String
|_ FileReader byte --查UTF-8码表--> char
java.io.Writer
|_ OutputStreamWriter: 转换字符输出流 char, char[], String --查指定码表--> byte
|_ FileWriter char --查UTF-8码表--> byte
乱码原因: 读写的编码不一致
编码:字符 -> 字节 'a' -> 97
解码: 字节 -> 字符 97 -> 'a'
编码表: 字符和二进制数字的对应规则
字符集和编码表: 字符集包含编码表
ASCII字符集
ASCII编码表
ISO-8859-1字符集: Tomcat
Latin-1: 拉丁字符. 没有中文. 每个字符由1个byte组成
GB字符集
GB2312编码表: 每个字符由2个byte组成
GBK编码表: 每个字符由2个byte组成
GB18030编码表: 每个字符由1, 2, 4个byte组成
Unicode字符集
UTF-8: ASCII字符占1个byte, 拉丁字符占2个byte, 中文占3个byte, Unicode辅助字符占4个byte
UTF-16
UTF-32
ANSI: 表示使用系统默认编码表
序列化流
序列化: 内存中的对象转换为字节序列, 以流的方式写入到磁盘的文件中
对象转字节
反序列化: 磁盘文件中的字节序列, 以流的方式读取到内存中变成对象
字节转对象
通过序列化流, 我们可以将内存中的数据方便的存储到磁盘上, 下次程序启动后也能从磁盘读取恢复之前的对象状态。
OutputStream
|_ ObjectOutputStream类: 对象字节输出流
InputStream
|_ ObjectInputStream类: 对象字节输入流
注意:1、transient 修饰的成员变量, 不能被序列化。
2、被读写的对象的类, 必须实现 java.io.Serializable 接口, 否则会抛出 NotSerializableException
打印流
PrintStream特点:
1. 只有输出流, 没有输入流
2. PrintStream不会抛出IOException
3. 有特殊方法 print(), println(), 可以输出任意类型的值
构造方法
PrintStream(File file): 创建字节打印流, 输出到一个文件
PrintStream(OutputStream out): 创建字节打印流, 输出到一个字节输出流
PrintStream(String fileName): 创建字节打印流, 输出到一个文件路径
第十一天的整理笔记:
Day11
网络通信
网络通信协议概念:
通信协议是计算机必须遵守的规则, 只有遵守这些规则, 计算机之间才能进行通信.
协议中对数据的传输格式, 传输速率, 传输步骤等做了统一规定, 通信双方必须同时遵守, 最终完成数据交换
(类似于一种语言, 语法语速做了规定)
TCP/IP协议:
Transmission Control Protocol/Internet Protocol, 传输控制协议/因特网互联协议.
它定义了计算机如何连入因特网, 以及数据如何在它们之间传输的标准. 它的内部包含一系列的用于处理数据通信的协议, 并采用了4层的分层模型,
每一层都呼叫它的下一层所提供的协议来完成自己的需求
网络编程三要素:
1. 通信协议 TCP
2. IP地址
3. 端口号
UDP: User Datagram Protocol, 用户数据报协议
特点:
1. 无连接的不可靠协议
2. 数据按包发送, 64K一个包
3. 速度快效率高, 容易丢包
( 用于视频直播, 网络电话 )
TCP: Transmission Control Protocol, 传输控制协议
特点:
1. 需要建立连接的可靠协议 电话
2. 数据传输无大小限制
3. 速度慢效率低 重发机制
( 用于文件下载, 浏览网页 )
TCP通信的三次握手:
1. 客户端向服务端发送验证信息, 等待服务器确认
2. 服务端收到验证信息后, 回复客户端验证信息, 同时发自己的验证信息
3. 客户端收到服务端回复的信息, 确认自己之前发的信息无误, 并再次向服务器发回服务端的验证信息
网络编程三要素
网络编程三要素:
1. 通信协议 TCP
2. IP地址 特殊的IP地址: "127.0.0.1", "localhost", 都代表自己的电脑
3. 端口号 计算机中进程的唯一标识
取值范围: 0~65535的整数, 其中0~1024不建议使用
例如:
------ ------------- ---
协议 IP地址 端口
TCP通信
ServerSocket类: TCP服务端
构造方法
ServerSocket(int port): 创建一个TCP服务端, 并监听指定端口
成员方法
accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
close(): 关闭服务端ServerSocket
Socket类: TCP客户端
构造方法
Socket(String ip, int port): 创建TCP客户端对象
成员方法
getOutputStream(): 获取输出流对象, 用于发送数据
getInputStream(): 获取输入流, 用于接收数据
shutdownOutput(): 关闭输出流, 告知服务端数据发送完毕
close(): 关闭客户端Socket
TCP严格区分为 客户端(Client) 与 服务端(Server)
两端通信时步骤:
1. 服务端程序需要先启动, 等待客户端的连接
2. 客户端主动连接服务器端, 连接成功才能通信. 服务端不可以主动连接客户端
两端间以 "IO字节流" 进行通信、一个服务端可以和多个客户端同时通信
Day11补充总结:
TCP协议下两个常用类的名称;
客户端: Socket
服务器端: SeverSocket
编写TCP客户端:
//创建客户端Socket对象,同时指定要连接的服务端的IP地址和端口号
Socket socket = new Socket("127.0.0.1", 8888);
//获取客户端的输出流对象
OutputStream os = socket.getOutputStream();
//通过输出流对象写数据
os.write("你好,服务器".getbytes());
//接收服务器的响应
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read(bytes);
String s = new String(bytes, 0, len );
System.out.println(s );
//关闭客户端,释放资源
socket.close;
编写TCP服务器端:
//创建服务端Serversocket对象,并指定服务端监听的端口8888
ServerSocket sever = new ServerSocket(8888);
//等待客户端连接
Socket socket = server.accept();
//接收客户端发来的数据,相当于读取,获取输入流
InputStream is = socket.getInputStream();
//读取
byte[] bytes = new byte[1024];
int len = is.read(bytes);
String s = new String(bytes, 0, len);
System.out.println(s);
//向客户端回写信息,
OutputStream os = socket.getOutputStream();
os.write("收到,谢谢" . getbytes());
//释放支援
socket.close();
server.close();
文件上传案例:
客户端里边:
1. 读取磁盘图片
2. 通过网络流写出
3.通过网络流读取服务端的响应
服务器端里边:
1. 通过网络流读取上传的数据
2.写入磁盘保存图片
3.通过网络流发送响应
TCP协议下B/S案例:
客户端是浏览器
服务器端:
完成小组:"学费很贵,莫要荒废":
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |