use std::fs::File;
use std::io::{self, Read, Write};
fn main() -> io::Result<()> {
// νμΌ μ½κΈ°
let mut file = File::open("input.txt")?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
// νμΌ μ°κΈ°
let mut file = File::create("output.txt")?;
file.write_all(contents.as_bytes())?;
Ok(())
}
ν° νμΌμ λ€λ£° λμλ BufReaderλ₯Ό μ¬μ©νλ©΄ λ©λͺ¨λ¦¬λ₯Ό ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μμ΅λλ€.
use std::fs::File;
use std::io::{self, BufReader};
fn main() -> io::Result<()> {
let file = File::open("large_file.txt")?;
let reader = BufReader::new(file);
for line in reader.lines() {
println!("{}", line?);
}
Ok(())
}
Tokioλ₯Ό μ¬μ©νλ©΄ λΉλκΈ°λ‘ νμΌμ μ²λ¦¬ν μ μμ΅λλ€. I/O μμ μ€ λ€λ₯Έ μμ μ μνν μ μμ΄μ μΉ μλ²λ λμμ μ¬λ¬ νμΌμ μ²λ¦¬ν΄μΌ νλ κ²½μ°μ μ μ©ν©λλ€.
use tokio::fs::File;
use tokio::io::{self, AsyncReadExt, AsyncWriteExt};
async fn handle_file() -> io::Result<()> {
let mut file = File::open("input.txt").await?;
let mut contents = String::new();
file.read_to_string(&mut contents).await?;
let mut file = File::create("output.txt").await?;
file.write_all(contents.as_bytes()).await?;
Ok(())
}
μ¬λ¬ νμΌμ λμμ μ²λ¦¬ν μλ μμ΅λλ€.
use tokio::fs;
use futures::future::join_all;
async fn process_files(files: Vec<String>) -> io::Result<()> {
let handles: Vec<_> = files.into_iter()
.map(|file| tokio::spawn(async move {
let contents = fs::read_to_string(file).await?;
// νμΌ μ²λ¦¬ λ‘μ§
Ok::<(), io::Error>(())
}))
.collect();
join_all(handles).await?;
Ok(())
}
λκΈ°μμ μμ
μ΄ μλ£λ λκΉμ§ μ€λ λκ° λΈλ‘νΉλμ§λ§ ꡬνμ΄ λ¨μν©λλ€.
λΉλκΈ°μμ I/O λκΈ° μ€ λ€λ₯Έ μμ
μ μνν μ μμ§λ§ tokio κ°μ λ°νμμ΄ νμν©λλ€.
CLI λꡬλ μ€μ νμΌ λ‘λ©μ²λΌ λ¨μν κ²½μ°μλ λκΈ°μμ΄ μ ν©νκ³ , μΉ μλ²λ λλ νμΌ μ²λ¦¬μλ λΉλκΈ°μμ΄ μ ν©ν©λλ€.
λ²νΌ ν¬κΈ°λ₯Ό μ‘°μ νκ±°λ λ©λͺ¨λ¦¬ λ§€νμ μ¬μ©ν μ μμ΅λλ€.
use std::io::BufReader;
let file = File::open("large_file.txt")?;
let reader = BufReader::with_capacity(64 * 1024, file); // 64KB λ²νΌ
use memmap2::MmapOptions;
let file = File::open("large_file.txt")?;
let mmap = unsafe { MmapOptions::new().map(&file)? };