使用缓冲区读写文件的正确姿势是什么?


#1

我的主要需求是使用Julia从一个流中读取数据,处理后写入另一个流。
然而我发现write方法不能指定写入数组的offset和length,只好用range索引代替了。
1 这个代码有什么性能问题吗?
2 使用eof来控制循环是否正确?
谢谢

ARGS=[raw"C:\Users\Azure\Desktop\28563189-128-5338f17ba524e827eef4ead25bf298cb.uc"]
for filename in ARGS
    input=open(filename,"r")
    output=open(filename*".mp3","w")
    buffer=zeros(UInt8,4096)
    while !eof(input)
        nbytes=readbytes!(input,buffer)
        map!(b->b⊻0xA3,buffer,buffer)
        write(output,buffer[1:nbytes])
    end
    close(input)
    close(output)
end

#2
  1. 性能问题有待其他人解答;也可以先看看 性能建议 · Julia中文文档
  2. !eof 确实有这种用法,官方文档里就有
while !eof(stdin)
    x = read(stdin, Char)
    println("Found: $x")
end

—— 网络和流 · Julia中文文档


#3

view(buffer, 1:nbytes) 可以避免拷贝。

julia> using BenchmarkTools

julia> buffer = zeros(UInt8, 4096);

julia> @btime buffer[1:128];
  49.483 ns (2 allocations: 256 bytes)

julia> @btime view(buffer, 1:128);
  24.708 ns (2 allocations: 80 bytes)

当然,而且要把整个东西写到函数里面。


#4

了解,感谢
我一开始想到的是Iterators.take,然后发现并没有针对迭代器的write