在java中你可以这样做:
File file = new File(filepath);
PrintStream pstream = new PrintStream(new FileOutputStream(file));
System.setOut(pstream);
byte[] bytes = GetBytes();
System.out.write(bytes);
我想在C#中做类似的事情。我试过这个,但它不起作用:
StreamWriter writer = new StreamWriter(filepath);
Console.SetOut(writer);
byte[] bytes = GetBytes();
Console.Out.Write(bytes);
看起来这里的主要问题是Write方法不接受字节数组作为参数。
我知道我可以使用File.WriteAllBytes(文件路径,字节),但我希望保持C#代码尽可能接近原始的java代码。
答案 0 :(得分:3)
我知道我可以使用File.WriteAllBytes(文件路径,字节),但我希望保持C#代码尽可能接近原始的java代码。
Java代码做了一些你不应该做的事情:它将二进制数据写入标准输出,标准流不是为二进制数据设计的,它们的设计考虑了文本。 .NET在这里做“正确的事情”,并为您提供文本接口,而不是二进制数据接口。
因此,正确的方法是将数据直接写入文件,而不是标准输出。
作为一种解决方法,您可以伪造它并使用自.NET的“不变”编码以来不起作用字符串是UTF-16,它不接受每个字节输入有效;例如,字节数组byte
范围内的不变编码将字节转换为字符:new byte[] { 0xFF }
是无效的UTF-16代码序列。
答案 1 :(得分:0)
不是just
File.WriteAllBytes(filepath, GetBytes())
或者你可以做到,
using (var writer = new StreamWriter(filepath))
{
var bytes = GetBytes();
writer.BaseStream.Write(bytes, 0, bytes.Length)
};
将StreamWriter
传递给SetOut
后,它只会公开不允许访问内部流的基础TextWriter
。这是有道理的,因为Console旨在为用户提供输出。我猜它是非标准的输出arbritary二进制到控制台。