Когда я перечисляю файлы каталога, который имеет 300 000 файлов с Java, из памяти происходит.
String[] fileNames = file.list();
То, что я хочу, является путем, который может перечислить все файлы каталога инкрементно, неважно, сколько файлов в том определенном каталоге и не будет иметь "из памяти" проблемой со значением по умолчанию 64M предел "кучи".
Я имею Google некоторое время и не могу найти такой путь в чистом Java.
Пожалуйста, помогите мне!!
Примечание, JNI является возможным решением, но я ненавижу JNI.
Я знаю, что вы сказали: «С по умолчанию 64 м кучи кучи», но давайте посмотрим на факты - вы хотите удерживать (потенциально) большое количество предметов в памяти, используя механизмы, доступные для вас Java. Итак, если не существует какая-то тяжелая причина, которую вы не можете, я бы сказал, что увеличение кучи - это путь.
Вот ссылка на одно и то же обсуждение в Javaranch: http://www.coderanch.com/t/381939/java-general/java/iterate-over-files-directory
Редактировать В ответ на комментарий: Причина, по которой я сказал, что хочет провести большое количество предметов в памяти, заключается в том, что это единственный механизм Java предусматривает список каталога без использования собственного интерфейса или механизмов платформы (а ОП сказал Он хотел «чисто ява»).
Наличие 300 000 файлов в DIR - это не хорошая идея - файловые системы AFAIK не очень хороши на том, чтобы иметь множество подмазных узлов в одном узле. Интересный вопрос, хотя.
Редактировать: Ниже не помогает, см. Комментарии.
Я думаю, что вы можете использовать файлфильтр, отклонить все файлы и обрабатывать их в фильтре.
new File("c:/").listFiles( new FileFilter() {
@Override public boolean accept(File pathname) {
processFile();
return false;
}
});
Когда вы используете литерал, как в этом случае, это просто синтаксический сахар, чтобы быстро создать объект NSString. После создания объект ведет себя так же, как и другой. Разница в том, что ваш ряд компилируется в программу, а не создается динамически.
-121--3560041- Для установки дополнительных параметров можно использовать обратный вызов beforeSend
(объект XMLHTTPRequest
передается ему в качестве единственного параметра).
Чтобы вы знали, этот тип междоменных запросов не будет работать в обычном сценарии сайта и не будет работать с любым другим браузером. Я даже не знаю, какие ограничения безопасности накладывает FF 3.5, просто чтобы вы не били головой о стену просто так:
$.ajax({
url: 'http://bar.other',
data: { whatever:'cool' },
type: 'GET',
beforeSend: function(xhr){
xhr.withCredentials = true;
}
});
Еще одна вещь, к которой стоит остерегаться, это то, что jQuery настроен для нормализации различий в браузере. Дополнительные ограничения накладываются библиотекой jQuery, запрещающей этот тип функциональности.
-121--870605-Вам немного не повезло здесь. Меньше всего нужно будет создать 300 тысяч последовательностей. Со средней длиной 8-10 символов и 2 байта на символ, которая 6Mb минимальной. Добавьте заголовок указателя объекта на последовательность (8 байт), и вы достигнете предела памяти.
Если у вас должно быть столько файлов в одном каталоге, что я бы не рекомендовал, так как у вашей файловой системы будут проблемы, лучше всего запустить собственный процесс (не JNI) через Runtime.exec. Имейте в виду, что вы свяжете себя с ОС (ls vs dir). Вы сможете получить список файлов в виде одной большой последовательности и будете нести ответственность за его последующую обработку в том, что вы хотите.
Надеюсь, это поможет.