笔记-迎难而上之Java基础进阶7
序列化流
把对象以流的方式写入到文件中保存,叫做对象的序列化
把文件中保存的对象,以流的方式读取出来,叫做对象大反序列化
对象的序列化流_objectoutputtream继承自outputstream
作用:把对象以流的方式写入到文件中保存
构造方法:
objectoutputstream(outputstream out)
特有成员方法:
void writeobject(object obj) 将指定的对象写入objectoutputstream
//做序列化需要对象,该对象还得实现serializable接口 import java.io.*; public class person implements serializable{ //被transient关键字修饰的成员变量无法被序列化 //假如string name 被transient修饰那么在写入对象的时候name 写入为null private string name; private int age; public person(){} public person(string name,int age){ this.name=name; this.age=age; } public string tostring(){ string str = "姓名 "+name+" 年龄"+age; return str; } public void setname(string name ){ this.name=name; } public string getname(){ return name; } public void setage(int age){ this.age=age; } public int getage(){ return age; } }
import java.io.*; public class objectoutputstreamdemo{ public static void main(string[] args) throws ioexception{ //创建objectoutputstream对象,构造方法中传递字节输出流 //字节输出流fileoutputstream绑定写入对象地址 objectoutputstream oos = new objectoutputstream(new fileoutputstream("e:\\study\\demo14\\a.txt")); //调用方法writeobject,写入对象 oos.writeobject(new person("新垣结衣",18)); oos.writeobject(new person("石原里美",20)); //写出结果 // sr person篝9'?l$ i agel namet ljava/lang/string;xp t 鏂板灒缁撹。sq ~ t 鐭冲師閲岀編 oos.close(); } }
对象的反序列化流量_objectinputstream
构造方法:
objectinputsteam(inputstream in)
特有成员方法:
object readobject()
//反序列化的前提是读取的类必须存在class文件,必须实现serializable接口 import java.io.*; public class objectinputstreamdemo{ public static void main(string[] args) throws ioexception,classnotfoundexception{ //创建objectinputstream对象 objectinputstream ois = new objectinputstream(new fileinputstream("e:\\study\\demo14\\a.txt")); //方法readobject的返回值是object object o = ois.readobject(); object o1 = ois.readobject(); ois.close(); system.out.println(o); system.out.println(o1); } }
被transient修饰的name
序列化集合
import java.io.*; import java.util.*; public class testdemo{ public static void main(string[] args) throws exception{ //序列化集合,创建一个集合 arraylist<person> list = new arraylist<>(); //添加元素 list.add(new person("林黛玉",18)); list.add(new person("贾宝玉",20)); list.add(new person("孙悟空",15)); list.add(new person("猪八戒",22)); //创建objectoutputstream序列化流 objectoutputstream oos = new objectoutputstream(new fileoutputstream("e:\\study\\demo14\\b.txt")); //序列化流对象 oos.writeobject(list); //创建objectinputstream序列化流 objectinputstream ois = new objectinputstream(new fileinputstream("e:\\study\\demo14\\b.txt")); //反序列化 object o = ois.readobject(); //强制把object类型转换成arraylist类型 arraylist<person> list1= (arraylist<person>)o; //遍历集合 for(person p : list1){ string str = p.getname()+" "+p.getage(); system.out.println(str); } } }
打印流
printstream的特点:
- 只负责数据的输出,不负责数据的读取
- 与其他输出流不同,printstream 永远不会抛出 ioexception
- 有特有的方法,print,println
构造方法:
printstream(file file):输出的目的地是一个文件
printstream(outputstream out ):输出的目的地是一个字节输出流
printstream(string filename) :输出的目的地是一个文件路径
import java.io.*; public class printstreamdemo{ public static void main(string[] args) throws ioexception{ //创建打印流printstream对象 //绑定输出的目的地 printstream ps = new printstream("e:\\study\\demo14\\print.txt"); //如果调用父类继承过来的write,查看数据时候,会查询编码表 ps.write(97);//输出结果是a //调用自己特有的方法 ps.println("云想衣裳花想容");//a云想衣裳花想容 //printstream 类与stream类结合可以改变输出语句的目的地 system.out.println("我在控制台输出"); //system类的方法setout可以改变输出语句的目的地 //方法传递的参数是打印流printstream(这个打印流要绑定输出地址) //创建一个打印流,并且绑定输出地址 printstream ps1 = new printstream("e:\\study\\demo14\\目的地打印流"); //调用system的方法setout //静态方法直接调用,传递参数是打印流 system.setout(ps); system.out.println("我现在在目的地中输出了"); } }
网络编程
软件结构
c/s结构:全称为client/server结构,是指客户端和服务器结构,常见程序有qq 迅雷,网盘,可以通过客户端发来访问服务器
b/s结构:全称为browser/server,是指浏览器和服务器的结构,常见浏览器有谷歌,火狐,可以通过输入网址来访问服务器
网络编程就是在一定的协议下,实现两台计算机的通信程序
ip地址:指互联网协议地址俗称ip,ip地址用来给一个网络中的计算机设备做唯一的编号,ip地址分为ipv4和ipv6
端口号:用两个字节表示的整数,他的取值范围是0-65535。其中0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。
我们通过ip地址加端口号,就可以保证数据准确无误的发送到对方计算机的指定软件上了
tcp协议
tcp通信:面向连接的通信,客户端和服务器必须经过三次握手,建立逻辑连接,才能通信(安全)
在服务器端有一个方法,叫accept客户端获取到请求的客户端你对象,客户端与服务器进行交互,需要使用到多个io流对象,服务器是没有io流的,服务器可以获取到请求的客户端对象socket使用每个客户端的socket中提供的io流和客户端进行交互
tcp通信的客户端代码实现
socket:此类实现客户端套接字,套接字是两台机器通信的端点
套接字:包含了ip地址和端口号的网络单位
构造方法:socket(string host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号
成员方法:
outputstream getoutputstream() 返回此套接字的输出流
inputstream getinputstream() 返回此套接字的输入流
void close() 关闭此套接字
serversocket:此类实现服务器套接字
构造方法:serversocket(int port) 创建绑定到特定端口的 服务器套接字
成员方法:
socket accept()侦听并接收到此套接字的连接
import java.io.*; import java.net.*; public class tcpclient{ public static void main(string[] args) throws exception{ //创建一个客户端对象soket,构造方法绑定服务器的ip地址和端口号 //构造方法一执行就会与服务器进行连接 socket socket = new socket("127.0.0.1",5555); //要向服务器写数据,得先获取网络字节流 //socket中的方法getoutputstream可以获取字节输出流 outputstream os = socket.getoutputstream(); //调用outputstream对象的方法write,给服务器发送数据 string str = "云想衣裳花想容t"; byte[] bytes = str.getbytes(); os.write(bytes); //读取服务器发送回来的数句 //首先需要一个网络字节输入流 inputstream is = socket.getinputstream(); //使用网络字节输入流inputstream对象中的方法read,读取客户端发送的数据, byte[] bytes1 = new byte[1024]; int len = is.read(bytes1); system.out.println(new string(bytes1,0,len)); os.close(); socket.close(); } }
import java.io.*; import java.net.*; public class tcpserver{ public static void main(string[] args) throws exception{ //创建服务器serversocket对象 serversocket ss = new serversocket(5555); //serversocket类中的方法accept可以获取到请求的客户端对象socket //返回值是socket,也就是说可以调用socket类中的网络流方法 socket socket = ss.accept(); //使用socket对象的方法getinputstream();获取网络字节输入流 //getinputstream流返回值是一个输入流inputstream inputstream is = socket.getinputstream(); //使用网络字节输入流inputstream对象中的方法read,读取客户端发送的数据, byte[] bytes1 = new byte[1024]; int len = is.read(bytes1); system.out.println(new string(bytes1,0,len)); //获取网络字节输出流对象 outputstream os = socket.getoutputstream(); //调用outputstream对象的方法write,给服务器发送数据 string str = "春风扶槛露华浓"; byte[] bytes = str.getbytes(); os.write(bytes); } }
文件上传案例
import java.io.fileinputstream; import java.io.inputstream; import java.io.inputstreamreader; import java.io.outputstream; import java.net.socket; import java.net.socketaddress; public class tcpclient { public static void main(string[] args) throws exception { //创建字节输入流,绑定要读取的文件元 //选择要上传的文件 fileinputstream fis = new fileinputstream("e:\\a.jpg"); //创建socket对象 socket socket = new socket("127.0.0.1",11111); //获取outputstream对象 outputstream os = socket.getoutputstream(); int len =0; byte[] bytes = new byte[1024]; //一边读取本地文件,一边写入到服务器 while((len=fis.read(bytes))!=-1){ os.write(bytes,0,len); } //写完之后要告诉服务器已经写完了 //不然服务器会一直read(),会进入阻塞状态 socket.shutdownoutput(); //使用socket方法,获取inputstream对象 inputstream is = socket.getinputstream(); while((len=is.read(bytes))!=-1){ system.out.println(new string(bytes,0,len)); } fis.close(); socket.close(); } }
import java.io.fileoutputstream; import java.io.inputstream; import java.net.serversocket; import java.net.socket; public class tcpserver { public static void main(string[] args) throws exception { //创建服务器 serversocket server = new serversocket(11111); //调用server的方法accept,他会返回一个socket while (true) { socket socket = server.accept(); inputstream is = socket.getinputstream(); //创建字节输出流,绑定要输出的目的地 string file = "train" + system.currenttimemillis(); fileoutputstream fos = new fileoutputstream("e:\\study\\demo14\\" + "\\" + file + ".jpg"); int len = 0; byte[] bytes = new byte[1024]; while ((len = is.read(bytes)) != -1) { fos.write(bytes, 0, len); } socket.getoutputstream().write("上传成功".getbytes()); fos.close(); socket.close(); } } }
下一篇: 吃寿司的说法有哪些?寿司的味道是怎样的?