仅使用流创建一个 csv 或简单文本文件
Create a csv or simple text file using only streams
我要使用 jsf Primefaces 下载按钮来下载 csv 文件。
该文件不存在并且无法使用导出实用程序,因为我需要在运行时构建 csv。
这是一个有效的测试尝试:
private StreamedContent file;
/** Getter,setter...*/
public void FileDownloadBean() {
InputStream stream = this.getClass().getResourceAsStream("test.csv");
file = new DefaultStreamedContent(stream, "application/csv", "test.csv");
}
我使用 Primefaces 的事实在这里并不算数,我想要实现的是构建任何类型的文件,最好是 CSV,而无需在文件系统中实际保存(临时)文件。
我想使用流附加我的数据,这样我就可以轻松地附加和操作 String
s、byte
s 和 image
文件。
有什么想法吗?也许是一个字符串缓冲区?
提前致谢。
我认为你做不到"create a file without creating a file"。
使用 String
、StringBuffer
、StringBuilder
或其他 变量 内存中文件的内容。
编辑: 显然,还有内存流(?):ByteArrayInputStream
和 ByteArrayOutputStream
据我了解你的问题,以下答案"maybe"解决了你的问题:
public class InMemoryStreaming {
private StringBuilder sb = new StringBuilder();
public void FileDownloadBean() throws IOException {
InputStream csvStream = this.getClass().getResourceAsStream("test.csv");
try (BufferedReader br = new BufferedReader(new InputStreamReader(
csvStream))) {
// on every method call the StringBuilder is appended
sb.append(br.lines().collect(
Collectors.joining(System.lineSeparator())));
}
}
}
如果你想将StringBuilder
序列化成一个真正的文件,你可以通过合适的编写器来实现。
我要使用 jsf Primefaces 下载按钮来下载 csv 文件。 该文件不存在并且无法使用导出实用程序,因为我需要在运行时构建 csv。
这是一个有效的测试尝试:
private StreamedContent file;
/** Getter,setter...*/
public void FileDownloadBean() {
InputStream stream = this.getClass().getResourceAsStream("test.csv");
file = new DefaultStreamedContent(stream, "application/csv", "test.csv");
}
我使用 Primefaces 的事实在这里并不算数,我想要实现的是构建任何类型的文件,最好是 CSV,而无需在文件系统中实际保存(临时)文件。
我想使用流附加我的数据,这样我就可以轻松地附加和操作 String
s、byte
s 和 image
文件。
有什么想法吗?也许是一个字符串缓冲区?
提前致谢。
我认为你做不到"create a file without creating a file"。
使用 String
、StringBuffer
、StringBuilder
或其他 变量 内存中文件的内容。
编辑: 显然,还有内存流(?):ByteArrayInputStream
和 ByteArrayOutputStream
据我了解你的问题,以下答案"maybe"解决了你的问题:
public class InMemoryStreaming {
private StringBuilder sb = new StringBuilder();
public void FileDownloadBean() throws IOException {
InputStream csvStream = this.getClass().getResourceAsStream("test.csv");
try (BufferedReader br = new BufferedReader(new InputStreamReader(
csvStream))) {
// on every method call the StringBuilder is appended
sb.append(br.lines().collect(
Collectors.joining(System.lineSeparator())));
}
}
}
如果你想将StringBuilder
序列化成一个真正的文件,你可以通过合适的编写器来实现。