2013-12-24 4 views
0

Я знаю, что есть способ выбрать случайный файл из каталога, но я не знаю, как он закодирован на Java. Однако у меня псевдокод. Я спрашиваю, могу ли я подтолкнуть вас в правильном направлении. Моя псевдокод выглядит следующим образом:Случайный доступ к файлам Java

dir = "directory"; 
String[] files = dir.listfiles(); 
String next = rand.nextInt(files.length); 
Image img = next; 

Поэтому я хочу, чтобы это сделать, как это происходит потому, что у меня есть список изображений, которые я хотел бы перебирать долго.

+0

Есть только файлы (никаких других каталогов) в каталоге? –

+0

Что случилось с псевдокодом, который у вас выше? Похоже, что он должен работать, помимо того факта, что 'listFiles' возвращает массив объектов' File', а не 'String' –

+0

@peeskillet: Есть несколько других каталогов, но мне все равно, являются ли они/aren Включено. Кроме того, меня не беспокоит, что psuedocode является неправильным, я просто не совсем понимаю, как его поместить в Java-код. – Derpster13

ответ

1

Вы, кажется, находитесь на правильном пути. Только вещь listFiles() возвращает File[] не String[]

Может быть, попробовать что-то вроде этого

File file = new File(filename); 
File[] files = new File[0];  // initialize 
if (file.isDirectory()){ 
    files = file.listFiles(); // populate 
} 
int fileIndex = new Random().nextInt(files.length);  // get random index 
Image img = new ImageIcon(files[fileIndex]).getImage(); // create image 

Хотя выше, может работать, то рекомендуется использовать URL для встроенных ресурсов, а не файлы. Что-то вроде этого

String[] filenames = file.list(); // list returns String 
int fileIndex = new Random().nextInt(filenames.length); 
Image img = null; 
java.net.URL url = MyClass.class.getResource(filenames[fileIndex]); 
if (url != null){ 
    img = new ImageIcon(url).getImage(); 
} else { 
    img = null; 
} 

При использовании class.gerResource(). Файл будет искать в местоположении файлов классов. Вы можете также изменить путь немного, если вы хотите, файл структура, как этот

ProjectRoot 
      bin 
      MyClass.class 
      images 
        image1.png 
        image2.png 
      src 

Затем вы можете использовать этот код

java.net.URL url = MyClass.class.getResource("images/" + filenames[fileIndex]); 
+0

Является ли имя файла именем каталога, содержащего изображения? – Derpster13

+0

Да ............. –

4

Ваш псевдо-код выглядит хорошо, вы можете получить все имена рекурсивно, хранить имена в ArrayList, и случайным образом получить имена из ArrayList, как показано ниже:

static ArrayList<String> files = new ArrayList<String>(); 

public static void main(String[] args) { 
    File dir = new File("."); 
    getFileNames(dir); 
    Random rand = new Random(); 
    String next = files.get(rand.nextInt(files.size())); 
} 

private static void getFileNames(File curDir) { 
    File[] filesList = curDir.listFiles(); 
    for (File f : filesList) { 
     if (f.isDirectory()) 
      getFileNames(f); 
     if (f.isFile()) { 
      files.add(f.getName()); 
     } 
    } 
} 
0

Вот как я бы реализовать свой псевдо-код

private static final Random random = new Random(0x20131224^// A seed value 
     System.currentTimeMillis());       // and more seed value(s). 
public static File getRandomFile(String filePath) { 
    File f = new File(filePath);        // Do we have a directory? 
    if (f == null || ! f.isDirectory()) { 
    return f; 
    } 
    File[] files = f.listFiles(); 
    List<File> al = new ArrayList<File>(); 
    for (File file : files) { 
    if (file != null && file.isFile() && file.canRead()) { // Make sure it's a file. 
     al.add(file); 
    } 
    } 
    return al.get(random.nextInt(al.size()));     // Get a random file. 
} 
+0

Нет необходимости добавлять начальное значение в случайное значение, если вы не хотите одинаковых значений каждый раз ... Конструктор no-args по умолчанию делает правильные вещи. – haraldK

0
File filedir=new File("C:\\Users\\ramaraju\\Desktop\\japan02-12\\"); 
File[] files=filedir.listFiles(); 

Random generator = new Random(); 
int Low = 0; 
int High = files.length; 
int R = generator.nextInt(High-Low) + Low; 
System.out.println(R); 
for (int i = 0; i < files.length; i++) { 
    if(i==R) 
    { 
     System.out.println(files[i].getName()); 
    } 
} 
+1

Добро пожаловать в StackOverflow (SO)! Всегда полезно проверять форматирование перед отправкой сообщения. Это прямо под текстовым полем. Кроме того, всегда полезно иметь текст, сопровождающий ваш пост. Вы можете отредактировать его, чтобы добавить дополнительную информацию. –

Смежные вопросы