zoukankan      html  css  js  c++  java
  • Java基础学习总结(62)——Java中的流和Socket

    按行读入方式: BufferedReader();

    1.以行为读取单位,读取比较方便。 按行读一般都是字符读。

    BufferedReader和PrintWriter的内存分析图:

    JAVA学习笔记之​流,序列化,Socket和装饰者模型

    数据流: 输入 输出

    DataInputStream DataOutputStream

    对象流: 输入 输出

    ObjectInputStream ObjectOutputStream

    还必须的实现Serializable接口,是直接是一个规范,不用重写任何方法。

    序列化:将对象变为--------------------------->文件中数据

    反序列化:将文件中的数据------------------------>转换为对象

    Transient修饰的属性,不会被序列化到文件里,原来初始化的是什么值,最终保持的就是什么值。

    网络编程:

    socket翻译:插座,插孔

    socket(套接字) = IP + 端口

    Scoket是伯克利大学弄出来的。

    网络编程 != 网站编程(我们从事的,专业一点就是 WEB应用程序开发)。

    Socket插座:

    Why:

    类似两个QQ聊天工具,两个应用程序之间要交换数据就要用到socket.

    What:Socket是一套API的总称,这套API是用来处理两个应用程序之间的数据交换的问题。

    How: 1.创建socket的连接

    2.I/O操作

    3.关闭socket的连接

    ServerSocket 服务器端插座

    Socket 客户端插座

    端口号:用来识别一个进程,端口号占两个字节 有65536种可能.TCP有65536、UDP也有65536个

    需求:客户端给服务器端说: 你好,服务器

    Server端代码

    import java.io.BufferedReader;

    import java.io.IOException;

    import java.io.InputStream;

    import java.io.InputStreamReader;

    import java.net.ServerSocket;

    import java.net.Socket;

    //服务器端

    public class Server {

    public static void main(String[] args) throws IOException {

    //Socket编程 共三步 类似打电话

    //一.创建socket连接 (拨号并接通)

    //1.新建ServerSocket

    ServerSocket ss = new ServerSocket(6666);

    //3.接受连接

    while(true){

    Socket socket = ss.accept();//阻塞式的 傻傻的等待 等待一个客户端连接

    System.out.println("有一个客户端相连");

    //二.I/O操作 (说话)

    //1.建立通道

    InputStream is = socket.getInputStream();

    InputStreamReader isr = new InputStreamReader(is);

    BufferedReader br = new BufferedReader(isr);

    //2.利用read读

    String message = br.readLine();//阻塞式 傻傻的等待 等待客户端写

    System.out.println("有客户端给我打招呼,内容是:" + message);

    //3.关闭通道

    if(br!=null){

    br.close();

    }

    if(isr!=null){

    isr.close();

    }

    if(is!=null){

    is.close();

    }

    //三.关闭socket连接 (挂电话)

    if(socket!=null){

    socket.close();

    }

    }

    //阻塞 为了等待客户端连接

    //有一个客户端相连

    //阻塞 为了等待客户端输出 等待6秒

    //有客户端给我打招呼,内容是:你好,服务器

    }

    }

    客户端代码

    import java.io.BufferedWriter;

    import java.io.IOException;

    import java.io.OutputStream;

    import java.io.OutputStreamWriter;

    import java.net.Socket;

    import java.net.UnknownHostException;

    //客户端

    public class Client {

    public static void main(String[] args) throws UnknownHostException,

    IOException,InterruptedException {

    String str = "你好,服务器";

    // 一.创建socket连接

    // 2.申请连接(相当于拨号,但别人不一定接) 系统给该进程自动分配一个端口1024以上

    Socket s = new Socket("127.0.0.1", 6666);

    //二.I/O操作

    //1.建立通道

    OutputStream oo = s.getOutputStream();

    //字节流--->字符流

    OutputStreamWriter osw = new OutputStreamWriter(oo);

    BufferedWriter bw = new BufferedWriter(osw);

    Thread.sleep(6000);

    //2.利用write写

    bw.write(str);

    //3.关闭通道

    if(bw!=null){

    bw.close();

    }

    if(osw!=null){

    osw.close();

    }

    if(oo!=null){

    oo.close();

    }

    //三.关闭socket连接

    if(s!=null){

    s.close();

    }

    }

    }

    注:Scoket socket = serverSocket.accept(); //阻塞式的,没有客户端连接服务器,这条代码就一直傻傻的等待,只有客户端申请连接后,才能解除阻塞。

    String message = br.readLine(); // 阻塞式的,等待客户端输出信息,才能解除阻塞。

    装饰者设计模式:在不改变原来类文件的情况下,添新功能。可以使用继承,但是在新功能较多的时候,容易发生类爆炸。

    1.实现原始类的 接口 因为原始的类的功能都只有那么一个,不会改变。

    2.组合现有的接口

    3.在原有的功能上添加新功能

    //装饰者类如何写

    //1.实现 原始类 接口 因为如何装饰 都是一个披萨

    public class SeafoodDecorator implements Pizza{

    //2.组合现有的

    private Pizza pizza;

    public SeafoodDecorator(Pizza pizza){

    this.pizza = pizza;

    }

    @Override

    public void describe() {

    //3.在原有的基础上添加的新功能(在原有的披萨上加调料)

    System.out.print("海鲜的");

    pizza.describe();// 为了保证原有的不变 所以要调用一下

    }

    }

    面试题1: BufferedWriter和PrintWriter的区别?

    答:PrintWriter的缓冲区只是文件一行

    BufferedWriter的缓冲区是16384字节

    按照是否直接和数据相连分为:节点流,处理流

    按照数据的流向分为:输入流,输出流

    按照数据单位分为:字节流,字符流

    面试题2: 什么时候将缓冲区中的内容写到文件中去?

    答:1.flush();时,刷新缓冲区;

    2.close();时,关闭通道,回自动调用flush();

    3.缓冲区中的数据已满时,回溢出到文件中去。缓冲区的大小是16384个字节。

  • 相关阅读:
    hdu 6702 ^&^ 位运算
    hdu 6709 Fishing Master 贪心
    hdu 6704 K-th occurrence 二分 ST表 后缀数组 主席树
    hdu 1423 Greatest Common Increasing Subsequence 最长公共上升子序列 LCIS
    hdu 5909 Tree Cutting FWT
    luogu P1588 丢失的牛 宽搜
    luogu P1003 铺地毯
    luogu P1104 生日
    luogu P1094 纪念品分组
    luogu P1093 奖学金
  • 原文地址:https://www.cnblogs.com/zhanghaiyang/p/7212877.html
Copyright © 2011-2022 走看看