我试图通过从Java移植代码来格式化C#中的字节数组.在Java中,使用方法"buf.putInt(value);",buf.putShort,buf.putDouble,(等等).但是我不知道如何将它移植到C#.我已经尝试过MemoryStream类,但是没有方法可以在字节数组的末尾放置特定的类型.
问题:C#中Java的"ByteBuffer.putType(value)"的等价物是什么?谢谢!
我正在尝试将数据库保存为由itextsharp生成的pdf文件.但是,到目前为止我还没有成功.
我正在使用Linq来实现sql.
这是代码:
MemoryStream ms = new MemoryStream();
Document d = new Document(PageSize.A4, 60, 60, 40, 40);
PdfWriter w = PdfWriter.GetInstance(d, ms);
w.CloseStream = false;
string txtTemplate = "";
Encoding en = Encoding.GetEncoding("iso-8859-1");
StreamReader sr = new StreamReader(HttpContext.Current.Server.MapPath("~/Content/templates/CessaoDireitosDica.txt"), en);
txtTemplate = sr.ReadToEnd();
sr.Close();
string conselhos = "";
Font font = new Font(Font.HELVETICA, 11, Font.NORMAL);
font.SetColor(0xC6, 0xC6, 0xC6);
Paragraph txtBody = new Paragraph(txtTemplate, font);
txtBody .SetAlignment(ElementTags.ALIGN_JUSTIFIED);
d.Open();
d.Add(txtBody);
d.Close();
byte[] pdfDone = ms.ToArray();
w.Flush();
ms.Flush();
ms.Close();
return pdfDone;
Run Code Online (Sandbox Code Playgroud)
它不会抛出任何错误,但它不会在DB中保存任何内容.DB字段是"图像"字段类型.我也使用这段代码动态渲染pdf(我切断了byte [] pdfDone …
我正处于开发解密解密数千台笔记本电脑硬盘的解决方案的初级阶段.
我认为创建一个可以处理所有数据库调用,客户端更新,客户端命令和状态更新的父应用程序会很有用.此应用程序可以作为服务运行,也可以作为计算机启动的.EXE运行.
然后让子应用程序执行所有解密和验证任务,并记录到XML文件.
在需要新功能的情况下,我认为可能需要更新孩子.这就是我想要以最合理的方式更新它的地方,我的第一个想法是将它作为BLOB存储在SQL中,然后根据需要从父应用程序中将其拉下来.
这听起来合理吗?需要注意的一件事是我的目标计算机都是.NET 2.0.
所以我使用StreamReader使用MemoryStream写入StreamWriter并在此应用程序内部,但内存使用量增加300mb(来自其中一个较大的输入)并且在完成使用后不会释放:
StreamWriter log = new StreamWriter("tempFile.txt");
log.Write(reader.ReadToEnd());
log.Close();
reader.DiscardBufferedData();
reader.Close();
reader.Dispose();
memoryStream.Dispose();
log.Dispose();
GC.Collect();
Run Code Online (Sandbox Code Playgroud)
在此之前和我获得RAM使用之后,它比之前少300 MB,但我不知道为什么.考虑到这里唯一发生的事情就是将读取器中的数据放在文本文件中我不知道为什么甚至需要使用大量内存,我已经做了我能想到的一切来释放内存暂时.有什么我想念的吗?...谢谢.
我有一个返回的函数MemoryStream?.如果发生错误,则为null.然后我发现我无法声明变量MemoryStream?
public MemoryStream? GetResponseStream() { }
MemoryStream? stream = GetResponseStream();
Run Code Online (Sandbox Code Playgroud)
类型'System.IO.MemoryStream'必须是非可空值类型才能在泛型类型或方法'System.Nullable'中将其用作参数'T'
我正在研究一些非常复杂的代码,它使用XmlTextwriter写入内存流.有没有办法在Visual Studio调试中查看memorystream/XmlTextwriter的内容,因为我正在逐步执行代码.
假设我创建了一个位图
Bitmap bitmap = new Bitmap(320, 200);
Run Code Online (Sandbox Code Playgroud)
当我把它写到某个流(在我的情况下,它是一个HttpResponseStream,由HttpListenerResponse给出),一切都很好:
bitmap.Save(stream, ImageFormat.Png);
Run Code Online (Sandbox Code Playgroud)
我不需要bitmap.Dispose(),位图使用的资源将自动清理.直接将Png写入不可搜索的流的问题是,它可能导致GDI +中发生一般错误,当我在Azure上尝试我的Asp应用程序时发生这种情况.这就是我的代码现在的样子:
using (MemoryStream ms = new MemoryStream())
{
bitmap.Save(ms, ImageFormat.Png);
ms.WriteTo(stream);
}
Run Code Online (Sandbox Code Playgroud)
现在除非我之后使用bitmap.Dispose(),否则会泄漏.
重新提出问题以获得更具体的答案: 为什么这种位图内存的泄漏似乎取决于我将其保存到哪种类型的流?
更新: 正如我在评论中被问到我是否确定它是泄密.在压力测试中反复调用上面的内容,我的w3wp进程将进入gig和gig的内存使用,直到我的机器开始交换,它将无法清理.
在我的ASP.NET MVC应用程序中,我使用NPOI框架生成一个相当大的excel文件(30-100mb)
生成文档后,我将其保存到内存流,并使用MVC文件帮助方法返回FileStreamResult
File(Stream fileStream, string contentType, string fileDownloadName)
Run Code Online (Sandbox Code Playgroud)
像这样
HSSFWorkbook document = GenerateExcelWorkBook();
var stream = new MemoryStream();
document.Write(stream);
stream.Flush();
stream.Position = 0;
return File(stream, "application/vnd.ms-exce", "filename.xls");
Run Code Online (Sandbox Code Playgroud)
可变文档是来自NPOI框架的"HSSFWorkbook"类型
我不明白为什么内存使用率仍然很高,即使在生成文档之后,流也已返回给用户.File方法应在写入响应流后处理流.
如果我再次单击生成链接,内存使用量将恢复正常,并在再次生成文档时开始爬升.
这可能是NPOI HSSFWorkbook类没有正确收集垃圾或其他东西的问题吗?这只是奇怪,因为我没有保存任何静态变量(至少在我的代码中没有).
任何人都知道为什么内存使用不会恢复正常?
我正在使用以下代码从HttPostedFileBase对象中获取字节数组
byte[] mobileAppByteArray = default(byte[]);
using (MemoryStream ms = new MemoryStream())
{
httpPostedFileObject.InputStream.CopyTo(ms);
mobileAppByteArray = ms.GetBuffer();
}
Run Code Online (Sandbox Code Playgroud)
httpPostedFileObject的原始大小为3191KB,但是经过上述转换并将其保存到磁盘后,文件大小为4096KB
我知道默认的缓冲区大小CopyTo是4096,但是即使将缓冲区大小更改为1024,结果也是相同的:文件大小为4096KB。
保存到磁盘后,如何更改代码,使文件保持为3191KB?
我收到一个文件作为byte []数据包流(总大小未提前知道),我需要在收到它之前立即处理它(我无法动态处理) ).收到的文件总大小可以从10 KB到4 GB不等.
MemoryStream,即一系列MemoryStream.Write(bufferReceived, 0, count)调用来存储所接收的分组.这很简单,但显然会导致大文件的内存不足异常.FileStream,即FileStream.Write(bufferReceived, 0, count).这样,不会出现内存不足异常,但我不确定的是由于磁盘写入导致的性能不佳(只要仍有大量内存可用,我不想发生) - 我想要尽可能避免磁盘访问,但我不知道如何控制它.我做了一些测试,大部分时间,似乎在连续10次连续调用MemoryStream.Write()vs 之间几乎没有性能差异FileStream.Write(),但很多似乎取决于缓冲区大小和有问题的数据总量(即写入次数) .显然,MemoryStream尺寸重新分配也是一个因素.
默认情况下使用MemoryStream和FileStream,即写入内存流的组合是否有意义,但是一旦收到的数据总量超过例如500 MB,请将其写入FileStream; 然后,从两个流中读取块以处理接收到的数据(首先处理500 MB MemoryStream,处理它,然后读取FileStream)?
另一种解决方案是使用自定义内存流实现,该实现不需要连续的地址空间用于内部数组分配(即内存流的链接列表); 这样,至少在64位环境中,内存不足异常应该不再是问题.骗局:额外的工作,更多的错误空间.
那么FileStreamvs MemoryStream读/写如何在磁盘访问和内存缓存方面表现出来,即数据大小/性能平衡.我希望只要有足够的RAM可用,FileStream无论如何都会从内存(缓存)内部读/写,虚拟内存将负责其余的工作.但我不知道FileStream在写入磁盘时是否经常显式访问磁盘.
任何帮助,将不胜感激.
c# ×10
memorystream ×10
.net ×3
asp.net ×2
bitmap ×1
bytearray ×1
bytebuffer ×1
debugging ×1
filestream ×1
iis ×1
itextsharp ×1
java ×1
npoi ×1
nullable ×1
pdf ×1
sql ×1
streamreader ×1
streamwriter ×1