当我在阻塞文件描述符上需要缓冲IO时,我使用stdio.但是如果我根据手动将文件描述符转换为非阻塞模式,则stdio缓冲是不可用的.经过一些研究后,我发现BIO可用于缓冲非阻塞IO.
但可能还有其他选择吗?
我需要这样做以避免在多连接环境中使用线程.
考虑 Windows 命令外壳 cmd.exe 中的管道:
C:\>feed | filter
Run Code Online (Sandbox Code Playgroud)
馈送过程的标准输出似乎直到馈送过程运行完成后才能达到过滤过程的标准输入。
这种类型的“缓冲”可能会导致长时间运行的馈送过程的输出消息出现烦人的延迟(您可能希望在早期失败时按“ctrl-c”来中断它)。
有没有办法避免这种情况,以便一旦数据可用,馈送过程的标准输出就达到过滤过程的标准输入?(无缓冲)
例如,以下简化示例:
feed.bat:
@echo off
echo something
sleep 3
echo something else
Run Code Online (Sandbox Code Playgroud)
过滤器.bat:
@echo off
for /F "tokens=*" %%a in ('more') do (
echo _%%a
)
Run Code Online (Sandbox Code Playgroud)
以下命令直到 3 秒后(睡眠完成时)才显示任何内容:
C:\>feed | filter
_something
_something else
Run Code Online (Sandbox Code Playgroud)
所需的行为是打印 '_something',然后延迟 3 秒,然后打印 '_something else'。
reader = new BufferedReader(new InputStreamReader(inputStream))reader = new InputStreamReader(new BufferedInputStream(inputStream))哪个更好?为什么?
所以我最近做了一些工作,当有人告诉我,如果在Stream.Read网络流上做一个通过调用.NET GetResponseStream上的一个WebResponse或者那些被缓冲的.
他说如果你要在你正在阅读的代码中设置一个断点,你就不会停止网络流量.我发现这很奇怪,但也希望这是真的.这是如何运作的?它甚至准确吗?
using (Stream webResponseStream = this.webResponse.GetResponseStream())
{
byte[] readBuffer = new byte[bufferSize];
int bytesRead = webResponseStream.Read(readBuffer, 0, bufferSize);
while (bytesRead > 0)
{
bytesRead = webResponseStream.Read(readBuffer, 0, bufferSize);
// If I put a breakpoint here, does network activity stop?
}
}
Run Code Online (Sandbox Code Playgroud) 在缓冲流的情况下,它在一本书中说它等到缓冲区已满,然后写回监视器.例如:
cout << "hi";
Run Code Online (Sandbox Code Playgroud)
"缓冲区已满"是什么意思.
cerr << "hi";
Run Code Online (Sandbox Code Playgroud)在我的书中说,发送到的所有内容都会cerr立即写入标准错误设备,这是什么意思?
char *ch;
cin>> ch; // I typed "hello world";
Run Code Online (Sandbox Code Playgroud)在这个例子ch中将被分配为"hello"并且"world"将被忽略是否意味着它仍然在缓冲区并且它将影响未来语句的结果?
据我所知,默认情况下,C++支持的所有流IO都是缓冲的.
这意味着要输出的数据被放入缓冲区直到它已满,然后被发送到输出设备,类似于输入,一旦缓冲区为空,就会读取数据...所有这一切都是为了使数量昂贵的系统电话可以最小化.
但是如何验证这种行为.我的意思是考虑以下代码
int main()
{
cout << "Hello world\n";
return 0
}
Run Code Online (Sandbox Code Playgroud)
缓冲在哪里成像?我知道有缓冲发生,但如何解释呢?屏幕上会立即看到输出,那么实际看到缓冲I/O的代码示例是什么呢?
嘿.我正在尝试编写一个小程序,它将在最后一次出现"0xFF 0xC0 0x00 0x11"后读取后面的四个字节,这些字节可以很容易地转换为二进制或十进制.目的是最后一次出现该六角形图案后的2-5个字节表示JPEG文件的宽度和高度.
#include <stdio.h>
int main () {
FILE * pFile;
long lSize;
char * buffer;
size_t result;
pFile = fopen ( "pano8sample.jpg" , "rb" );
if(pFile==NULL){
fputs ("File error",stderr);
exit (1);
}
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
printf("\n\nFile is %d bytes big\n\n", lSize);
buffer = (char*) malloc (sizeof(char)*lSize);
if(buffer == NULL){
fputs("Memory error",stderr);
exit (2);
}
result = fread (buffer,1,lSize,pFile);
if(result != lSize){
fputs("Reading error",stderr);
exit (3);
}
//0xFF 0xC0 …Run Code Online (Sandbox Code Playgroud) 无缓冲I / O和标准I / O有什么区别?我知道使用read(),write(),close()是无缓冲的IO。Printf和gets是缓冲的IO。我也知道,对于大事务,最好使用缓冲IO。我只是不知道为什么。在这种情况下,术语“缓冲”是什么意思?
media.seekable我想知道 HTML5 媒体元素 和之间有什么区别media.buffered?
关闭缓冲读取器时程序冻结。使用 forge modding API 进行我的世界,但是我之前在使用独立服务器端代码时遇到过这个问题。这个特定的代码工作正常,然后随机开始给我这个问题,不知道如何解决这个问题..
关闭方法:
public static void closeConnection() {
if (keepConnection) {
keepConnection = false;
try {
bufferedReader.close();
printWriter.close();
socket.close();
}
catch (IOException e) {
e.printStackTrace();
}
finally{
token = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经检查以确保这确实是发生冻结的地方。有任何想法吗?