13

ストリームに開いて別のメソッドに渡すファイルがあります。ただし、ストリームを他のメソッドに渡す前に、ファイル内の文字列を置き換えたいと思います。そう:

string path = "C:/...";
Stream s = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
//need to replace all occurrences of "John" in the file to "Jack" here.
CallMethod(s);

元のファイルは変更しないでください。ストリームのみを変更してください。これを行う最も簡単な方法は何ですか?

ありがとう...

4

3 に答える 3

15

Streamstream はテキスト ファイルとバイナリ ファイルの両方を処理し、1 文字で読み取ることができる必要があるため、単にファイルを行として読み込んでからそれらを処理する方がはるかに簡単です。一度に(このような交換は非常に困難になります)。一度に 1 行全体を読み取る場合 (複数行の置換がない限り) は非常に簡単です。

var lines = File.ReadLines(path)
    .Select(line => line.Replace("John", "Jack"));

ReadLinesそれでもデータをストリーミングし、すべてを具体化する必要はないことに注意してください。そのSelectため、これを行うときにファイル全体を一度にメモリに読み込むわけではありません。

実際にデータをストリーミングする必要がない場合は、すべてを 1 つの大きな文字列として簡単にロードし、置換を行ってから、その 1 つの文字列に基づいてストリームを作成できます。

string data = File.ReadAllText(path)
    .Replace("John", "Jack");
byte[] bytes = Encoding.ASCII.GetBytes(data);
Stream s = new MemoryStream(bytes);
于 2013-09-16T19:36:51.953 に答える
2

この質問には、おそらく多くの良い答えがあります。私は私が使っていて、常に私と私の仲間のために働いてきたものを試してみます.

別のストリームを作成することをお勧めしますMemoryStream。ファイルストリームから読み取り、メモリストリームに書き込みます。次に、いずれかから文字列を抽出して置換し、メモリ ストリームを先に渡すことができます。これにより、元のストリームを台無しにしないことが確実になり、必要なときにいつでも元の値を読み取ることができますが、この方法を使用すると基本的に 2 倍のメモリを使用します。

于 2013-09-16T19:37:49.270 に答える