1. 程式人生 > >C#IO流詳解

C#IO流詳解

17.3.3 流的文字讀寫器
StreamReader和StreamWriter主要用於以文字方式對流進行讀寫操作,它們以位元組流為
操作物件,並支援不同的編碼格式。
StreamReader和StreamWriter通常成對使用,它們的建構函式形式也一一對應。可以通
過指定檔名或指定另一個流物件來建立StreamReader和StreamWriter物件。如有必要,還
可以指定文字的字元編碼、是否在檔案頭查詢位元組順序標記,以及使用的快取區大小。
文字的字元編碼預設為UTF-8格式。在名稱空間System.Text中定義的Encoding類對字元
編碼進行了抽象,它的5個靜態屬性分別代表了5種編碼格式:
• ASCII
• Default
• Unicode
• UTF-7
• UTF-8
不過, Encoding類的Default屬性表示系統的編碼,預設為ANSI內碼表,這和
StreamReader和 StreamWriter中預設的 UTF-8編碼是不一樣的。通過 StreamReader和
StreamWriter類的公有屬性Encoding可以獲得當前使用的字元編碼。StreamReader類還有一
個布林型別的公有屬性EndOfStream,用於指示讀取的位置是否已經到達流的末尾。
下面的程式碼從一個檔案流構造了一個 StreamReader物件和 StreamWriter物件,還為
StreamWriter物件指定了Unicode字元編碼。不過在實際應用中,為同一檔案進行讀寫操作
所構造的兩個物件通常使用同樣的字元編碼格式:
FileStream fs = new FileStream("c://MyFile.txt", FileMode.Create);
StreamReader sr = new StreamReader(fs);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Unicode);
sw.Close();
sr.Close();
fs.Close();
注意在關閉檔案時,要先關閉讀寫器物件,再關閉檔案流物件。如果對同一個檔案同
時建立了 StreamReader和 StreamWriter物件,則應先關閉 StreamWriter物件,再關閉
StreamReader物件。否則將引發ObjectDisposedException異常。
即使是直接使用檔名來構造StreamReader或StreamWriter物件,或是使用File類的靜
態方法OpenText和AppendText來建立StreamReader或StreamWriter物件,過程當中系統都會
自動生成隱含的檔案流,讀寫器對檔案的讀寫還是通過流物件進行的。該檔案流物件可以
通過StreamReader或StreamWriter物件的BaseStream屬性獲得。
不通過檔案流而直接建立StreamReader物件時,預設的檔案流物件是隻讀的。以同樣
的方式來建立StreamWriter物件的話,預設的檔案流物件是隻寫的。下面的程式說明了這一
點:
//程式清單P17_5.cs:
using System;
using System.IO;
namespace P17_5
{
class BaseStreamSample
{
static void Main()
{
StreamReader sr = new StreamReader("c://MyFile.txt");
Console.WriteLine("CanRead:{0}", sr.BaseStream.CanRead);
Console.WriteLine("CanWrite:{0}", sr.BaseStream.CanWrite);
sr.Close();
StreamWriter sw = new StreamWriter("c://MyFile.txt");
Console.WriteLine("CanRead:{0}", sw.BaseStream.CanRead);
Console.WriteLine("CanWrite:{0}", sw.BaseStream.CanWrite);
sw.Close();
}
}
}
程式P17_5.cs的輸出為:
CanRead:True
CanWrite:False
CanRead:False
CanWrite:True
由於使用的是不同的流物件,此時就不能同時使用StreamReader和StreamWriter物件來
開啟同一個檔案。在程式P17_5.cs的程式碼中,如果不關閉StreamReader物件就建立
StreamWriter物件,將引發一個 IOException異常。使用 File類的靜態方法OpenText和
AppendText時,情況也一樣。
StreamReader中可以使用4種方法對流進行讀操作:
• Read,該方法有兩種過載形式,在不接受任何輸入引數時,它讀取流的下一個字元;
當在引數中指定了陣列緩衝區、開始位置和偏移量時,它讀入指定長度的字元陣列。
• ReadBlock,從當前流中讀取最大數量的字元,並將資料輸出到緩衝區。
• ReadLine,從當前流中讀取一行字元,即一個字串。
• ReadToEnd,從流的當前位置開始,一直讀取到流的末尾,並把所有讀入的內容都
作為一個字串返回;如果當前位置位於流的末尾,則返回空字串。
StreamReader最常用的是ReadLine方法,該方法一次讀取一行字元。這裡“行”的定義
是指一個字元序列,該序列要麼以換行符(“/n”)結尾,要麼以換行回車符(“/r/n”)
結尾。
StreamWriter則提供了Write和WriteLine方法對流進行寫操作。不過這兩個方法可以接
受的引數型別則豐富得多,包括char、int、string、float、double乃至object等,甚至可以對
字串進行格式化。看下面這段程式碼:
//建立一個檔案流
FileStream fs = new FileStream("c://MyFile.txt", FileMode.Create,
FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(25); //寫入整數
sw.WriteLine(0.5f); //寫入單精度浮點數
sw.WriteLine(3.1415926); //寫入雙精度浮點數
sw.WriteLine(’A’); //寫入字元
sw.Write ("寫入時間:"); //寫入字串
int hour = DateTime.Now.Hour;
int minute = DateTime.Now.Minute;
int second = DateTime.Now.Second;
//寫入格式化字串
sw.WriteLine("{0}時{1}分{2}秒", hour, minute, second);
//關閉檔案
sw.Close();
fs.Close();
得到的文字檔案內容是:
25
0.5
3.1415926
A
寫入時間:10時11分9秒
Write和 WriteLine方法的使用讀者應該很熟悉,因為它們所提供的過載形式和
Console.Write以及Console.WriteLine方法完全一樣。這些過載方法只是為了使用方便,實際
368 C# 2.0 程式設計教程
上寫入任何型別的物件時,都呼叫了物件的ToString方法,然後將字串寫入流中。不同的
是,WriteLine方法在每個字串後面加上了換行符,而Write方法則沒有。
StringReader和StringWriter同樣是以文字方式對流進行IO操作,但它們以字串為操作
物件,功能相對簡單,而且只支援預設的編碼方式。

相關推薦

C#IO

17.3.3 流的文字讀寫器 StreamReader和StreamWriter主要用於以文字方式對流進行讀寫操作,它們以位元組流為操作物件,並支援不同的編碼格式。 StreamReader和StreamWriter通常成對使用,它們的建構函式形式也一一對應。可以通過指定檔名或指定另一個流物件來建立Strea

Java常用IO

cat exce getpath tst IV trac AC output har 一、流的分類: 按照數據流向的不同:輸入流 輸出流 按照處理數據的單位的不同:字節流 字符流(處理的文本文件) 按照角色的不同:節點流(直接作用於文件的) 處理流 二、IO的體系

Java IO

一、IO流概述 概述: IO流簡單來說就是Input和Output流,IO流主要是用來處理裝置之間的資料傳輸,Java對於資料的操作都是通過流實現,而java用於操作流的物件都在IO包中。 分類: 按操作資料分為:位元

【Java基礎知識】IO

1.概念 (1)io流用來處理裝置之間的資料傳輸; (2)Java對資料的操作的操作是通過流的方式; (3)Java用於操作流的物件都在IO包; (4)io流按操作資料分為兩種:位元組流和字元流; (5)io流按流向分為:輸入流、輸出流 Java流類

IO

轉自:點選開啟連結http://www.2cto.com/kf/201312/262036.html 流的概念和作用 學習Java IO,不得不提到的就是JavaIO流。 流是一組有順序的,有起點和終點的位元組集合,是對資料傳輸的總稱或抽象。即資料在兩裝置間的傳輸稱

C++輸入

C++中幾個輸入函式的用法和區別(cin、cin.get()、cin.getline()、getline()、gets()、getchar())) 1、cin1、cin.get()2、cin.getline()3、getline()4、gets()5、getchar()1、c

C++: I/O(三)——串

name namespace 轉換 pac end 成員 col logs nbsp 一、串流 串流類是 ios 中的派生類 C++的串流對象可以連接string對象或字符串 串流提取數據時對字符串按變量類型解釋;插入數據時把類型 數據轉換成字符串 串流I/O具有格式化功能

C++中的標準IO

<分析>: (1)IO類之間的繼承關係圖如下: (2)IO型別有三個獨立的標頭檔案,iostream標頭檔案定義了控制視窗的型別,fstream標頭檔案定義了讀寫已命名檔案的型別,ss

java IO——緩衝

本篇部落格學習一下內容 緩衝流概述 構造方法 構造方法 構造方法 構造方法 總結 緩衝流概述 緩衝流是對檔案流處理的一種流,它本身並不具備 IO 功能,只是在別的流上加上緩衝提高了效率,當對檔案或其他目標頻繁讀寫或操作效率低,效能差。這時使

Java實現檔案寫入——IO(輸入輸出

輸入輸出的重要性:      輸入和輸出功能是Java對程式處理資料能力的提高,Java以流的形式處理資料。流是一組有序的資料序列,根據操作的型別,分為輸入流和輸出流。      程式從輸入流讀取資料,向輸出流寫入資料。Java是面向物件的程式語言,每一個數

C++中替代sprintf的std ostringstream輸出

構造函數 空間 有時 .com content 執行 函數 ext str2 一、簡單介紹 ostringstream是C++的一個字符集操作模板類,定義在sstream.h頭文件中。ostringstream類通常用於執行C風格的串流的輸出操作,格式化字符串,避免申

C# ListView用法

ont 結束 server 發生 匹配 鼠標 之前 小圖標 order 一、ListView類 1、常用的基本屬性: (1)FullRowSelect:設置是否行選擇模式。(默認為false) 提示:只有在Details視圖該屬性才有意義

C# Graphics類

一段 特定 roc sta 指定順序 rendering 嘗試 osi intersect Brush 類.NET Framework 4定義用於填充圖形形狀(如矩形、橢圓、餅形、多邊形和封閉路徑)的內部的對象。 屬於命名空間: System.Drawing這是一個抽象基

深入理解JAVA I/O系列三:字符

buffer 情況 二進制文件 感到 復制代碼 使用範圍 轉換 fileread 方式 字符流為何存在 既然字節流提供了能夠處理任何類型的輸入/輸出操作的功能,那為什麽還要存在字符流呢?容我慢慢道來,字節流不能直接操作Unicode字符,因為一個字符有兩個字節,字節流一次只

C# ListView用法(轉)

分組 創建 cti 排列 checkbox 定義 com 程序 erl 一、ListView類 1、常用的基本屬性: (1)FullRowSelect:設置是否行選擇模式。(默認為false) 提示:只有在Details視圖該屬性才有

10.5-全棧Java筆記:常見(三)

java上節我們講到「Java中常用流:緩沖流」,本節我們學習數據流和對象流~ 數據流數據流將“基本數據類型變量”作為數據源,從而允許程序以與機器無關方式從底層輸入輸出流中操作java基本數據類型。 DataInputStream和DataOutputStream提供了可以存取與機器無關的所有Java基礎類

【轉】讓你不再害怕指針——C指針(經典,非常詳細)

有一個 情況 value 第一個字符 接下來 意思 strcpy abcdefg 數值 前言:復雜類型說明 要了解指針,多多少少會出現一些比較復雜的類型,所以我先介紹一下如何完全理解一個復雜類型,要理解復雜類型其實很簡單,一個類型裏會出現很多運算符,他們也像普通的表

C# 泛型

安全 c++ urn 操作 類型 增加 add 應用 定義 什麽是泛型 我們在編寫程序時,經常遇到兩個模塊的功能非常相似,只是一個是處理int數據,另一個是處理string數據,或者其他自定義的數據類型,但我們沒有辦法,只能分別寫多個方法處理每個數據類型,因為

C++ STL vector

node bsp 結構體 單元 style 入隊 push_back line 數據 一.解釋:    vector(向量):是一種順序容器,事實上和數組差不多,但它比數組更優越。一般來說數組不能動態拓展,因此在程序運行的時候不是浪費內存,就是造成越界。而vector正好彌

C++ STL list

c++ back main 雙向鏈表 第一個元素 cti ans :link 獲得 一.解釋: list是一種序列式容器。list容器完成的功能實際上和數據結構中的雙向鏈表是極其相似的,list中的數據元素是通過鏈表指針串連成邏輯意義上的線性表,list不僅是一個雙向鏈表,