Note: If you want to experience a complete C++ .NET/C++-CLI programming tutorial please jump to Visual C++ .NET programming tutorial.
This class provides methods for passing credentials across a stream and requesting or performing authentication for client-server applications. This abstract class provides methods and properties that are common to authenticated streams.
Authenticated streams can provide authentication, data signing, and encryption services that can help maintain the integrity and confidentiality of data transmitted using the InnerStream.
The security protocol implemented by a class that derives from AuthenticatedStream together with the security protocols supported on the client and server will determine the security features that are available to an application. The NegotiateStream and SslStream classes inherit from AuthenticatedStream and implement the Negotiate and Secure Sockets Layer security protocols, respectively.
Notes to Inheritors: The following members must be overridden in a derived class: IsAuthenticated, IsEncrypted, IsMutuallyAuthenticated, IsServer, and IsSigned.
C#
// The following class displays the properties of an authenticatedStream.
public class AuthenticatedStreamReporter
{
public static void DisplayProperties(AuthenticatedStream stream)
{
Console.WriteLine("IsAuthenticated: {0}", stream.IsAuthenticated);
Console.WriteLine("IsMutuallyAuthenticated: {0}", stream.IsMutuallyAuthenticated);
Console.WriteLine("IsEncrypted: {0}", stream.IsEncrypted);
Console.WriteLine("IsSigned: {0}", stream.IsSigned);
Console.WriteLine("IsServer: {0}", stream.IsServer);
}
}
Stream readers and writers provide a convenient way to read and write text and binary data types to streams. You might have noticed in our discussions so far that stream Read() and Write() methods perform I/O using byte-type data arrays. Using byte-type arrays to read and write data makes stream classes inconvenient, especially when you’re writing text because your application has to spend a great deal of time converting data types to byte arrays. There are two reader classes, StreamReader and BinaryReader, and two writer classes, StreamWriter and BinaryWriter, that make handling I/O on streams a snap.
The best way to read and write character-based data to a stream is by using the StreamReader and StreamWriter classes. Both classes are based on the abstract classes TextReader and TextWriter that enable you to read and write a sequence of characters. These classes also allow you to read and write characters in different character encoding formats, such as ASCII or Universal Character Set (UCS). Many UCS Transformation Formats (UTF) are available, such as an 8-bit encoding form called UTF-8. Table 2-4 describes the available encoding techniques supported by the StreamReader and StreamWriter classes. By default, these reader/ writer classes use UTF-8 encoding and decoding. However, you can specify other techniques through one of the constructor methods.
Table 2-4: Encoding/Decoding Techniques for Stream Readers/Writers
|
|
Technique |
Description |
ASCII |
Unicode characters are encoded/decoded as 7-bit ASCII characters. |
Big-endian Unicode |
Unicode characters are encoded/decoded in big-endian byte form. |
Unicode |
Unicode characters are encoded/decoded as UTF-16 characters. |
UTF-7 |
Unicode characters are encoded/decoded as UTF-7 characters. |
UTF-8 |
Unicode characters are encoded/decoded as UTF-8 characters. |
The most useful methods in the StreamWriter class are Write() and WriteLine(), which come from the TextWriter class. The only difference between the two methods is that WriteLine() places a carriage return followed by a line feed at the end of the text and Write() does not. Both methods have many prototypes and allow you to read and write many numerical data types and strings as text to a stream. For example, the following code fragment shows how to write a simple character string to a file stream:
C#
StreamWriter MyStreamWriter = new StreamWriter(MyFileStream);
MyStreamWriter.WriteLine("Using stream writers is great!");
Visual Basic .NET
Dim MyStreamWriter As StreamWriter
MyStreamWriter = New StreamWriter(MyFileStream)
MyStreamWriter.WriteLine("Using stream writers is great!")
In the StreamReader class, there’s a Read() method that allows you to read a single character or a specified number of characters from a stream. There’s also a ReadLine() method that allows you to read a line of text into a string. Finally, there’s a ReadToEnd() method that will read the entire contents of the stream and return a string. ReadToEnd() is great for downloading a small text file over a network stream.
Create a new CLR console application project and you might want to use StreamWriterCP as the project and solution names.
Add the following code.
// StreamWriterCP.cpp : main project file.
#include "stdafx.h"
using namespace System; using namespace System::IO; using namespace System::Text;
static void CreateTextFile(String^ fileName, String^ textToAdd) { // The Log file... String^ logFile = DateTime::Now.ToShortDateString()->Replace("/", "-")->Replace("\\", "-") + ".log";
try { StreamWriter^ swFromFile = gcnew StreamWriter(logFile); Console::WriteLine(L"Write(), {0} file...", logFile); swFromFile->Write(textToAdd); Console::WriteLine(L"Flush()"); swFromFile->Flush(); Console::WriteLine(L"Close()"); swFromFile->Close(); Console::WriteLine();
// file name from Main() FileStream^ fs = gcnew FileStream(fileName, FileMode::CreateNew, FileAccess::Write, FileShare::None); StreamWriter^ swFromFileStream = gcnew StreamWriter(fs); Console::WriteLine(L"Write(), {0} file...", fileName); swFromFileStream->Write(textToAdd); Console::WriteLine(L"Flush()"); swFromFileStream->Flush(); Console::WriteLine(L"Close()"); swFromFileStream->Close(); Console::WriteLine();
// New file fileName = L"text2.txt"; FileStream^ fs1 = gcnew FileStream(fileName, FileMode::CreateNew, FileAccess::Write, FileShare::None);
StreamWriter^ swFromFileStreamDefaultEnc = gcnew StreamWriter(fs1, Encoding::Default); Console::WriteLine(L"Write(), {0} file...", fileName); swFromFileStreamDefaultEnc->Write(textToAdd); Console::WriteLine(L"Flush()"); swFromFileStreamDefaultEnc->Flush(); Console::WriteLine(L"Close()"); swFromFileStreamDefaultEnc->Close(); Console::WriteLine();
StreamWriter^ swFromFileTrue = gcnew StreamWriter(fileName, true); Console::WriteLine(L"Write(), {0} file...", fileName); swFromFileTrue->Write(textToAdd); Console::WriteLine(L"Flush()"); swFromFileTrue->Flush(); Console::WriteLine(L"Close()"); swFromFileTrue->Close(); Console::WriteLine();
StreamWriter^ swFromFileTrueUTF8Buffer = gcnew StreamWriter(fileName, true, Encoding::UTF8, 512); Console::WriteLine(L"Write(), {0} file...", fileName); swFromFileTrueUTF8Buffer->Write(textToAdd); Console::WriteLine(L"Flush()"); swFromFileTrueUTF8Buffer->Flush(); Console::WriteLine(L"Close()"); swFromFileTrueUTF8Buffer->Close(); Console::WriteLine();
StreamWriter^ swFromFileTrueUTF8 = gcnew StreamWriter(fileName, true, Encoding::UTF8); Console::WriteLine(L"Write(), {0} file...", fileName); swFromFileTrueUTF8->Write(textToAdd); Console::WriteLine(L"Flush()"); swFromFileTrueUTF8->Flush(); Console::WriteLine(L"Close()"); swFromFileTrueUTF8->Close(); Console::WriteLine();
// New file fileName = L"text3.txt"; FileStream^ fs2 = gcnew FileStream(fileName, FileMode::CreateNew, FileAccess::Write, FileShare::None);
StreamWriter^ swFromFileStreamUTF8Buffer = gcnew StreamWriter(fs2, Encoding::UTF8, 512); Console::WriteLine(L"Write(), {0} file...", fileName); swFromFileStreamUTF8Buffer->Write(textToAdd); Console::WriteLine(L"Flush()"); swFromFileStreamUTF8Buffer->Flush(); Console::WriteLine(L"Close()"); swFromFileStreamUTF8Buffer->Close(); } catch(Exception^ err) { Console::WriteLine(L"Bastard error: " + err->Message); } }
int main(array<System::String ^> ^args) { String^ fileName = L"testo.txt"; String^ textToAdd = L"Just a line of test text.."; CreateTextFile(fileName, textToAdd); return 0; }
|
Build and run the project. The following is an output example.
The files created are shown below.
|
Example: The following code example demonstrates the StreamWriter constructors. Create a new console application project. You can use the solution and project name as used in the following program, StreamWriterCS.
using System; using System.IO;
namespace StreamWriterCS { public class Program { public static void CreateTextFile(string fileName, string textToAdd) { // Log file... string logFile = DateTime.Now.ToShortDateString().Replace(@"/", @"-").Replace(@"\", @"-") + ".log";
StreamWriter swFromFile = new StreamWriter(logFile); Console.WriteLine("Write(), {0} file...", logFile); swFromFile.Write(textToAdd); Console.WriteLine("Flush()"); swFromFile.Flush(); Console.WriteLine("Close()"); swFromFile.Close(); Console.WriteLine("");
// file name from Main() FileStream fs = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write, FileShare.None);
StreamWriter swFromFileStream = new StreamWriter(fs); Console.WriteLine("Write(), {0} file...", fileName); swFromFileStream.Write(textToAdd); Console.WriteLine("Flush()"); swFromFileStream.Flush(); Console.WriteLine("Close()"); swFromFileStream.Close(); Console.WriteLine("");
// New file fileName = "text2.txt"; FileStream fs1 = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write, FileShare.None); StreamWriter swFromFileStreamDefaultEnc = new System.IO.StreamWriter(fs1, System.Text.Encoding.Default); Console.WriteLine("Write(), {0} file...", fileName); swFromFileStreamDefaultEnc.Write(textToAdd); Console.WriteLine("Flush()"); swFromFileStreamDefaultEnc.Flush(); Console.WriteLine("Close()"); swFromFileStreamDefaultEnc.Close(); Console.WriteLine("");
StreamWriter swFromFileTrue = new StreamWriter(fileName, true); Console.WriteLine("Write(), {0} file...", fileName); swFromFileTrue.Write(textToAdd); Console.WriteLine("Flush()"); swFromFileTrue.Flush(); Console.WriteLine("Close()"); swFromFileTrue.Close(); Console.WriteLine("");
StreamWriter swFromFileTrueUTF8Buffer = new StreamWriter(fileName, true, System.Text.Encoding.UTF8, 512); Console.WriteLine("Write(), {0} file...", fileName); swFromFileTrueUTF8Buffer.Write(textToAdd); Console.WriteLine("Flush()"); swFromFileTrueUTF8Buffer.Flush(); Console.WriteLine("Close()"); swFromFileTrueUTF8Buffer.Close(); Console.WriteLine("");
StreamWriter swFromFileTrueUTF8 = new StreamWriter(fileName, true, System.Text.Encoding.UTF8); Console.WriteLine("Write(), {0} file...", fileName); swFromFileTrueUTF8.Write(textToAdd); Console.WriteLine("Flush()"); swFromFileTrueUTF8.Flush(); Console.WriteLine("Close()"); swFromFileTrueUTF8.Close(); Console.WriteLine("");
// New file fileName = "text3.txt"; FileStream fs2 = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write, FileShare.None);
StreamWriter swFromFileStreamUTF8Buffer = new StreamWriter(fs2, System.Text.Encoding.UTF8, 512); Console.WriteLine("Write(), {0} file...", fileName); swFromFileStreamUTF8Buffer.Write(textToAdd); Console.WriteLine("Flush()"); swFromFileStreamUTF8Buffer.Flush(); Console.WriteLine("Close()"); swFromFileStreamUTF8Buffer.Close(); }
public static int Main(string[] args) { string fileName = "test.txt"; string textToAdd = "A line of test text.."; CreateTextFile(fileName, textToAdd); return 0; } } } |
An output sample:
The created files can be seen under the current folder (Debug folder).
Check the files content.
Create a new console application project and add the following code.
Imports System Imports System.IO
Module Module1 Public Sub CreateTextFile(ByVal FileName As String, ByVal TextToAdd As String)
Dim SwFromFile As StreamWriter = New StreamWriter(FileName) Console.WriteLine("Write(), " + FileName) SwFromFile.Write(TextToAdd) Console.WriteLine("Flush(), ...") SwFromFile.Flush() Console.WriteLine("Close()") SwFromFile.Close() Console.WriteLine()
Dim FileName0 As String = "test0.txt" Dim Fs0 As FileStream = New FileStream(FileName0, FileMode.CreateNew, FileAccess.Write, FileShare.None) Dim SwFromFileStream As StreamWriter = New StreamWriter(Fs0)
Console.WriteLine("Write(), " + FileName0) SwFromFileStream.Write(TextToAdd) Console.WriteLine("Flush(), ...") SwFromFileStream.Flush() Console.WriteLine("Close()") SwFromFileStream.Close() Console.WriteLine()
Dim FileName1 As String = "test1.txt" Dim Fs1 As FileStream = New FileStream(FileName1, FileMode.CreateNew, FileAccess.Write, FileShare.None) Dim SwFromFileStreamDefaultEnc As StreamWriter = New StreamWriter(Fs1, System.Text.Encoding.Default)
Console.WriteLine("Write(), " + FileName1) SwFromFileStreamDefaultEnc.Write(TextToAdd) Console.WriteLine("Flush(), ...") SwFromFileStreamDefaultEnc.Flush() Console.WriteLine("Close()") SwFromFileStreamDefaultEnc.Close() Console.WriteLine()
Dim SwFromFileTrue As StreamWriter = New StreamWriter(FileName1, True) Console.WriteLine("Write(), " + FileName1) SwFromFileTrue.Write(TextToAdd) Console.WriteLine("Flush(), ...") SwFromFileTrue.Flush() Console.WriteLine("Close()") SwFromFileTrue.Close() Console.WriteLine()
Dim SwFromFileTrueUTF8Buffer = New StreamWriter(FileName1, True, System.Text.Encoding.UTF8, 512) Console.WriteLine("Write(), " + FileName1) SwFromFileTrueUTF8Buffer.Write(TextToAdd) Console.WriteLine("Flush(), ...") SwFromFileTrueUTF8Buffer.Flush() Console.WriteLine("Close()") SwFromFileTrueUTF8Buffer.Close() Console.WriteLine()
Dim SwFromFileTrueUTF8 = New StreamWriter(FileName1, True, System.Text.Encoding.UTF8) Console.WriteLine("Write(), " + FileName1) SwFromFileTrueUTF8.Write(TextToAdd) Console.WriteLine("Flush(), ...") SwFromFileTrueUTF8.Flush() Console.WriteLine("Close()") SwFromFileTrueUTF8.Close() Console.WriteLine()
Dim FileName2 As String = "test2.txt" Dim Fs2 As FileStream = New FileStream(FileName2, FileMode.CreateNew, FileAccess.Write, FileShare.None) Dim SwFromFileStreamUTF8Buffer = New StreamWriter(Fs2, System.Text.Encoding.UTF8, 512)
Console.WriteLine("Write(), " + FileName2) SwFromFileStreamUTF8Buffer.Write(TextToAdd) Console.WriteLine("Flush(), ...") SwFromFileStreamUTF8Buffer.Flush() Console.WriteLine("Close()") SwFromFileStreamUTF8Buffer.Close() End Sub
Sub Main() Dim FileName As String FileName = "test.txt" Dim TextToAdd As String = "A simple line of text..." Call CreateTextFile(FileName, TextToAdd) End Sub End Module |
An output sample:
The following code example uses a StreamReader object to read text from a file. This is a console mode application.