Jam*_*gle 767
我知道的最短解决方案:
using(var memoryStream = new MemoryStream())
{
sourceStream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
ped*_*des 152
调用下一个函数就好
byte[] m_Bytes = StreamHelper.ReadToEnd (mystream);
Run Code Online (Sandbox Code Playgroud)
功能:
public static byte[] ReadToEnd(System.IO.Stream stream)
{
long originalPosition = 0;
if(stream.CanSeek)
{
originalPosition = stream.Position;
stream.Position = 0;
}
try
{
byte[] readBuffer = new byte[4096];
int totalBytesRead = 0;
int bytesRead;
while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)
{
totalBytesRead += bytesRead;
if (totalBytesRead == readBuffer.Length)
{
int nextByte = stream.ReadByte();
if (nextByte != -1)
{
byte[] temp = new byte[readBuffer.Length * 2];
Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
readBuffer = temp;
totalBytesRead++;
}
}
}
byte[] buffer = readBuffer;
if (readBuffer.Length != totalBytesRead)
{
buffer = new byte[totalBytesRead];
Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);
}
return buffer;
}
finally
{
if(stream.CanSeek)
{
stream.Position = originalPosition;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*ker 44
在.NET Framework 4及更高版本中,Stream该类具有CopyTo可以使用的内置方法.
对于框架的早期版本,方便的帮助函数是:
public static void CopyStream(Stream input, Stream output)
{
byte[] b = new byte[32768];
int r;
while ((r = input.Read(b, 0, b.Length)) > 0)
output.Write(b, 0, r);
}
Run Code Online (Sandbox Code Playgroud)
然后使用上述方法之一复制到a MemoryStream并调用GetBuffer它:
var file = new FileStream("c:\\foo.txt", FileMode.Open);
var mem = new MemoryStream();
// If using .NET 4 or later:
file.CopyTo(mem);
// Otherwise:
CopyStream(file, mem);
// getting the internal buffer (no additional copying)
byte[] buffer = mem.GetBuffer();
long length = mem.Length; // the actual length of the data
// (the array may be longer)
// if you need the array to be exactly as long as the data
byte[] truncated = mem.ToArray(); // makes another copy
Run Code Online (Sandbox Code Playgroud)
编辑:最初我建议使用Jason的答案来Stream支持该Length属性.但它有一个缺陷,因为它假设Stream将所有内容返回到一个单独的Read,这不一定是真的(Socket例如,不是a ).我不知道Stream在BCL中是否有一个实现的例子确实支持Length但可能会以比您请求的更短的块返回数据,但是任何人都Stream可以轻易地继承这种情况.
对于大多数情况来说,使用上述通用解决方案可能更简单,但假设您确实希望直接读入以下数组bigEnough:
byte[] b = new byte[bigEnough];
int r, offset;
while ((r = input.Read(b, offset, b.Length - offset)) > 0)
offset += r;
Run Code Online (Sandbox Code Playgroud)
也就是说,重复调用Read并移动您将存储数据的位置.
小智 27
byte[] buf; // byte array
Stream stream=Page.Request.InputStream; //initialise new stream
buf = new byte[stream.Length]; //declare arraysize
stream.Read(buf, 0, buf.Length); // read from stream to byte array
Run Code Online (Sandbox Code Playgroud)
JCH*_*H2k 23
我使用这个扩展类:
public static class StreamExtensions
{
public static byte[] ReadAllBytes(this Stream instream)
{
if (instream is MemoryStream)
return ((MemoryStream) instream).ToArray();
using (var memoryStream = new MemoryStream())
{
instream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
}
}
Run Code Online (Sandbox Code Playgroud)
只需将类复制到您的解决方案中,您就可以在每个流上使用它:
byte[] bytes = myStream.ReadAllBytes()
Run Code Online (Sandbox Code Playgroud)
适用于我的所有流,并保存了大量代码!当然,如果需要,您可以修改此方法以使用其他一些方法来提高性能,但我希望保持简单.
小智 18
Byte[] Content = new BinaryReader(file.InputStream).ReadBytes(file.ContentLength);
Run Code Online (Sandbox Code Playgroud)
如果您从移动设备或其他设备发布文件
byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}
Run Code Online (Sandbox Code Playgroud)
好吧,也许我在这里遗漏了一些东西,但这就是我这样做的方式:
public static Byte[] ToByteArray(this Stream stream) {
Int32 length = stream.Length > Int32.MaxValue ? Int32.MaxValue : Convert.ToInt32(stream.Length);
Byte[] buffer = new Byte[length];
stream.Read(buffer, 0, length);
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
Stream s;
int len = (int)s.Length;
byte[] b = new byte[len];
int pos = 0;
while((r = s.Read(b, pos, len - pos)) > 0) {
pos += r;
}
Run Code Online (Sandbox Code Playgroud)
一个稍微复杂的解决方案是必要s.Length的Int32.MaxValue。但是,如果您需要将这么大的流读取到内存中,您可能需要考虑采用不同的方法来解决问题。
编辑:如果您的流不支持该Length属性,请使用 Earwicker 的解决方法进行修改。
public static class StreamExtensions {
// Credit to Earwicker
public static void CopyStream(this Stream input, Stream output) {
byte[] b = new byte[32768];
int r;
while ((r = input.Read(b, 0, b.Length)) > 0) {
output.Write(b, 0, r);
}
}
}
[...]
Stream s;
MemoryStream ms = new MemoryStream();
s.CopyStream(ms);
byte[] b = ms.GetBuffer();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
415708 次 |
| 最近记录: |