简体   繁体   中英

basic understanding of stream writer

HI,

My question has to do with a very basic understanding of Writing data to using a StreamWriter. If you consider the following code:

            StreamWriter writer = new StreamWriter(@"C:\TEST.XML");
            writer.WriteLine("somestring");
            writer.Flush();
            writer.Close();

When the writer object is initialized, with the filename, all it has is a pointer to the file.

However when we write any string to the writer object, does it actually LOAD the whole file, read its contents, append the string towards the end and then close the handle?

I hope its not a silly questions. I ask this because, I came across an application that writes frequently probably every half a second to a file, and the file size increased to about 1 GB, and it still continuted to write to the file. (logging)

Do you think this could have resulted in a CPU usage of 100 % ?

Please let me know if my question is unclear?

Thanks in advance.

does it actually LOAD the whole file, read its contents

After the framework opens the file, it will perform a FileStream.Seek operation to position the file pointer to the end of the file. This is supported by the operating system, and does not require reading or writing any file data.

and then close the handle

The handle is closed when you call Close or Dispose . Both are equivalent. (Note for convenience that you can take advantage of the C# using statement to create a scope where the call to Dispose is handled by the compiler on exiting the scope.)

every half a second to a file

That doesn't sound frequent enough to load the machine at 100%. Especially since disk I/O mainly consists of waiting on the disk, and this kind of wait does not contribute to CPU usage. Use a profiler to see where your application is spending its time. Alternatively, a simple technique that you might try is to run under the debugger, click pause, and examine the call stacks of your threads. There is a good chance that a method that is consuming a lot of time will be on a stack when you randomly pause the application.

The code you provided above will overwrite the content of the file, so it has no need to load the file upfront.
Nonetheless, you can append to a file by saying:

StreamWriter writer = new StreamWriter(@"C:\TEST.XML", true);

The true parameter is to tell it to append to the file.
And still, it does not load the entire file in memory before it appends to it.
That's what makes this called a "stream", which means if you're going one way, you're going one way.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM