- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
csv Spring Multipartfile 的最佳处理方式是什么?我以前用过这样的东西:
public void handleFile(MultipartFile multipartFile){
try{
InputStream inputStream = multipartFile.getInputStream();
IOUtils.readLines(inputStream, StandardCharsets.UTF_8)
.stream()
.forEach(this::handleLine);
} catch (IOException e) {
// handle exception
}
}
private void handleLine(String s) {
// do stuff per line
}
据我所知,这首先将整个文件加载到内存中的列表中,然后再对其进行处理,对于具有数十万行的文件,这可能需要相当长的时间。
有没有办法逐行处理它而无需手动实现迭代的开销(即使用 read()
、hasNext(
)、. ..)?我正在为文件系统中的文件寻找类似于此示例的简洁内容:
try (Stream<String> stream = Files.lines(Paths.get("file.csv"))) {
stream.forEach(this::handleLine);
} catch (IOException e) {
// handle exception
}
最佳答案
如果你有 InputStream,你可以使用这个:
InputStream inputStream = multipartFile.getInputStream();
new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))
.lines()
.forEach(this::handleLine);
在其他情况下:
无论是多部分文件还是有多个独立文件,在 Java 8 中使用 Stream
API 都有很多方法:
解决方案一:
如果您的文件在不同的目录中,您可以这样做:
假设您有一个 String
的 List
,其中包含如下所示的文件路径:
List<String> files = Arrays.asList(
"/test/test.txt",
"/test2/test2.txt");
然后你可以读取上面文件的所有行如下:
files.stream().map(Paths::get)
.flatMap(path -> {
try {
return Files.lines(path);
} catch (IOException e) {
e.printStackTrace();
}
return Stream.empty();
}).forEach(System.out::println);
解决方案 2:
您还可以通过以下方式使用 Files.walk
读取存在于 /test/ehsan
目录中的所有文件行:
try (Stream<Path> stream = Files.walk(Paths.get("/test/ehsan"), 1)) {
stream.filter(Files::isRegularFile)
.flatMap(path -> {
try {
return Files.lines(path);
} catch (IOException e) {
e.printStackTrace();
}
return Stream.empty();
})
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
如果您想递归读取/test/ehsan
目录中的所有文件行,您可以这样做:
try (Stream<Path> stream = Files.walk(Paths.get("/test/ehsan"))) {
stream.filter(Files::isRegularFile)
.flatMap(path -> {
try {
return Files.lines(path);
} catch (IOException e) {
e.printStackTrace();
}
return Stream.empty();
})
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
如您所见,Files.walk
的第二个参数指定要访问的最大目录级别数,如果您不传递它,将使用默认值,即 Integer。 MAX_VALUE
。
解决方案 3:
不止于此,我们可以走得更远。如果我们想读取存在于两个完全不同的目录(例如 /test/ehsan
和 /test2/ehsan1
)中的所有文件行怎么办?
我们可以做到,但我们应该谨慎,Stream
不应该太长(因为它会降低我们程序的可读性)最好将它们分解成单独的方法,但是因为它是不可能在这里写多个方法,我将在一个地方写下如何做到这一点:
假设您有一个 String
的 List
,其中包含您的目录路径,如下所示
list<String> dirs = Arrays.asList(
"/test/ehsan",
"/test2/ehsan1");
那么我们可以这样做:
dirs.stream()
.map(Paths::get)
.flatMap(path -> {
try {
return Files.walk(path);
} catch (IOException e) {
e.printStackTrace();
}
return Stream.empty();
})
.filter(Files::isRegularFile)
.flatMap(path -> {
try {
return Files.lines(path);
} catch (IOException e) {
e.printStackTrace();
}
return Stream.empty();
})
.forEach(System.out::println);
关于java - 在 Java 8 中逐行读取 Spring Multipartfile 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63139140/
我正在使用 Spring 4 和 Java Config。我想将多个文件上传到服务器,但问题是我的 MultipartFile[ ] 参数将始终接收空/[ ] 参数。让我在这里分享我的代码是我的“Ap
我正在使用 MultPartFile 从前端上传 .zip,有时在我对其执行任何操作之前,该文件会被删除。我调试 CommonsMultipartFile.class (intellij) 来清理我的
我面临以下问题:我使用 MultipartFile 提交带有电子邮件等其他信息的图像。 考虑这样一种情况,我们有两个字段:输入 = 带电子邮件的文本和带文件的输入(输入类型 = 文件)。在服务器端,我
我需要将从客户端接收到的 MultipartFile 转换为字节数组,以将其发送到另一台服务器(无需在第一台服务器上保存文件)。我想使用 MultipartFile.getBytes() 函数,将其转
有什么方法可以将 File 对象转换为 MultiPartFile?这样我就可以将该对象发送到接受 MultiPartFile 接口(interface)对象的方法? File myFile = ne
我有一个使用 spring boot 的 Java 11 应用程序。 我的请求 Controller 中有这个请求: @RestController public class ImportContro
我以 BASE64 编码字符串(encodedBytes)的形式接收图像,并使用以下方法在服务器端解码为 byte[]。 BASE64Decoder decoder = new BASE64Decod
我希望用户能够提交任意数量的具有任意名称和原始文件名的文件。 如何获取请求中已提交文件的列表? @RequestParam(name = "*") MultipartFile[] files 我希望使
我尝试通过 post 方法将图像从ionic前端应用程序发送到中的后端服务 Spring 启动 我已经完成了这个方法,使用 FormData 对象内的图像将帖子发送到后端 url: uploadI
如果存在 MultipartFile,为什么 @Valid 注释不适用于我的域模型?我的 Controller 中有以下代码: @PostMapping("/create") public Strin
我有一个可以上传文件的表单。有一个问题,即使没有选择或上传文件,@RequestParam 值的大小也是我希望它为空或 null 的大小。 最佳答案 根据this official这里的 Mozill
我正在使用 MultipartFile 发送包含多个附件的电子邮件。我的代码工作正常,但我将每个文件存储在我的项目中,然后附加。我不想将该文件存储在任何地方,而是希望将文件直接发送给收件人。我的代码是
我正在尝试获取MultipartFile的内容,它是通过MultipartHttpServletRequest.getFile()获取的。 MultipartFile 中有两个函数: bytes[]
我想提取文件路径然后可以上传到谷歌驱动器。如何从 MultipartFile 获取路径? //logger.info(""+uploadFile.getClass().getResource(
我通过文件转换为MultipartFile,但是MultipartFile是空的,请帮忙确认一下,非常感谢,代码如下: File file = new File("/Users/aikaliu/doc
我正在尝试上传超过 1 GB 的文件,我正在使用 Spring Boot。 我已尝试使用以下代码,但出现内存不足错误。 public void uploadFile(MultipartFile fil
我正在使用此代码将图像文件发布到我的 Controller ,但我总是得到文件正文部分的空值。 @RequestMapping(value = "/updateprofile", method = R
我正在使用 angularJs 和 spring 4.0, 我的 Controller 代码: @RequestMapping(value = "/endpoint/add", method = Re
以下是我从网页上传多个文件的函数。我的文件位于 MultipartFile --> 文件变量列表中。我无法迭代每个文件。然而 log.info("file"+files) 打印了 file[]。这意味
我有这样的用户界面代码 .factory('Service', function ($http, $resource, BASE_PATH) { function sendResponse (co
我是一名优秀的程序员,十分优秀!