Java基礎學習總結(62)——Java中的流和Socket

按行讀入方式: BufferedReader();

1.以行爲讀取單位,讀取比較方便。 按行讀通常都是字符讀。java

BufferedReader和PrintWriter的內存分析圖:面試

JAVA學習筆記之​流,序列化,Socket和裝飾者模型

數據流: 輸入 輸出編程

DataInputStream DataOutputStream設計模式

對象流: 輸入 輸出服務器

ObjectInputStream ObjectOutputStream網絡

還必須的實現Serializable接口,是直接是一個規範,不用重寫任何方法。socket

序列化:將對象變爲--------------------------->文件中數據ide

反序列化:將文件中的數據------------------------>轉換爲對象工具

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有6553六、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個字節。

相關文章
相關標籤/搜索