1.概要
var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)
Console.WriteLine(stream.CanRead);
int nread = stream.Read(bom, offset: 0, count: 5);
if (bom[0] == 0xff && bom[1] == 0xfe && bom[2] == 0 && bom[3] == 0)
{
Console.WriteLine("UTF-32");
stream.Seek(4, SeekOrigin.Begin);
return Encoding.UTF32;
}
2.代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace ConsoleApp11
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
string fileName = "test.txt";
string f2 = Path.Combine(GetFolderPath(), fileName);
//ReadAllLines(f2);
//ReadLines(f2);
ReadFileUsingFileStream(f2);
Console.ReadKey();
}
static string GetFolderPath() {
return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
}
static void ReadFileUsingFileStream(string fileName) {
const int bufferSize = 256;
using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) {
ShowStreamInformations(stream);
Encoding encoding = GetEncoding(stream);
byte[] buffer = new byte[bufferSize];
bool impleted = false;
do
{
int nread = stream.Read(buffer, 0, bufferSize);
if (nread == 0) impleted = true;
if (nread < bufferSize) {
Array.Clear(buffer, nread, bufferSize - nread);
}
string s = encoding.GetString(buffer, 0, nread);
Console.WriteLine($"read {nread} bytes");
Console.WriteLine(s);
} while (!impleted);
}
}
static void ShowStreamInformations(Stream stream) {
Console.WriteLine(stream.CanRead);
Console.WriteLine(stream.CanWrite);
Console.WriteLine(stream.CanTimeout);
}
static Encoding GetEncoding(Stream stream) {
if (!stream.CanSeek) throw new ArgumentException("require a stream that can seek");
Encoding encoding = Encoding.ASCII;
byte[] bom = new byte[5];
int nread = stream.Read(bom, offset: 0, count: 5);
if (bom[0] == 0xff && bom[1] == 0xfe && bom[2] == 0 && bom[3] == 0)
{
Console.WriteLine("UTF-32");
stream.Seek(4, SeekOrigin.Begin);
return Encoding.UTF32;
}
else if (bom[0] == 0xff && bom[1] == 0xfe)
{
Console.WriteLine("UTF-16, little endian");
stream.Seek(2, SeekOrigin.Begin);
return Encoding.Unicode;
}
else if (bom[0] == 0xfe && bom[1] == 0xff)
{
Console.WriteLine("UTF-16, big endian");
stream.Seek(2, SeekOrigin.Begin);
return Encoding.BigEndianUnicode;
}
else if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) {
Console.WriteLine("UTF-8");
stream.Seek(3, SeekOrigin.Begin);
return Encoding.UTF8;
}
stream.Seek(0, SeekOrigin.Begin);
return encoding;
}
static void ReadAllLines(string f2) {
string[] readLines = File.ReadAllLines(f2);
foreach (string str in readLines) {
Console.WriteLine(str);
}
}
static void ReadLines(string f2) {
IEnumerable<string> vs = File.ReadLines(f2);
foreach (string line in vs) {
Console.WriteLine(line);
}
}
}
}
3.运行结果
源文件
读取的结果