1.以行爲讀取單位,讀取比較方便。 按行讀通常都是字符讀。java
BufferedReader和PrintWriter的內存分析圖:面試
數據流: 輸入 輸出編程
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個字節。