标签: stream

流复制时缓冲区大小的差异

我看到了很多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)

问题是:

  • 什么缓冲区长度应该是(我见过256,8*1024,32768)?
  • 缓冲区大小如何影响性能,内存使用等?

相关问题:
带有Streams的文件IO - 最佳内存缓冲区大小 - 很好的文件IO答案.但是在内存复制方面呢?


我的情况:
MemotyStream,我创建使用ClosedXML workbook.SaveAs(memoryStream);和它分配在托管堆中的内存量巨大.我查看了源代码,发现有一个使用8*1024缓冲区大小的CopyStream方法.可以改变这个大小以某种方式减少内存使用?
注意: Stream占用大约1Gb的内存.

c# optimization buffer stream

0
推荐指数
1
解决办法
2804
查看次数

通过stream.read读取流而不是使用StreamReader

我正在尝试获取请求并阅读它:

byte[] buffer;
Stream read = http.GetResponseStream();
string readIt = read.Read(buffer, 0, read.Length)
Run Code Online (Sandbox Code Playgroud)

但它会引发无效参数的错误.

知道如何在使用Stream而不是StreamReader时获得对字符串的响应吗?

c# io stream httpwebrequest

0
推荐指数
1
解决办法
166
查看次数

Streams通过Socket

我正在编写服务器客户端应用程序.客户端通过不同的流将某种数据发送到服务器.一旦我在主方法中放置这样的流,程序什么都不做; 空控制台也不例外:

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)

java sockets exception stream

0
推荐指数
1
解决办法
2215
查看次数

无法使ObjectInputStream工作

我目前正在尝试让我的服务器与客户端建立连接.我为每个连接创建了一个线程,但服务器当前没有创建输入流.我通过打印数字来测试这个,但只有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)

java sockets network-programming stream

0
推荐指数
1
解决办法
1万
查看次数

使用TCP在C#中实现FTP客户端

我一直在乱用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)

c# ftp tcp networkstream stream

0
推荐指数
1
解决办法
5391
查看次数

C#命名管道而不从控制台发出命令?

我正在使用命名管道与进程通信.我已经能够使用以下代码.(原始代码在这里: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)

c# console ipc stream named-pipes

0
推荐指数
1
解决办法
2084
查看次数

额外的文本写入文件c#

我目前正在尝试找到最有效的方法来读取文本并将其重新写入文本文件.当我这样做时(带有223 KB的文件),我得到一个224KB文件的结果,在原始文件中附加一些额外的句子.(这些额外的句子似乎是从文件中间抓取的).我似乎无法找到问题所在.以下是我使用的代码:

        while(...)
        {
            writeStream.Write(array, 0, array.Length);

            if (read == 0)
                break;
        }           
Run Code Online (Sandbox Code Playgroud)

c# buffer file stream

0
推荐指数
1
解决办法
113
查看次数

为什么在从CanSeek返回false的流上调用Seek?

我最近遇到的有趣问题:

我实现了一个Stream类(一个自定义流管道组件的包装流),一些后来的测试让我的管道抛出异常.由于我的流是一个仅向前的,不可写的流实现(CanSeek和CanWrite返回false,位置:设置抛出异常,没什么异常),因此我调用Seek时抛出了异常,因为我已经硬编码抛出NotImplementedException.对Seek的调用来自非托管代码,因此我无法真正调试它.我真正可以告诉的是,即使我让CanSeek返回false并且用户甚至没有检查CanSeek ,我的Stream实现也会调用Seek .

那是怎么回事?

c# biztalk stream

0
推荐指数
1
解决办法
1288
查看次数

为什么在解析完成之前抛出一个流结束?

我不知道为什么这会抛出错误在解析完成之前遇到的流结束.我查看了这个链接,但没有任何内容解决了我的问题.我使用断点来找到它抛出错误女巫的确切点

       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而不是二进制格式.

c# networkstream stream

0
推荐指数
1
解决办法
3001
查看次数

便携式字符换行

有没有办法编写一个跨平台解析器来读取字符,直到找到换行符?我在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)

c c++ qt newline stream

0
推荐指数
1
解决办法
992
查看次数