首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java TCP 文本文件上傳實現:字元流與緩衝區正確用法

     編輯:Java 相關知識

場景差異

文本文件上傳**必須使用字元流**(Reader/Writer)配合緩衝區,確保換行符、編碼正確處理。與圖片上傳的位元組流本質不同。

服務端代碼

import java.io.*;
import java.net.*;

public class TCPTextServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8090);
        System.out.println("文本上傳服務端啟動,監聽 8090...");

        Socket client = server.accept();
        System.out.println("客戶端連接:" + client.getInetAddress());

        try (
            InputStream in = client.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
            BufferedWriter bw = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream("E:/tcp.txt"), "UTF-8"));
            OutputStream out = client.getOutputStream()
        ) {
            String line;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();      // 跨平台換行
                bw.flush();        // 及時寫入磁碟
            }

            // 回應
            out.write("上傳完成...".getBytes("UTF-8"));
            out.flush();
        } finally {
            client.close();
            server.close();
        }
    }
}

客戶端代碼

import java.io.*;
import java.net.*;

public class TCPTextClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 8090);
        System.out.println("已連接服務端");

        try (
            OutputStream out = socket.getOutputStream();
            BufferedWriter bw = new BufferedWriter(
                new OutputStreamWriter(out, "UTF-8"));
            BufferedReader br = new BufferedReader(new FileReader("1.txt"));
        ) {
            String line;
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine();
                bw.flush();
            }

            // 關鍵:發送結束標記
            socket.shutdownOutput();

            // 接收回應
            try (InputStream in = socket.getInputStream()) {
                byte[] buf = new byte[1024];
                int len = in.read(buf);
                System.out.println("服務端回應:" + new String(buf, 0, len, "UTF-8"));
            }
        } finally {
            socket.close();
        }
    }
}

字元流處理鏈路圖

客戶端                          服務端
FileReader (字元輸入)          InputStreamReader (位元組→字元)
    ↓                               ↓
BufferedReader (緩衝讀行)        BufferedReader (緩衝讀行)
    ↓                               ↓
OutputStreamWriter (字元→位元組)  BufferedWriter (緩衝寫行)
    ↓                               ↓
Socket OutputStream              FileOutputStream (位元組寫檔)

關鍵點對比:文本 vs 圖片上傳

維度文本上傳圖片上傳
流類型字元流 + 轉換流 + 緩衝區位元組流 + 緩衝區
編碼處理指定 UTF-8/GBK,雙端一致無編碼,純二進位透傳
換行處理readLine()/newLine() 自動適配不涉及
結束標記shutdownOutput() 必須shutdownOutput() 必須

常見錯誤與修正

錯誤後果修正
文本用位元組流中文亂碼、換行符損壞改用 Reader/Writer 指定編碼
漏寫 shutdownOutput()服務端 readLine() 永久阻塞發送完畢後必須調用
雙端編碼不一致中文顯示亂碼雙端明確指定相同 Charset
未 flush()數據停留緩衝區,文件不全關鍵節點調用 flush()

總結

TCP 文本上傳核心模式:**字元流轉換鏈 + 緩衝區逐行讀寫 + shutdownOutput() 邊界 + 統一編碼**。掌握此模式,可輕鬆擴展至配置文件同步、日誌收集、代碼部署等場景。生產環境建議加入協議幀(長度前綴/分隔符)、壓縮、加密、斷點續傳等增強特性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved