当Windows XP和Vista中的磁盘策略设置为在硬盘上启用写入缓存时,是否有办法刷新刚刚写入的文件,并确保它已提交到磁盘?
我想在C++中以编程方式执行此操作.
关闭文件会在应用程序级别执行刷新,但不会在操作系统级别执行刷新.如果在关闭文件后从PC中断电,但在操作系统刷新磁盘写入缓存之前,文件将丢失,即使它已关闭.
我已经阅读了这篇文章,我不知道这是否是一个愚蠢的问题。我是反应式编程的新手。
问题很简单:假设我有一个完全反应式的后端,我怎样才能流式传输到浏览器(例如一个大文本),并在每个块来自服务器时立即将它们打印给用户?
可能我遗漏了一些重要的概念点,但我需要知道的是:我可以通过一个 HTTP GET(?或不)请求发送一小部分数据(从服务器到浏览器)吗?关键是:我可以写那些小部分,直到全部数据发送出去吗?
谢谢你的帮助。我之前确实尝试过 google,但我总是得到有关其他概念(如 websockets、长轮询、react.js)的信息,我认为情况并非如此。
编辑:我不是要求特定的 API ou 库。我只是想理解这个概念,例如:“你不能用 HTTP 协议做到这一点,句号!” 或“这与响应式编程无关,您对流的真正含义感到困惑。请参阅'something_else.js'”。
EDIT2:我使用 spring-mvc (spring-boot) 和这个方法做了一个小的休息控制器:
@RequestMapping(value = "/flush", method = RequestMethod.GET)
public void flushTest(HttpServletResponse response) {
response.setContentType("text/html");
response.setStatus(SC_OK);
try (ServletOutputStream outputStream = response.getOutputStream()) {
for (int i = 0; i < 3; i++) {
String chunk = "chunk_" + i;
outputStream.print(chunk);
outputStream.flush();
response.flushBuffer();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
在浏览器中,即使使用了flushBuffer,也只有整个响应到达。经过一番研究,这可能是一个 TOMCAT 问题,我改变了我的 pom.xml,包括 undertow:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
使用默认配置:
server.undertow.accesslog.enabled=true
server.undertow.accesslog.dir=target/logs …Run Code Online (Sandbox Code Playgroud)