我得到了一个StreamReader
对象的结果。
我想将结果转换为byte[]
。
如何将StreamReader
转换为byte[]
?
谢谢
将读入的数据全部放到MemoryStream
中,最后获取字节数组。注意,应该从底层流中读取原始字节。
var bytes = default(byte[]);
using (var memstream = new MemoryStream())
{
var buffer = new byte[512];
var bytesRead = default(int);
while ((bytesRead = reader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
memstream.Write(buffer, 0, bytesRead);
bytes = memstream.ToArray();
}
如果您不想管理缓冲区:
var bytes = default(byte[]);
using (var memstream = new MemoryStream())
{
reader.BaseStream.CopyTo(memstream);
bytes = memstream.ToArray();
}
var ms = new MemoryStream();
yourStreamReader.BaseStream.CopyTo(ms); // blocking call till the end of the stream
ms.GetBuffer().CopyTo(yourArray, ms.Length);
或者
var ms = new MemoryStream();
var ct = yourStreamReader.BaseStream.CopyToAsync(ms);
await ct;
ms.GetBuffer().CopyTo(yourArray, ms.Length);
using (var stream = File.OpenRead("your_file.ext"))
{
var length = stream.Length;
if (length <= int.MaxValue)
{
var result = new byte[length];
var bytesRead = stream.Read(result, 0, (int)length);
if (bytesRead == length) return result;
}
//fallback
using (var memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
}
BlobClient blob = container.GetBlobClient(path);
//blob.DownloadTo(@"temp\"+ file);
var response = blob.DownloadContent();
var stream = response.Value.Content.ToStream();
using (var sr = new StreamReader(stream))
{
using (MemoryStream ms = new MemoryStream())
{
sr.BaseStream.CopyTo(ms);
return Convert.ToBase64String(ms.ToArray()) ;
}
}
你可以使用这段代码:你不应该使用这段代码:
byte[] bytes = streamReader.CurrentEncoding.GetBytes(streamReader.ReadToEnd());
对于那些建议获取字节并将其复制到MemoryStream
等的人-如果内容不会比计算机内存允许的更大,为什么不直接使用StreamReader
的内置ReadLine()
或ReadToEnd()
呢?我看到这些甚至没有被提到,它们可以为您完成所有操作。
我有一个用例,我只想存储用户在同步/初始化过程中选择的SQLite文件的路径,从FileDialogResult
中。然后,当程序运行正常应用程序进程时,我的程序稍后需要使用此路径。也许不是捕获/重用信息的理想方式,但与编写/读取.ini文件没有什么区别-我只是不想为一个值设置一个.ini文件。所以我只是从一个平面的单行文本文件中读取它。这是我做的:
string filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!filePath.EndsWith(@"\")) temppath += @"\"; // ensures we have a slash on the end
filePath = filePath.Replace(@"\\", @"\"); // Visual Studio escapes slashes by putting double-slashes in their results - this ensures we don't have double-slashes
filePath += "SQLite.txt";
string path = String.Empty;
FileStream fs = new FileStream(filePath, FileMode.Open);
StreamReader sr = new StreamReader(fs);
path = sr.ReadLine(); // can also use sr.ReadToEnd();
sr.Close();
fs.Close();
fs.Flush();
return path;
byte[]
而不是一个 string
,那么可以使用我的示例进行转换:byte[] toBytes;
FileStream fs = new FileStream(filePath, FileMode.Open);
StreamReader sr = new StreamReader(fs);
toBytes = Encoding.ASCII.GetBytes(path);
sr.Close();
fs.Close();
fs.Flush();
return toBytes;
(返回toBytes
而不是path
。)
如果您不想使用ASCII
,可以轻松地将其替换为UTF8
、Unicode
等。
Encoding.ASCII.GetBytes()
,还有Encoding.UTF8.GetBytes()
,Encoding.Unicode.GetBytes()
等。在批评答案之前,请使用智能感知。 - vapcguy
default()
的使用是什么意思?我认为这并没有使事情更加可读。 - Matti Virkkunenvar
关键字(对于大多数局部变量)。我不指望每个人都能接受它,但我可以接受。 - Jeff MercadoMemoryStream
可能会更高效,因为它被设计用于高效处理字节数组。例如,您可以使用Write
仅添加数组的一部分(与List<T>
上的AddRange
不同),而且它不通过接口访问字节数组,这可能会略微降低效率。您还可以直接使用GetBuffer()
获取底层数组,而无需创建其副本。当然,这只在您有大量数据时才重要。 - Matti VirkkunenGetBuffer()
没有在构造函数中传入底层字节数组(即MemoryStream
所包装的数组),它将仅返回该数组。否则,您必须使用ToArray()
。至于var
的东西,我处理的很多代码(特别是其他语言)使用隐式类型,对于本地变量,我喜欢使用它,但对于委托/lambda等有例外。这有点难以解释,所以我就这样了。 :) - Jeff Mercado