流.Write使用UT16而不是UTF8



我们得到了一个过程,它接受一个文本文件(带有目录列表)并将其保存到一个数据文件中。它从TXT文件中获取所有行,将它们转换为字节[],并将它们保存为数据文件。

格式为[size_of_file] [num_of_lines][list_of_directories]

例如:[12 0 0 0][1 0 0 0][92 0 97 0 ....]

现在,我们得到了另一个进程,它调用了一个rest API来传输这个数据文件,并再次将其转换为文本文件。

问题:当我用1行文本文件时,转换流的过程将文本文件创建为UTF-16 LE,而如果文件有超过1行,它将创建为UTF-8

代码:

public static void ExtractDatFileData(string datFilePath)
{
// Open DAT file as stream
var info = new FileInfo(datFilePath);
var stream = info.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
// Write stream into "data.dat" file (creates a copy to read that data from it)
var inputFile = Path.Combine(@"C:demodata.dat");
using (var file = File.OpenWrite(inputFile))
{
stream.CopyTo(file);
}
const int BUFFER_SIZE = 1024 * 1024;
byte[] buffer = new byte[BUFFER_SIZE];
using (Stream input = File.OpenRead(inputFile))
{
// Read the size of the file
int bytesRead = input.Read(buffer, 0, 4);
int fileSize = BitConverter.ToInt32(buffer, 0);
// Read data from the DAT file
while (input.Position < input.Length)
{

// --- directories list ---
var dirTxtPath = Path.Combine(@"C:demodirectories.txt");
using (Stream output = File.Create(dirTxtPath))
{
int remaining = fileSize;
while (remaining > 0 && (bytesRead = input.Read(buffer, 0, Math.Min(remaining, BUFFER_SIZE))) > 0)
{
output.Write(buffer, 0, bytesRead);
remaining -= bytesRead;
}
}
}
}
}

现在,这是有问题的代码:

var dirTxtPath = Path.Combine(@"C:demodirectories.txt");
using (Stream output = File.Create(dirTxtPath))
{
int remaining = fileSize;
while (remaining > 0 && (bytesRead = input.Read(buffer, 0, Math.Min(remaining, BUFFER_SIZE))) > 0)
{
output.Write(buffer, 0, bytesRead);
remaining -= bytesRead;
}
}

似乎output.Write(buffer, 0, bytesRead);将在不同的场景中写成utf-16或utf-8,但我不确定它是如何决定如何创建文件编码的。

我做过的事:

我确保在编写原始DAT文件时,它为1行或更多行执行相同的代码。我检查了一遍,然后又检查了一遍:)

我检查了使用比较工具(Beyond compare)创建的两个DAT文件,似乎数据是相同的格式

对为什么会发生这种情况有什么想法吗?

根据需要使用StreamWriter写入文本数据

using (TextWriter w = new StreamWriter(outputFile, false, Encoding.ASCII)) // Or whatever encoding you need.
{
//...
w.Write("SomeString"); // This converts the (unicode) String to the encoding provided above.
}

在代码中,您将文本复制为原始二进制数据。根据输入文件格式的不同,它可能会加上字节顺序标记,而字节顺序标记又会被复制到输出中,从而导致输出文件也获得不同的格式。