客戶端傳送 Windows 路徑 C:\Users\msg.log,伺服端用 DataInputStream 讀取後無法開啟檔案,直接硬編碼路徑卻可行。
reader.read(temp) 單次讀取字元陣列,未處理訊息邊界(長度、換行符、EOF),導致字串截斷或殘留垃圾字元。\ 為轉義字元,路徑需雙反斜線 \\ 或正斜線 /。若從網路接收原始字串 C:\Users\msg.log,實際字串內容已是單反斜線,無需再轉義,直接用於 new File(str) 即可。// 客戶端:發送長度 + 內容
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
byte[] pathBytes = "C:/Users/msg.log".getBytes(StandardCharsets.UTF_8);
dos.writeInt(pathBytes.length);
dos.write(pathBytes);
dos.flush();
// 伺服端:先讀長度,再精確讀取
DataInputStream dis = new DataInputStream(socket.getInputStream());
int len = dis.readInt();
byte[] buf = new byte[len];
dis.readFully(buf);
String path = new String(buf, StandardCharsets.UTF_8);
FileInputStream fis = new FileInputStream(path); // 直接使用
DataOutputStream.writeInt/readInt 定義訊息長度,避免黏包/半包。/ 跨平台相容。StandardCharsets.UTF_8 避免編碼亂碼。