我看到了很多CopyStream实现的例子,但是当我们复制流时,我对缓冲区大小有疑问.
CopyStreams实现之一的示例:
private void ReadWriteStream(Stream readStream, Stream writeStream)
{
int Length = 256;
Byte[] buffer = new Byte[Length];
int bytesRead = readStream.Read(buffer, 0, Length);
// write the required bytes
while (bytesRead > 0)
{
writeStream.Write(buffer, 0, bytesRead);
bytesRead = readStream.Read(buffer, 0, Length);
}
readStream.Close();
writeStream.Close();
}
Run Code Online (Sandbox Code Playgroud)
问题是:
相关问题:
带有Streams的文件IO - 最佳内存缓冲区大小 - 很好的文件IO答案.但是在内存复制方面呢?
我的情况:
有MemotyStream,我创建使用ClosedXML workbook.SaveAs(memoryStream);和它分配在托管堆中的内存量巨大.我查看了源代码,发现有一个使用8*1024缓冲区大小的CopyStream方法.可以改变这个大小以某种方式减少内存使用?
注意: Stream占用大约1Gb的内存.
我正在尝试获取请求并阅读它:
byte[] buffer;
Stream read = http.GetResponseStream();
string readIt = read.Read(buffer, 0, read.Length)
Run Code Online (Sandbox Code Playgroud)
但它会引发无效参数的错误.
知道如何在使用Stream而不是StreamReader时获得对字符串的响应吗?
我正在编写服务器客户端应用程序.客户端通过不同的流将某种数据发送到服务器.一旦我在主方法中放置这样的流,程序什么都不做; 空控制台也不例外:
try {
socket = new Socket("localhost", 4050);
din = new DataInputStream(socket.getInputStream());
oin = new ObjectInputStream(socket.getInputStream());
dout = new DataOutputStream(socket.getOutputStream());
} catch (UnknownHostException e) {
System.out.println("Exception: the host is unknown");
} catch (IOException e) {
System.out.println("I/O exception thrown by socket");
}
Run Code Online (Sandbox Code Playgroud)
一旦我oin = new ObjectInputStream(socket.getInputStream());从main方法的那一部分中删除了这个流 ,程序就会抛出EOFException或连接重置异常.在上面的代码中有什么特别之处,程序什么也不做,并且没有例外?
将上述流放入单独的方法后
private static MessageObject readObject(){
MessageObject mo = null;
try{
oin = new ObjectInputStream(socket.getInputStream());
mo = (MessageObject)oin.readObject();
}
catch(IOException e){
System.err.println(e.getCause());
}
catch(ClassNotFoundException e){
System.err.println(e.getCause());
}
return mo;
}
Run Code Online (Sandbox Code Playgroud)
它抛出了这个异常:
Exception …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试让我的服务器与客户端建立连接.我为每个连接创建了一个线程,但服务器当前没有创建输入流.我通过打印数字来测试这个,但只有1和2打印出来.我确定这只是一个我遗漏的小问题.
public class ObjectHandler implements Runnable{
Socket sock;
ObjectInputStream ois;
ObjectOutputStream oops;
InputStream is;
public ObjectHandler(Socket clientSocket) throws IOException {
System.out.println("1");
sock = clientSocket;
is = sock.getInputStream();
System.out.println("2");
ois = new ObjectInputStream(new BufferedInputStream(is));
System.out.println("3");
OutputStream os = sock.getOutputStream();
oops = new ObjectOutputStream(new BufferedOutputStream(os));
outputSockets.add(oops);
}
Run Code Online (Sandbox Code Playgroud)
我现在已经删除了抛出IOException并用try catch包围了读者.客户端崩溃后,它现在打印此错误:
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
at ThreadPool$ObjectHandler.<init>(ThreadPool.java:95)
at ThreadPool.addThread(ThreadPool.java:31)
at ObjectServerTest.go(ObjectServerTest.java:93)
at ObjectServerTest.main(ObjectServerTest.java:124)
Run Code Online (Sandbox Code Playgroud) 我一直在乱用C#中的TCP套接字,我在与我设置的FTP服务器通信时遇到了一些麻烦.我最初可以连接并获得220消息,但是当我发送"USER nrcrast"命令时,我从未得到响应,并且DataAvailable属性返回false.谁知道我做错了什么?到目前为止,这是我的代码:
namespace TCPClient
{
public partial class TCPClientForm : Form
{
private TcpClient myClient;
NetworkStream stream;
public TCPClientForm()
{
InitializeComponent();
send();
}
void send()
{
while (true)
{
try
{
myClient = new TcpClient("nrcrast.dyndns.info", 21);
break;
}
catch (SocketException ex)
{
Console.WriteLine(ex.ToString());
}
}
stream = myClient.GetStream();
int sendOffset = 0;
int recOffset=0;
int dataLength;
Byte[] receiveData = new Byte[256];
// wait for a response
dataLength = stream.Read(receiveData, recOffset, receiveData.Length);
String recvdMessage = System.Text.Encoding.ASCII.GetString(receiveData, 0, dataLength);
Console.WriteLine(recvdMessage.ToString());
recOffset+=dataLength;
String …Run Code Online (Sandbox Code Playgroud) 我正在使用命名管道与进程通信.我已经能够使用以下代码.(原始代码在这里:via archive.org)
class ProgramPipeTest
{
public void ThreadSenderStartClient(object obj)
{
// Ensure that we only start the client after the server has created the pipe
ManualResetEvent SyncClientServer = (ManualResetEvent)obj;
using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(".","ToSrvPipe",PipeDirection.Out,PipeOptions.None))
{
// The connect function will indefinately wait for the pipe to become available
// If that is not acceptable specify a maximum waiting time (in ms)
pipeStream.Connect();
Console.WriteLine("[Client] Pipe connection established");
using (StreamWriter sw = new StreamWriter(pipeStream))
{
sw.AutoFlush = true;
string …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试找到最有效的方法来读取文本并将其重新写入文本文件.当我这样做时(带有223 KB的文件),我得到一个224KB文件的结果,在原始文件中附加一些额外的句子.(这些额外的句子似乎是从文件中间抓取的).我似乎无法找到问题所在.以下是我使用的代码:
while(...)
{
writeStream.Write(array, 0, array.Length);
if (read == 0)
break;
}
Run Code Online (Sandbox Code Playgroud) 我最近遇到的有趣问题:
我实现了一个Stream类(一个自定义流管道组件的包装流),一些后来的测试让我的管道抛出异常.由于我的流是一个仅向前的,不可写的流实现(CanSeek和CanWrite返回false,位置:设置抛出异常,没什么异常),因此我调用Seek时抛出了异常,因为我已经硬编码抛出NotImplementedException.对Seek的调用来自非托管代码,因此我无法真正调试它.我真正可以告诉的是,即使我让CanSeek返回false并且用户甚至没有检查CanSeek ,我的Stream实现也会调用Seek .
那是怎么回事?
我不知道为什么这会抛出错误在解析完成之前遇到的流结束.我查看了这个链接,但没有任何内容解决了我的问题.我使用断点来找到它抛出错误女巫的确切点
Console.WriteLine("Message from client ");
Run Code Online (Sandbox Code Playgroud)
提前致谢
if (stream.DataAvailable)
{
byte[] buffer = new byte[10024];
int byteCount = stream.Read(buffer, 0, buffer.Length);
byte[] inBytes = new byte[byteCount];
for (int counter = 0; counter < byteCount; counter++)
inBytes[counter] = buffer[counter];
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream memory = new MemoryStream();
memory.Write(inBytes,0,inBytes.Length);
object message = (object)formatter.Deserialize(memory);
Console.WriteLine("Message from client ");
memory.Close();
}
Run Code Online (Sandbox Code Playgroud)
编辑*这是我的坏事实际代码没有错,我在客户端犯了错误.我使用Encoding.ASCII而不是二进制格式.
有没有办法编写一个跨平台解析器来读取字符,直到找到换行符?我在Linux中使用'\ 0',但我不确定这是否也可以在Windows上完成.
std::string line;
// fill the line
QTextStream ss(&line);
for(;;)
{
ss >> c;
if(c == '"' || c=='\0' ) // here I want to continue parsing until a new-line character or a ending double quote is found
break;
}
Run Code Online (Sandbox Code Playgroud)