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

How to temporarily create a text file without any file location and send as a response in spring boot at run time?

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

文件就是文件。您使用了错误的词 - 在 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);
}

看看下面的函数:

进口

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();
    }

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

休息和处理文件一样。