Android 接收服务器发的文件
1. 概述
在Android应用开发中,有时候我们需要从服务器端获取文件,比如图片、音频、视频等。本文将介绍如何在Android应用中实现接收服务器发的文件,并提供相应的代码示例和详细的解释。
2. 准备工作
在开始编写代码之前,我们需要进行一些准备工作。
首先,确保你已经拥有一个可用的服务器端,该服务器端能够提供文件下载的功能。
其次,确保你已经在Android应用的AndroidManifest.xml
文件中添加了以下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
其中,INTERNET
权限用于访问网络,WRITE_EXTERNAL_STORAGE
权限用于将下载的文件保存到设备的外部存储器。
3. 下载文件的代码示例
下面是一个简单的示例代码,演示了如何在Android应用中下载文件。假设服务器端的文件下载链接为 `
private void downloadFile(String fileUrl, String savePath) {
try {
URL url = new URL(fileUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.connect();
File file = new File(savePath);
if (!file.exists()) {
file.getParentFile().mkdirs();
file.createNewFile();
}
FileOutputStream outputStream = new FileOutputStream(file);
InputStream inputStream = connection.getInputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
上述代码中,我们首先使用URL
类创建一个表示文件下载链接的URL
对象。然后,我们打开一个HttpURLConnection
连接并设置请求方法为GET
。接下来,我们创建一个文件对象,指定了要保存文件的路径,并确保该文件所在的目录已经创建。然后,我们创建一个FileOutputStream
对象和一个InputStream
对象,分别用于写入文件和读取服务器返回的数据。最后,我们使用一个缓冲区,不断地从输入流中读取数据并将其写入文件中,直到全部数据都被读取完毕。
4. 序列图
下面是一个使用mermaid语法标识的序列图,描述了上述代码中的执行流程。
sequenceDiagram
participant Client
participant Server
Client->>Server: 发送下载请求
Server->>Client: 返回文件数据
Client->>Client: 将数据写入文件
在该序列图中,我们可以看到,客户端向服务器发送了一个文件下载请求,服务器返回了文件数据,然后客户端将数据写入文件。
5. 文件下载进度的代码示例
在实际的应用中,我们经常需要显示文件下载的进度。下面是一个改进版的代码示例,演示了如何在Android应用中显示文件下载的进度。
private void downloadFileWithProgress(String fileUrl, String savePath) {
try {
URL url = new URL(fileUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.connect();
int fileLength = connection.getContentLength();
File file = new File(savePath);
if (!file.exists()) {
file.getParentFile().mkdirs();
file.createNewFile();
}
FileOutputStream outputStream = new FileOutputStream(file);
InputStream inputStream = connection.getInputStream();
byte[] buffer = new byte[4096];
int bytesRead;
long totalBytesRead = 0;
while ((bytesRead = inputStream.read(buffer)) != -1) {
totalBytesRead += bytesRead;
outputStream.write(buffer, 0, bytesRead);
int progress = (int) (totalBytesRead * 100 / fileLength);
// 更新进度条
updateProgress(progress);
}
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void updateProgress(int progress) {
// 在UI线程中更新进度条
runOnUiThread(() -> {
// TODO: 更新进度条的代码
});
}