12.17
分析:
1.指定GBK编码的转换流,读取文本文件。InputStreamReader
2.使用UTF-8编码的转换流,写入到文本文件中。OutputStreamWriter
代码示例
public class Demo01 {
public static void main(String[] args) throws Exception {
//1.使用指定GBK编码的转换流,读取文本文件。InputStreamReader
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"), "GBK");
//1.2使用UTF-8编码的转换流,写入到文本文件中,OutputStreamWriter此时默认不写就是utf-8
OutputStreamWriter ots = new OutputStreamWriter(new FileOutputStream("a.txt"), "UTF-8");
//2.使用转换流读取数据源文件
//2.1定义一个指定长度的字符数组
char[] chars = new char[1024];
//2.2定义一个变量,记录读取到的有效字符个数
int len = 0;
//2.3循环读取
while ((len = isr.read(chars))!=-1){
//读取出来的数据写入到目的地文件中
ots.write(chars,0,len);
ots.flush();
}
//3.释放资源
ots.close();
isr.close();
}
}
序列化流
Java提供了一种对象序列化的机制,用一个字节序列表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写入到文件中后,就相当于再文件中保存了一个对象信息。
反之,该字节序列还可以从文件中读取出来,重构对象,对他进行反序列化。对象的数据、对象的类型和对象中存储的数据信息,都可以用来再内存中创建对象。
ObjectOutputStream类
“java.io.objectOutputStream”类,将java对象的原始数据类型写入到文件中,实现对象的持久化存储。
构造方法
public ObjectOutputStream(OutputStream out);创建一个OutputStream的ObjectOutputStream类对象
特有的独有方法:
void writeObject(Object obj);将指定的对象写入到OutputStream类对象中。
序列化操作
1.一个对象想要能够序列化和反序列化,必须满足两个条件:
- 该类必须实现java.io.Serializable接口,Serializable接口,是一个标记型接口,如果该类没用实现Serializable接口,将会抛出NotSerializableException
- 该类的说有属性必须是可以实现序列化或者反序列化,如果有一个属性不想让它参与序列化,则该属性必须标明是瞬态的,瞬时的,这个关键字‘transient’。
public class Student implements Serializable{
private String name;
private transient Integer age;//不参与序列化
}
ObjectInputStream类
java.io.ObjectInputStream类是反序列化流,将之前使用ObjectOutputStream序列化流的原始数据恢复为对象。
构造方法
public ObjectOutputStream(InputStream in);创建一个指定的InputStream的对象反序列化流对象
特有的方法
public final Object readObject();从反序列化流中读取一个对象。
对于JVM来说,能够进行反序列化的对象,前提条件是必须能够找到class文件的类,如果找不到该类的class文件,则会抛出一个ClassNotFoundException异常。
另外,当JVM反序列化对象时,能够找到class文件,但是class文件在序列化对象时,发生了修改,那么反序列化操作会抛出一个InvalidClassException异常。原因如下:
该类的序列化版本号与从流中读取出来描述该类的版本号不一致。
该类包含了未知数据类型。
该类没用可访问的无参构造方法。
Serializable接口给需要序列化的类,提供了序列化版本号,serialVersionUID 该版本号目的就是在于验证序列化的对象和对应的类是否时版本一致的。
练习:存储一堆对象
打印流
java.io.PrintStream类能够很方便的打印各种数据。
构造方法
public PrintStream(String filename):使用指定的文件名创建一个新的打印流对象。
改变打印流的方向
正常System.out是printStream类型的,数据的流动的位置在控制台中,改变数据的流动位置,通过System.setOut(PrintStream print)来改变流向
网络编程基础
软件架构:
c/s架构:即Client/Server (客户端/服务器端)架构
B/s架构:即Browser/Server(浏览端/服务器端) 架构,
B/S架构与C/S架构的区别:
C/S架构基于局域网的,而B/S架构基于广域网的基础上
硬件环境不同,c/s建立在专用网络上,小范围的网络,可以专门的服务器提供数据链接和数据交换
C/s一般面向的固定用户群体,对信息的安全控制较高一点
对程序架构不同
用户接口不同:C/S架构大多建立在Windows平台上,B/S建立在浏览器上,不仅可以应用在Windows平台上,也可以应用在Unix/Linux等平台上
两种架构各有优劣,但是无论使用那种架构,都离不开网络的支持。网络编程,就是在一定的协议下,实现两台计算机通信的程序。
网络通信协议
网络通信协议:通信协议是计算机通信必须遵从的一种规则,协议中对数据的传输格式、传输的速率、传输的步骤都做了统一的规定,通信双方必须遵守,最终实现数据的正常传输和交换
TCP/IP:传输控制协议(TCP)/因特网互联协议(IP),他们俩定义了计算机如何联网,数据如何交换和传输的标准。它的内部包含了一系列用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫下一层锁提供的协议来完成自己的请求
协议分类
TCP协议:传输控制协议,该协议是面向链接的通信协议,即数据传输前,在发送端和接收端先建立逻辑链接,然后再传输数据,它提供了两台计算机之间可靠的无差错的数据传输。
三次握手:再数据发送的准备阶段
通过三次握手,建立连接后,客户端和服务器端就可以进行数据传输了。由于这种面向链接的特性,TCP协议能够数据传输的安全。所有应用还是挺广泛的,下载文件等
UDP:用户数据报协议,它是一个面相无连接的协议。再进行数据传输时,不需要建立链接。不管对方在不在,直接将数据、数据源和目的地封装到数据包中,发送过去,每次发送的数据不能很大,限制在64k以内,数据有可能丢失,数据传输时不安全,速度快
QQ聊天
网络编程三要素
协议:计算机通信必须遵守的一种规则。
IP地址:互联网协议地址,俗称IP,IP地址用来给网络中的计算机编订一个唯一的编号。
端口号:就是唯一标识设备中的进程(应用程序)。IP地址时唯一标识网络中的设备