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: 更新进度条的代码
    });
}