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)
};

を渡すStreamWriterと、内部ストリームへのアクセスを許可しないSetOutベースのみが公開されます。TextWriterコンソールはユーザーに出力を提供するように設計されているため、これは理にかなっています。任意のバイナリをコンソールに出力するのは非標準だと思います。

于 2013-01-09T17:32:10.807 に答える