java多线程进行文件上传和下载
时间: 2023-06-17 19:05:30 浏览: 122
在 Java 中进行文件上传和下载时,可以使用多线程来加速传输速度和提高效率。下面是一个简单的示例代码,实现了同时上传和下载多个文件的功能:
文件上传:
```java
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FileUploader {
private final static String SERVER_IP = "127.0.0.1";
private final static int SERVER_PORT = 9999;
private static class UploadTask implements Runnable {
private File file;
public UploadTask(File file) {
this.file = file;
}
@Override
public void run() {
try (Socket socket = new Socket(SERVER_IP, SERVER_PORT);
FileInputStream fis = new FileInputStream(file);
OutputStream os = socket.getOutputStream()) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
os.flush();
System.out.println("File uploaded: " + file.getName());
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
String[] files = {"/path/to/file1", "/path/to/file2", "/path/to/file3"};
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (String file : files) {
executorService.submit(new UploadTask(new File(file)));
}
executorService.shutdown();
}
}
```
文件下载:
```java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FileDownloader {
private final static int SERVER_PORT = 9999;
private static class DownloadTask implements Runnable {
private String fileName;
public DownloadTask(String fileName) {
this.fileName = fileName;
}
@Override
public void run() {
try (Socket socket = new Socket("localhost", SERVER_PORT);
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(fileName)) {
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.flush();
System.out.println("File downloaded: " + fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
String[] files = {"file1", "file2", "file3"};
ExecutorService executorService = Executors.newFixedThreadPool(3);
try (ServerSocket serverSocket = new ServerSocket(SERVER_PORT)) {
while (true) {
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = is.read(buffer)) != -1) {
sb.append(new String(buffer, 0, len));
}
String fileName = sb.toString();
executorService.submit(new DownloadTask(fileName));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
executorService.shutdown();
}
}
}
```
在这个示例中,上传和下载都是通过 Socket 来实现的。在上传时,每个文件都会启动一个线程,将文件的内容写入到 Socket 的输出流中,发送给服务器。在下载时,服务器会监听指定的端口,并接收来自客户端的请求。每次接收到请求后,服务器会启动一个线程,读取客户端发送的文件名,并将文件的内容写入到 Socket 的输出流中,发送给客户端。这样就可以实现同时上传和下载多个文件的效果了。