上一篇
Java中,可通过Socket编程结合输入输出流实现文件传输,或使用
Java中实现文件传输有多种方式,以下是几种常见的方法及其详细实现步骤:

使用Socket编程实现文件传输
客户端代码:
import java.io.;
import java.net.Socket;
public class FileTransferClient {
public static void main(String[] args) {
String host = "localhost"; // 服务器地址
int port = 5000; // 服务器端口
String filePath = "path/to/your/file.txt"; // 要传输的文件路径
try (Socket socket = new Socket(host, port);
FileInputStream fileInputStream = new FileInputStream(filePath);
OutputStream outputStream = socket.getOutputStream()) {
// 发送文件名和长度
File file = new File(filePath);
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(file.getName());
dataOutputStream.writeLong(file.length());
// 发送文件数据
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
System.out.println("文件传输完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端代码:
import java.io.;
import java.net.ServerSocket;
import java.net.Socket;
public class FileTransferServer {
public static void main(String[] args) {
int port = 5000; // 服务器端口
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("服务器启动,等待连接...");
while (true) {
try (Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream)) {
// 接收文件名和长度
String fileName = dataInputStream.readUTF();
long fileLength = dataInputStream.readLong();
// 保存文件
File file = new File("received_" + fileName);
try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
byte[] buffer = new byte[4096];
int bytesRead;
long totalBytesRead = 0;
while ((bytesRead = inputStream.read(buffer)) != -1 && totalBytesRead < fileLength) {
fileOutputStream.write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
}
}
System.out.println("文件接收完成:" + file.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用RMI(远程方法调用)实现文件传输
客户端代码:
import java.io.;
import java.rmi.Naming;
public class FileTransferClient {
public static void main(String[] args) {
try {
FileTransferInterface fileTransfer = (FileTransferInterface) Naming.lookup("rmi://localhost/FileTransferService");
fileTransfer.sendFile("path/to/your/file.txt");
System.out.println("文件传输请求已发送!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务器端代码:
import java.io.;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.LocateRegistry;
public interface FileTransferInterface extends Remote {
void sendFile(String filePath) throws RemoteException;
}
public class FileTransferServer extends UnicastRemoteObject implements FileTransferInterface {
public FileTransferServer() throws RemoteException {
super();
}
@Override
public void sendFile(String filePath) throws RemoteException {
try {
File file = new File(filePath);
FileInputStream fileInputStream = new FileInputStream(file);
String fileName = file.getName();
long fileLength = file.length();
// 保存文件
File receivedFile = new File("received_" + fileName);
FileOutputStream fileOutputStream = new FileOutputStream(receivedFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, bytesRead);
}
fileInputStream.close();
fileOutputStream.close();
System.out.println("文件接收完成:" + receivedFile.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
FileTransferServer server = new FileTransferServer();
LocateRegistry.createRegistry(1099);
Naming.rebind("FileTransferService", server);
System.out.println("服务器启动,等待连接...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用HTTP协议实现文件传输(基于Servlet)
客户端代码(上传文件):
import java.io.;
import java.net.HttpURLConnection;
import java.net.URL;
public class FileUploadClient {
public static void main(String[] args) {
String filePath = "path/to/your/file.txt"; // 要上传的文件路径
String targetUrl = "http://localhost:8080/upload"; // 服务器上传接口URL
try {
File file = new File(filePath);
HttpURLConnection connection = (HttpURLConnection) new URL(targetUrl).openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
OutputStream outputStream = connection.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"), true);
writer.append("------WebKitFormBoundary7MA4YWxkTrZu0gW
");
writer.append("Content-Disposition: form-data; name="file"; filename="" + file.getName() + ""
");
writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(file.getName()) + "
");
writer.append("Content-Transfer-Encoding: binary
");
writer.append("
");
writer.flush();
FileInputStream inputStream = new FileInputStream(file);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
inputStream.close();
writer.append("
");
writer.append("------WebKitFormBoundary7MA4YWxkTrZu0gW--
");
writer.close();
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
System.out.println("文件上传成功!");
} else {
System.out.println("文件上传失败,响应码:" + responseCode);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端代码(Servlet):
import java.io.;
import javax.servlet.;
import javax.servlet.http.;
import java.nio.file.;
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Part filePart = request.getPart("file"); // 获取上传的文件
String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // 获取文件名
InputStream fileContent = filePart.getInputStream(); // 获取文件内容
// 保存文件
File file = new File("uploaded_" + fileName);
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fileContent.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, bytesRead);
}
fileOutputStream.close();
fileContent.close();
response.getWriter().println("文件上传成功!");
}
}
相关问答FAQs:
Q1:如何在Java中使用Socket编程实现文件传输?
A1:在Java中使用Socket编程实现文件传输需要分别编写客户端和服务器端代码,客户端通过Socket连接到服务器,读取本地文件并将其发送到服务器;服务器端监听特定端口,接收客户端发送的文件数据并保存到本地,具体实现可以参考上述提供的客户端和服务器端代码示例。

Q2:Java中如何实现基于HTTP协议的文件上传?
A2:在Java中实现基于HTTP协议的文件上传可以使用HttpURLConnection类来模拟表单提交,客户端创建一个HttpURLConnection对象,设置请求方法为POST,并设置请求头中的Content-Type为multipart/form-data,将文件数据写入输出流中,并发送请求到服务器,服务器端可以使用Servlet来处理文件上传请求,通过request.getPart()方法获取上传的文件,并将其保存到本地。

