okhttp下载文件 Java下载文件 javaokhttp下载文件 下载文件 java下载 okhttp下载 okhttp

okhttp下载文件 Java下载文件 javaokhttp下载文件 下载文件 java下载 okhttp下载 okhttp

示例 http客户端 用的是 okhttp,也可以用 UrlConnetcion或者apache

1、引入Maven

okhttp官网

java 复制代码
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.14.9</version>
</dependency>

也可以下载 okhttp jar方式引入

1.1、okhttp发起请求官网Demo

java 复制代码
public static final MediaType JSON = MediaType.get("application/json");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(json, JSON);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}

2、下载文件

java 复制代码
public class TestDownload {

    public static void main(String args[]) {
       // 图片文件地址
        String url = "https://himg.bdimg.com/sys/portraitn/item/public.1.c9145b32.BtcNjpu-t6NEqWtWFh3ICg";
        
        // 创建一个 okhttp客户端线程池
        OkHttpClient client = new OkHttpClient.Builder()
                .connectionPool(new ConnectionPool(20, 2, TimeUnit.MINUTES))
                .build();
        
        // 构建请求对象
        Request request = new Request.Builder().url(url).get().build();
        
        // 发起请求得到请求结果
        Response response = client.newCall(request).execute();
        
        // 获取请求结果
        ResponseBody responseBody = response.body();
        if (null != responseBody) {
            // 获取文件后缀类型 可以使用 responseBody.contentType() 获取 ContentType,我这边知道这个url文件的类型
            String suffix = ".jpeg";
            
            // 创建一个文件
            String filename = "E:\\test\\" + System.currentTimeMillis() + suffix;
            
            File file = new File(filename);
    
            // 判断目录是否存在,不存在则创建目录
    
            File parent = new File(file.getParent());
            if(!parent.exists()){
                parent.mkdir();
            }
            
            // 判断文件是否存在, 不存在创建文件
            if (!file.exists()) {
                if (file.createNewFile()) {
                    // 获取请求结果输入流
                    InputStream rInputStream = responseBody.byteStream();
                    
                    // 创建读取字节流的byte数组
                    byte[] buffer = new byte[500];
                    
                    int areRead;
                    
                    // 创建文件输出流
                    FileOutputStream outputStream = new FileOutputStream(file );
                    
                    // 使用输入流读取字节,在输出到文件
                    while ((areRead = rInputStream.read(buffer)) != -1) {
                        outputStream.write(buffer, 0, areRead);
                    }
                    rInputStream.close();
                    outputStream.close();
                }
            }
        }
        response.close();
    }
}

3、扩充,读写 txt文件内容

3.1读写内容

java 复制代码
    /**
     * 创建文件以及文件对应的目录
     * @param path 文件路径,例如 E:\test\测试.txt
     * @return {@link File}
     */
    private File createFile(String path) throws IOException {
        File file = new File(path);
        
        // 判断目录是否存在
        File parent = new File(file.getParent());
        if(!parent.exists()){
            parent.mkdir();
        }
        
        if(!file.exists()){
            file.createNewFile();
        }
        return file;
    }
    
    /**
     * 读取txt内容
     * @param file {@link File}
     * @return 字符串
     */
    private String readTxt(File file) throws IOException {
        
        StringBuilder sb = new StringBuilder();
        
        // 使用字符流读取
        BufferedReader reader = new BufferedReader(new FileReader(file));
        
        // 读取每一行的内容
        String readLine;
        
        while ((readLine = reader.readLine()) != null){
            sb.append(readLine);
        }
    
        String result = sb.toString();
        
        System.out.printf("读取内容: \n %s", result);
        
        reader.close();
        
        /*
        // 使用字节流读取
        long fileLength = file.length();
        
        // 创建一个用于读取指定字节大小的数组
        byte[] bytes = new byte[(int) fileLength];
        
        // 创建一个文件输入流
        FileInputStream fileInputStream = new FileInputStream(file);
        
        // 使用 文件输入流读取字节输入到 字节数组中
        int areRead = fileInputStream.read(bytes);
        
        String result2 = new String(bytes);

        fileInputStream.close();
   
         */
        return result;
    }
    
    @Test
    public void writeTxt() throws IOException {
        String path = "E:\\test2\\测试.txt";
        
        File file = createFile(path);
        
        // 读取现在已有的内容
        String readTxt = readTxt(file);
        
        // 创建一个文件输出流
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        
        // 之前的内容
        fileOutputStream.write(readTxt.getBytes(StandardCharsets.UTF_8));
    
        // 换行, 使用Java的自定义换行符号,会根据不同系统平台转义
        String newLine = System.getProperty("line.separator");
        fileOutputStream.write(newLine.getBytes());
        
        // 追加的内容
        fileOutputStream.write((String.valueOf(System.currentTimeMillis()) + " \r\n").getBytes(StandardCharsets.UTF_8));
        
        // 关闭资源
        fileOutputStream.flush();
        fileOutputStream.close();
    }
相关推荐
鸣弦artha2 分钟前
蓝桥杯——杨辉三角
java·算法·蓝桥杯·eclipse
未知陨落10 分钟前
数据结构——二叉搜索树
开发语言·数据结构·c++·二叉搜索树
大波V511 分钟前
设计模式-参考的雷丰阳老师直播课
java·开发语言·设计模式
计算机-秋大田17 分钟前
基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)
java·spring boot·微信小程序·小程序·vue·课程设计
无敌最俊朗@24 分钟前
unity3d————接口基础知识点
开发语言·c#
《源码好优多》28 分钟前
基于Java Springboot旅游信息推荐系统
java·spring boot·旅游
岁月无声code30 分钟前
Spring Boot 牛刀小试 org.springframework.boot:spring-boot-maven-plugin:找不到类错误
java·spring boot·github
不爱学习的YY酱43 分钟前
【计网不挂科】计算机网络第二章< 物理层 >习题库(含答案)
java·数据库·计算机网络
一丝晨光1 小时前
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
c语言·开发语言·c++·gnu·clang·gcc·g++
南城花随雪。1 小时前
Spring框架之装饰者模式 (Decorator Pattern)
java·开发语言·装饰器模式