【问题标题】:How can you use Console.Out to write a byte[] to a file?如何使用 Console.Out 将 byte[] 写入文件?
【发布时间】:2012-12-23 22:55:25
【问题描述】:

在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 代码。

【问题讨论】:

  • 为什么不直接将字节写入StreamWriter?字节不写到控制台,字符串是。您拥有的 Java 代码正在将字节数组的字符串 representation 写入控制台。您需要模拟 Java 使用的表示并将其写入StreamWriter
  • 删除[java]标签作为答案不会是关于java的。
  • 简而言之,您根本不应该这样做。标准输入和输出仅限于文本,而不是二进制数据。

标签: c# stream console textwriter


【解决方案1】:

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

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

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

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

【讨论】:

  • 这回答了我的问题。但是,我想指出您提出的解决方法不起作用:Console.Out.Write(Encoding.GetEncoding(1252).GetString(bytes))。您确定 1252 是正确的代码页吗?
  • 65001 也不起作用。没关系。我会忘记 Console.Out 的。谢谢。
  • @John Windows-1252 是一种 8 位编码,应将每个字节转换为唯一字符。不过,这些字符在内部是 UTF-16,并且输出为 UTF-8,所以我对它不起作用并不感到惊讶。我认为没有办法让它真正发挥作用。
  • @IsmetAlkan 不,它应该是 UTF-16(即 Encoding.Unicode),但不幸的是,这不起作用,因为并非所有字节序列都是有效的 UTF-16。
【解决方案2】:

不是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 是为向用户提供输出而设计的。我想将任意二进制输出到控制台是不标准的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 2011-05-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2012-10-22
    相关资源
    最近更新 更多