如何临时创建一个没有任何文件位置的文本文件并在运行时在 Spring Boot 中作为响应发送?

Posted

技术标签:

【中文标题】如何临时创建一个没有任何文件位置的文本文件并在运行时在 Spring Boot 中作为响应发送?【英文标题】:How to temporarily create a text file without any file location and send as a response in spring boot at run time? 【发布时间】:2022-01-23 09:36:43 【问题描述】:

需要通过可用数据创建一个txt文件,然后需要将该文件作为rest response发送。 该应用程序部署在容器中。我不想将它存储在容器上的任何位置或 Spring Boot 资源中的任何位置。有什么方法可以在运行时缓冲区创建文件而不提供任何文件位置,然后在休息响应中发送它? 应用程序是生产应用程序,所以我需要一个安全的解决方案

【问题讨论】:

【参考方案1】:

文件就是文件。你用错词了——在java中,数据流的概念,至少对于这种工作来说,被称为InputStreamOutputStream

你有什么方法需要File?那就是路的尽头。文件是一个文件。你不能假装它。但是,与开发人员交谈,或检查替代方法,因为在 java 中进行数据处理的任何东西绝对没有理由需要File。它应该需要InputStream 或可能需要Reader。或者甚至有一种方法可以为您提供OutputStreamWriter。所有这些都很好 - 它们是抽象,让您可以从文件、网络连接或整块布料向其发送数据,这正是您想要的。

一旦你拥有其中之一,它就变得微不足道了。例如:

String text = "The Text you wanted to store in a fake file";
byte[] data = text.getBytes(StandardCharsets.UTF_8);
ByteArrayInputStream in = new ByteArrayInputStream(data);
whateverSystemYouNeedToSendThisTo.send(in);

或者例如:

String text = "The Text you wanted to store in a fake file";
byte[] data = text.getBytes(StandardCharsets.UTF_8);
try (var out = whateverSystemYouNeedToSendThisTo.getOUtputStream()) 
  out.write(data);

【讨论】:

感谢您的评论,我会尝试这种方法看看。抱歉,我无法解释问题中的情况。【参考方案2】:

看看下面的函数:

进口

import com.google.common.io.Files;
import org.springframework.http.ContentDisposition;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import java.io.*;
import java.nio.file.Paths;

功能:

@GetMapping(value = "/getFile", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    private ResponseEntity<byte[]> getFile() throws IOException 
        File tempDir = Files.createTempDir();
        File file = Paths.get(tempDir.getAbsolutePath(), "fileName.txt").toFile();
        String data = "Some data"; //
        try (FileWriter fileWriter = new FileWriter(file)) 
            fileWriter.append(data).flush();
         catch (Exception ex) 
            ex.printStackTrace();
        
        byte[] zippedData = toByteArray(new FileInputStream(file));
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentDisposition(ContentDisposition.builder("attachment").filename("file.txt").build());
        httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        httpHeaders.setContentLength(zippedData.length);
        return ResponseEntity.ok().headers(httpHeaders).body(zippedData);
    

    public static byte[] toByteArray(InputStream in) throws IOException 
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        byte[] buffer = new byte[in.available()];
        int len;
        // read bytes from the input stream and store them in buffer
        while ((len = in.read(buffer)) != -1) 
            // write bytes from the buffer into output stream
            os.write(buffer, 0, len);
        
        return os.toByteArray();
    

【讨论】:

【参考方案3】:

简而言之,您希望将数据存储在内存中。基本构建块是字节数组 - byte[]。 在 JDK 中有两个类将 IO 世界与字节数组连接起来 - ByteArrayInputStreamByteArrayOutputStream

Rest 和处理文件时一样。

【讨论】:

以上是关于如何临时创建一个没有任何文件位置的文本文件并在运行时在 Spring Boot 中作为响应发送?的主要内容,如果未能解决你的问题,请参考以下文章

如何从文本文件创建二维数组并在 c 中打印到新文件

如何创建.chm文件? [关闭]

在 lua 中创建一个临时文件

自学Linux Shell14.3-创建临时文件

MS Access 中文件的导入循环:如何在每个文件上运行宏并替换临时表的内容

如何在 C、java 和 C++ 中的任何位置编译和运行任何文件?