- 主题:java,这样统计下载耗时,为什么总是0毫秒?
是Spring帮你关闭的,如果你返回responseentity对象的话
【 在 feng321 (sfdf) 的大作中提到: 】
: 代码里没看到close啊。在哪里?
: 【 在 zzq031212 的大作中提到: 】
: : 统计时间放到close之后
: --
--
FROM 223.104.3.*
他本来是做测试的,啥都不懂
【 在 shaolin (我的大小宝贝儿...) 的大作中提到: 】
: 改改不就行了。
: 类点进去看看数据结构,比着拼个。
:
: 你这啥都伸手要啊?
--
FROM 223.104.3.*
测试为什么要写侵入性这么强的代码,不应该写一段客户端代码去下载这个文件,统计下载的时间
【 在 nikezhang 的大作中提到: 】
: 他本来是做测试的,啥都不懂
--
FROM 121.32.127.*
你的方法返回流陈工,就结束了
只不过网络上传输文件的内容这件事情(真正的把数据流传递给浏览器端)并没有结束,
这种情况下要统计时间可能要用一个异步结束callback才行
【 在 feng321 的大作中提到: 】
: [code=java]
: // 设置响应头
: HttpHeaders headers = new HttpHeaders();
: ...................
--
FROM 61.69.255.*
能给个可以跑的样例代码吗?真是不太会。。。。
【 在 realdonald 的大作中提到: 】
: 你的方法返回流陈工,就结束了
: 只不过网络上传输文件的内容这件事情(真正的把数据流传递给浏览器端)并没有结束,
: 这种情况下要统计时间可能要用一个异步结束callback才行
: ...................
--
FROM 120.242.240.*
这统计的是把文件写入对象里的时间,return之后才开始传输
【 在 feng321 的大作中提到: 】
: [code=java]
: // 设置响应头
: HttpHeaders headers = new HttpHeaders();
: ...................
--
FROM 122.115.35.*
你提到的问题是由于在返回ResponseEntity之后,实际的文件传输是在客户端和服务器之间进行的,而不是在服务器端的代码中。因此,你无法直接在服务器端代码中准确地统计文件下载的耗时。
要准确地统计文件下载的耗时,你可以在客户端代码中进行统计。在客户端发起下载请求后,可以记录开始时间,然后在下载完成时记录结束时间,并计算时间差来获取下载耗时。
以下是一个示例,演示如何在客户端代码中统计文件下载的耗时:
long startTime = System.currentTimeMillis();
// 发起下载请求的客户端代码
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
System.out.println("文件下载耗时:" + duration + " 毫秒");
在这个示例中,我们在客户端代码中使用System.currentTimeMillis()方法来获取当前时间,并在发起下载请求的代码块前后记录时间。然后,我们计算时间差(结束时间减去开始时间)来获取下载耗时,并将其打印出来。
请注意,这种方式只能在客户端代码中统计文件下载的耗时,而无法在服务器端代码中准确地统计。因为服务器端代码只负责生成并返回ResponseEntity,而实际的文件传输是在客户端和服务器之间进行的。
————chatgpt的回答。我另一个代码似乎可以统计耗时,但是无法返回response对象?
【 在 crossgate 的大作中提到: 】
: 这统计的是把文件写入对象里的时间,return之后才开始传输
:
--
FROM 120.242.240.*
没写过,你试试chatgpt的回答吧
import java.io.IOException;
import java.io.OutputStream;
import java.util.function.Consumer;
public class TimedOutputStream extends OutputStream {
private final OutputStream delegate;
private final Consumer<Long> completionCallback;
private final long startTime;
public TimedOutputStream(OutputStream delegate, Consumer<Long> completionCallback) {
this.delegate = delegate;
this.completionCallback = completionCallback;
this.startTime = System.currentTimeMillis();
}
@Override
public void write(int b) throws IOException {
delegate.write(b);
}
@Override
public void close() throws IOException {
delegate.close();
long endTime = System.currentTimeMillis();
long timeConsumed = endTime - startTime;
completionCallback.accept(timeConsumed);
}
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.OutputStream;
import java.util.concurrent.Executors;
@RestController
@RequestMapping("/download")
public class FileDownloadController {
@GetMapping("/stream")
public ResponseBodyEmitter streamData() {
ResponseBodyEmitter emitter = new ResponseBodyEmitter();
// Wrap the emitter's OutputStream with the TimedOutputStream
OutputStream outputStream = new TimedOutputStream(emitter.getOutputStream(),
timeConsumed -> {
// Handle completion here, e.g., logging the time consumed
System.out.println("Time consumed: " + timeConsumed + " ms");
});
// Simulate streaming data (replace with your actual data source)
Executors.newSingleThreadExecutor().submit(() -> {
try {
for (int i = 0; i < 10; i++) {
outputStream.write(("Data " + i + "\n").getBytes());
Thread.sleep(500); // Simulate data processing
}
} catch (Exception e) {
emitter.completeWithError(e);
} finally {
try {
outputStream.close();
} catch (IOException e) {
emitter.completeWithError(e);
}
}
emitter.complete();
});
return emitter;
}
}
【 在 feng321 的大作中提到: 】
: 能给个可以跑的样例代码吗?真是不太会。。。。
--
FROM 61.69.255.*
谢谢
【 在 realdonald 的大作中提到: 】
: 没写过,你试试chatgpt的回答吧
: import java.io.IOException;
: import java.io.OutputStream;
: ...................
--
FROM 120.242.240.*