练习:转换文件的编码
将GBK编码的文本文件转换为UTF-8编码的文件
分析
1.指定GBK编码的转换流读取文本文件InputStreamReader
2.使用UTF-8编码的转换流,写入到新文本文件中OutputStreamWriter
public class Demo01TransIOTest {
public static void main(String[] args) throws IOException {
final InputStreamReader isr = new InputStreamReader(new FileInputStream("day30_IO\\GBK.txt"), "GBK");
final OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day30_IO\\UTF-8.txt"), "UTF-8");
char[] chars = new char[1024];
int len = 0;
while ((len = isr.read(chars))!=-1){
osw.write(chars,0,len);
}
osw.close();
isr.close();
}
}
序列化流
java提供了这一种对象序列化的机制,用一个字节序列可以表示一个对象该字节序列包含该对象的数据,对象的类型和对象中存储的属性信息.
字节序列写入到文件中之后,就相当于在文件中保存一个对象信息.
反之,该字节序列还可以从文件中读取出来,重构对象,对他进行反序列化对象数据,对象的类型和对象中储存的数据信息,都可以用来在内存中创建
图:
ObjectOutputStream类
java.io.ObjectOutputStream类,将java对象的原始数据类型写入到文件中,实现对象的持久化存储
构造方法
○ public ObjectOutputStream(OutputStream out);创建一个指定的OutputStream的ObjectOutputStream类对象
特有的独有方法
○ void writeObject(Object obj);将指定的对象写入到ObjectOutputStream类对象中
序列化操作:
1.一个对象想要能够序列化和反序列化,必须满足两个条件:
§ 该类必须实现java.io.Serializable接口,Serializable接口,是一个标记型接口,如果该类没有实现Serializable接口,将会抛出NotSerializableException
§ 该类的所有属性必须是可以实现序列化或者是反序列化.如果有一个属性不想让他参与序列化,则该属性必须表明是瞬态的瞬时的,
这个关键字是transient
示例代码demo
public class Student implements Serializable {
private String name;
private transient Integer age;
}
ObjectInputStream类
java.io.ObjectInputStream类是反序列化流,将之前使用ObjectInputStream序列化流的原始数据回复为对象
构造方法
public ObjectInputStream(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就是PrintStram类型的,数据流动的位置在控制台中.该百年数据的流动位置.
§ 通过System.setOut(PrintStream print)来改变流向
控制台中:
PrintStream out = System.out;
out.print(123);
改变打印流的方向为;
PrintStream printStream = new PrintStream("day30_IO_just\\print.txt");
//使用特有方法print/println 写的数据和输出的数据和你看到的是一样的数据
System.setOut(printStream);
System.out.println("我已经改变了输出数据的目的位置");
System.out.println("我想在控制台中输出数据");
System.out.println("啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦");
网络编程基础
软件架构:
? C/S架构:即Client/Server(客户端/服务器端)架构, QQ\迅雷\
? B/S架构:即Browser/Server(浏览器端/服务器端)架构,简化了心痛的开发维护与使用 谷歌浏览器\火狐浏览器
B/S架构与C/S架构的区别
? C/S架构基于局域网的,B/S架构基于广域网的基础上
? 硬件环境不同,C/S建立在专用网络上,小范围的网络,可以通过专门的服务器提供数据连接和交换
? C/S架构一般面向的是固定的用户群体,对信息的安全控制较高一点
? 对程序的架构不同
? 用户的接口不同C/S架构大多建立在windows平台上,B/S建立在浏览器上,不仅可以应用在windows平台上,也可以应用在Linux/Unix等平台上
两种架构各有优略,但是无论使用那种架构,都离不开网络支持,网络编程,就是在一定的协议下,实现两台计算机通信的协议
网络通信协议
网络通信协议:通信协议是对计算机通信必须遵从的一种规则,该协议中他对数据的传输的格式,传输的速率.传输的步骤都做了统一的规定
通信双方必须同时遵守,最终实现数据的正常传输和交换.
TCP/IP 传输控制协议(TCP)/因特网互联协议(IP),他们俩定义了计算机如何联网,数据如何交换.和传输的标准,他的内部包含了一系列用于处理通信数据通信的协议 每一层都呼叫下一层所提供的协议来完成
协议分类:
图
? TCP协议:传输控制协议,该协议是面向连接的通信,协议,即数据传输前,在发送端和接收端先建立逻辑链接,然后再传输数据,
它提供了多台计算机可靠的无差的数据传输
? 三次握手:在数据的发送准备阶段客户端和服务器之间通过三次交互保证连接的可靠性
三次握手
图:
通过三次握手,建立客户端与服务器端就可以进行数据传输了.由于面向连接的特性TCP协议能够保证数据传输的安全.所以应用听广泛的,下载文件等
? UDP:用户数据报协议(User DataProtocal),面向无连接的协议.在数据传输的时,不需要建立连接.不管对方在不在,直接将数据源和目的地封装到数据包中,
发送过去.每次放松的数据不是很大,限制在64k以内,数据有可能丢失,数据传输时不安全,速度快,QQ聊天
网络编程三要素 [了解]
○ 协议:计算机通信必须遵守的规则
○ IP地址:互联网协议地址,俗称IP,IP地址用来给网络中的计算机编定一个唯一的编号.
○ 端口号:就是唯一标识设备中的进程(应用程序).IP地址时唯一标识网络中的设备.