1

在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(filepath, bytes),但我希望 C# 代码尽可能接近原始的 java 代码。

4

2 回答 2

3

我知道我可以使用 File.WriteAllBytes(filepath, bytes),但我希望 C# 代码尽可能接近原始的 java 代码。

Java 代码做了一些你不应该做的事情:它将二进制数据写入标准输出,而标准流不是为二进制数据设计的,它们在设计时考虑到了文本。.NET 在这里做了“正确的事”,并为您提供了一个文本接口,而不是二进制数据接口。

因此,正确的方法是将数据直接写入文件,而不是标准输出。

作为一种解决方法,您可以伪造它并使用以下范围的不变编码将字节转换为字符byte不起作用,因为 .NET 字符串的“不变”编码是 UTF-16,它不接受每个字节输入都是有效的;例如,字节数组new byte[] { 0xFF }是无效的 UTF-16 代码序列。

于 2013-01-09T17:39:31.660 回答
0

只是

File.WriteAllBytes(filepath, GetBytes())

或者你可以这样做,

using (var writer = new StreamWriter(filepath))
{
    var bytes = GetBytes();
    writer.BaseStream.Write(bytes, 0, bytes.Length)
};

一旦你将它传递StreamWriterSetOut它,它只会暴露TextWriter不允许访问内部流的基础。这是有道理的,因为 Console 是为向用户提供输出而设计的。我想将任意二进制文件输出到控制台是非标准的。

于 2013-01-09T17:32:10.807 回答