Struct Stdout
pub struct Stdout { /* private fields */ }
io-std only.A handle to the standard output stream of a process.
Concurrent writes to stdout must be executed with care: Only individual writes to this AsyncWrite are guaranteed to be intact. In particular you should be aware that writes using write_all are not guaranteed to occur as a single write, so multiple threads writing data with write_all may result in interleaved output.
Warning
Each call to stdout() creates a new handle with its own internal state. Writes through different handles are not coordinated, so creating a new handle in a loop can cause output to appear out of order:
// WRONG: creates a new handle each iteration
for i in 0..10 {
let mut out = io::stdout();
out.write_all(b"data").await?;
out.write_all(b"\n").await?;
// out is dropped here; its last write may still be
// running when the next iteration starts
}To preserve order, create one handle outside the loop and reuse it:
let mut out = io::stdout();
for i in 0..10 {
out.write_all(b"data").await?;
out.write_all(b"\n").await?;
}Created by the stdout function.
Examples
use tokio::io::{self, AsyncWriteExt};
#[tokio::main]
async fn main() -> io::Result<()> {
let mut stdout = io::stdout();
stdout.write_all(b"Hello world!").await?;
Ok(())
}The following is an example of using stdio with loop.
use tokio::io::{self, AsyncWriteExt};
#[tokio::main]
async fn main() {
let messages = vec!["hello", " world\n"];
// When you use `stdio` in a loop, it is recommended to create
// a single `stdio` instance outside the loop and call a write
// operation against that instance on each loop.
//
// Repeatedly creating `stdout` instances inside the loop and
// writing to that handle could result in mangled output since
// each write operation is handled by a different blocking thread.
let mut stdout = io::stdout();
for message in &messages {
stdout.write_all(message.as_bytes()).await.unwrap();
stdout.flush().await.unwrap();
}
}Trait Implementations
impl AsFd for Stdout
fn as_fd(&self) -> BorrowedFd<'_>
impl AsHandle for Stdout
fn as_handle(&self) -> BorrowedHandle<'_>
docsrs and Unix and (crate features fs or net) only.impl AsRawHandle for Stdout
fn as_raw_handle(&self) -> RawHandle
docsrs and Unix and (crate features fs or net) only.impl AsyncWrite for Stdout
fn poll_write( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8], ) -> Poll<Result<usize>>
buf into the object. Read more
fn poll_flush( self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Result<(), Error>>
fn poll_shutdown( self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Result<(), Error>>
fn poll_write_vectored( self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &[IoSlice<'_>], ) -> Poll<Result<usize>>
poll_write, except that it writes from a slice of buffers. Read more
fn is_write_vectored(&self) -> bool
poll_write_vectored implementation. Read more
Auto Trait Implementations
impl Freeze for Stdout
impl RefUnwindSafe for Stdout
impl Send for Stdout
impl Sync for Stdout
impl Unpin for Stdout
impl UnsafeUnpin for Stdout
impl UnwindSafe for Stdout
Blanket Implementations
impl<W> AsyncWriteExt for Wwhere W: AsyncWrite + ?Sized,
fn write<'a>(&'a mut self, src: &'a [u8]) -> Write<'a, Self>where Self: Unpin,
io-util only.fn write_vectored<'a, 'b>( &'a mut self, bufs: &'a [IoSlice<'b>], ) -> WriteVectored<'a, 'b, Self>where Self: Unpin,
io-util only.fn write_buf<'a, B>(&'a mut self, src: &'a mut B) -> WriteBuf<'a, Self, B>
io-util only.fn write_all_buf<'a, B>( &'a mut self, src: &'a mut B, ) -> WriteAllBuf<'a, Self, B>
io-util only.fn write_all<'a>(&'a mut self, src: &'a [u8]) -> WriteAll<'a, Self>where Self: Unpin,
io-util only.fn write_u8(&mut self, n: u8) -> WriteU8<&mut Self>where Self: Unpin,
io-util only.fn write_i8(&mut self, n: i8) -> WriteI8<&mut Self>where Self: Unpin,
io-util only.fn write_u16(&mut self, n: u16) -> WriteU16<&mut Self>where Self: Unpin,
io-util only.fn write_i16(&mut self, n: i16) -> WriteI16<&mut Self>where Self: Unpin,
io-util only.fn write_u32(&mut self, n: u32) -> WriteU32<&mut Self>where Self: Unpin,
io-util only.fn write_i32(&mut self, n: i32) -> WriteI32<&mut Self>where Self: Unpin,
io-util only.fn write_u64(&mut self, n: u64) -> WriteU64<&mut Self>where Self: Unpin,
io-util only.fn write_i64(&mut self, n: i64) -> WriteI64<&mut Self>where Self: Unpin,
io-util only.fn write_u128(&mut self, n: u128) -> WriteU128<&mut Self>where Self: Unpin,
io-util only.fn write_i128(&mut self, n: i128) -> WriteI128<&mut Self>where Self: Unpin,
io-util only.fn write_f32(&mut self, n: f32) -> WriteF32<&mut Self>where Self: Unpin,
io-util only.fn write_f64(&mut self, n: f64) -> WriteF64<&mut Self>where Self: Unpin,
io-util only.fn write_u16_le(&mut self, n: u16) -> WriteU16Le<&mut Self>where Self: Unpin,
io-util only.fn write_i16_le(&mut self, n: i16) -> WriteI16Le<&mut Self>where Self: Unpin,
io-util only.fn write_u32_le(&mut self, n: u32) -> WriteU32Le<&mut Self>where Self: Unpin,
io-util only.fn write_i32_le(&mut self, n: i32) -> WriteI32Le<&mut Self>where Self: Unpin,
io-util only.fn write_u64_le(&mut self, n: u64) -> WriteU64Le<&mut Self>where Self: Unpin,
io-util only.fn write_i64_le(&mut self, n: i64) -> WriteI64Le<&mut Self>where Self: Unpin,
io-util only.fn write_u128_le(&mut self, n: u128) -> WriteU128Le<&mut Self>where Self: Unpin,
io-util only.fn write_i128_le(&mut self, n: i128) -> WriteI128Le<&mut Self>where Self: Unpin,
io-util only.fn write_f32_le(&mut self, n: f32) -> WriteF32Le<&mut Self>where Self: Unpin,
io-util only.fn write_f64_le(&mut self, n: f64) -> WriteF64Le<&mut Self>where Self: Unpin,
io-util only.impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/io/struct.Stdout.html