Хотя File.ReadAllLines()
является одним из простейших способов чтения файла, он также является одним из самых медленных.
Если вы просто хотите читать строки в файле, не делая многого, в соответствии с этими критериями , самым быстрым способом чтения файла является старый метод:
using (StreamReader sr = File.OpenText(fileName))
{
string s = String.Empty;
while ((s = sr.ReadLine()) != null)
{
//do minimal amount of work here
}
}
Однако, если вам приходится много делать с каждой строкой, тогда в этой статье делается вывод о том, что лучший способ заключается в следующем (и быстрее предварительно назначить строку [], если вы знаете, сколько строк вы собираетесь читать):
AllLines = new string[MAX]; //only allocate memory here
using (StreamReader sr = File.OpenText(fileName))
{
int x = 0;
while (!sr.EndOfStream)
{
AllLines[x] = sr.ReadLine();
x += 1;
}
} //Finished. Close the file
//Now parallel process each line in the file
Parallel.For(0, AllLines.Length, x =>
{
DoYourStuff(AllLines[x]); //do your work here
});
Проблема состояла в том, что я делал шаг слишком далеко в вызове метода синтаксического анализа XMLReader. Метод синтаксического анализа принимает InputSource, таким образом, не было никакой причины даже использовать FileReader. Изменение последней строки кода выше к
xr.parse( new InputSource( filename ));
работает просто великолепно.
Похож на Вас, хотят использовать java.lang.Class.getResourceAsStream(String)
, видеть
http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getResourceAsStream (java.lang. Строка)
Вы не говорите, является ли это настольным приложением или веб-приложением. Я использовал бы getResourceAsStream()
метод от соответствующего ClassLoder, если это - рабочий стол или Контекст, если это - веб-приложение.
Выглядит, как будто Вы используете эти URL.toString
результат как аргумент FileReader
конструктор. URL.toString
немного повреждается, и вместо этого необходимо обычно использовать url.toURI().toString()
. В любом случае строка не является путем к файлу.
Вместо этого Вы должны также:
URL
к ServicesLoader
и позволяют ему звонить openStream
или подобный. Class.getResourceAsStream
и просто проходят через поток, возможно в InputSource
. (Не забудьте проверять на пустые указатели, поскольку API немного грязен.) За пределами Вашей техники почему бы не использовать стандартный класс Java JarFile для получения ссылок Вы хотите? Оттуда большинство Ваших проблем должно уйти.