例:
variable = new StreamReader( file ).ReadToEnd();
Run Code Online (Sandbox Code Playgroud)
那可以接受吗?
我显然已经习惯了一个糟糕的编码习惯.这是我写的代码示例:
using(StreamReader sr = new StreamReader(File.Open("somefile.txt", FileMode.Open)))
{
//read file
}
File.Move("somefile.txt", "somefile.bak"); //can't move, get exception that I the file is open
Run Code Online (Sandbox Code Playgroud)
我认为,因为using条款明确要求Close(),并Dispose()在StreamReader该FileStream会也关闭.
我能解决问题的唯一方法是将上面的块更改为:
using(FileStream fs = File.Open("somefile.txt", FileMode.Open))
{
using(StreamReader sr = new StreamReader(fs))
{
//read file
}
}
File.Move("somefile.txt", "somefile.bak"); // can move file with no errors
Run Code Online (Sandbox Code Playgroud)
应该StreamReader通过在第一个区块中关闭而关闭底层FileStream?或者,我错了吗?
我决定发布实际的违规代码块,看看我们是否可以深入了解这一点.我现在很好奇.
我以为我在using条款中遇到了问题,所以我把所有内容都扩展了,每次都无法复制.我在这个方法调用中创建了文件,所以我认为其他任何文件都没有打开句柄.我还验证了Path.Combine调用返回的字符串是否正确.
private static void GenerateFiles(List<Credit> credits)
{
Account i; …Run Code Online (Sandbox Code Playgroud) 我尝试了unxutils ' wc -l但它崩溃了1GB文件.我试过这个C#代码
long count = 0;
using (StreamReader r = new StreamReader(f))
{
string line;
while ((line = r.ReadLine()) != null)
{
count++;
}
}
return count;
Run Code Online (Sandbox Code Playgroud)
它在4秒内读取500MB文件
var size = 256;
var bytes = new byte[size];
var count = 0;
byte query = Convert.ToByte('\n');
using (var stream = File.OpenRead(file))
{
int many;
do
{
many = stream.Read(bytes, 0, size);
count += bytes.Where(a => a == query).Count();
} while (many == size);
}
Run Code Online (Sandbox Code Playgroud)
在10秒内读取
var count …Run Code Online (Sandbox Code Playgroud) 使用Google的新Android Studio IDE获得了一个全新的项目.
我正在尝试使用一个简单的文本文件InputStreamReader.我收到的文件未找到异常.现在没有任何资产/文件夹.我尝试创建一个并在许多不同的位置添加我的文件(在项目的根目录,.java文件的根目录等等)我试图移动文件但仍然得到文件找到.
现在,使用Eclipse从来都不是问题,因为任何模板都会创建一个资产文件夹.
有谁知道资产应该去哪里或如何加载它们?
这是使用的代码,它在.open()失败:
InputStream iS = resources.getAssets().open("bla.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(iS));
Run Code Online (Sandbox Code Playgroud)
我也在Eclipse中尝试了这个代码,它可以工作并且文件内容被加载了.因此Android Studio中可能需要一步.
文档简单地说ReadBlock是
"阻止版本的阅读"
但是,这是什么意思?
之前有人问过这个问题,但是,是吧?
http://www.pcreview.co.uk/forums/thread-1385785.php
那个回答的人说
基本上,这意味着您可以依赖StreamReader.ReadBlock返回,直到它读取的次数与您要求的一样多,或者它已到达流的末尾.
我是否正确理解这是必需的,因为Read可能无法为您提供所需的一切?那只是因为它返回0并不意味着你到达文件的末尾?
那么这意味着检查返回的字节数以外的其他内容(EndOfStream?)或使用ReadBlock代替?
有没有办法提前读取一行来测试下一行是否包含特定的标签数据?
我正在处理一个具有开始标记但没有结束标记的格式.
我想读一行将它添加到一个结构然后测试下面的行,以确保它不是一个新的"节点",如果它不是继续添加,如果它是关闭该结构并创建一个新的
我能想到的唯一解决方案就是让两个流读取器在同一时间沿着锁定步骤出现,但这看起来很浪费(如果它甚至可以工作)
我需要像peek但peekline这样的东西
我一直在谷歌搜索过去几个小时并尝试不同的东西,但似乎不能在这个底部....
当我运行此代码时,内存使用量不断增长.
while (true)
{
try
{
foreach (string sym in stringlist)
{
StreamReader r = new StreamReader(@"C:\Program Files\" + sym + ".xml");
XmlSerializer xml = new XmlSerializer(typeof(XMLObj), new XmlRootAttribute("rootNode"));
XMLObj obj = (XMLObj)xml.Deserialize(r);
obj.Dispose();
r.Dispose();
r.Close();
}
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
Thread.Sleep(1000);
Console.Clear();
}
Run Code Online (Sandbox Code Playgroud)
XMLObj是一个自定义对象
[Serializable()]
public class XMLObj: IDisposable
{
[XmlElement("block")]
public List<XMLnode> nodes{ get; set; }
public XMLObj() { }
public void Dispose()
{
nodes.ForEach(n => n.Dispose());
nodes= null;
GC.SuppressFinalize(this);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试添加GC.Collect(); 但这似乎没有做任何事情.
我注意到它会一遍又一遍地返回相同的读取字符,但我想知道是否有更优雅的方式.
我有以下代码从csv文件中读取值并进行一些处理.我想跳过输入csv文件的第一行,因为它包含头文本,但我想在处理完成后将其添加回去.
List<string> values = new List<string>();
using (StreamReader sr = new StreamReader(filePath))
{
while (sr.Peek() != -1)
{
string line = sr.ReadLine();
List<string> lineValues = line.Split(',').ToList();
var tempMinInt = 1;
var tempValue = 1;
var tempValInt = Convert.ToInt32(lineValues[4]);
if (lineValues[3] == "1876")
{
if (tempValInt % 60 != 0)
{
tempMinInt = (tempValInt / 60) + 1;
tempValue = tempMinInt * 30;
}
else
{
tempMinInt = tempValInt / 60;
tempValue = tempMinInt * 30;
}
}
else if (lineValues[3] …Run Code Online (Sandbox Code Playgroud) 我有一个文本文件,其中包含几个"记录".每条记录都包含一个名称和一组数字作为数据.
我正在尝试构建一个将读取文件的类,仅显示所有记录的名称,然后允许用户选择他/她想要的记录数据.
我第一次浏览文件时,我只读取标题名称,但我可以跟踪标题所在文件中的"位置".我需要随机访问文本文件,以便在用户请求后查找每条记录的开头.
我必须这样做,因为文件太大,无法完全在内存(1GB +)中读取应用程序的其他内存需求.
我已经尝试使用.NET StreamReader类来实现这一点(它提供了非常容易使用的'ReadLine'功能,但是没有办法捕获文件的真实位置(BaseStream属性中的位置因为缓冲类使用).
在.NET中没有简单的方法吗?