【问题标题】:Java Listing files in directoryJava 列出目录中的文件
【发布时间】:2012-03-22 03:49:26
【问题描述】:

我正在尝试获取一个目录(applet 目录中名为 music 的子目录)中所有 mp3 文件的列表,以便我可以在 JavaScript 函数中将它们的名称推送到数组中。

一切正常,但列出过程......它只返回目录中的第一个 mp3 文件,而不是其他文件......

这是我的代码

JAVA:

import java.applet.Applet;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

public class Main extends Applet {
    private static final long serialVersionUID = 1L;
    public void init() {
        File[] lib = getFiles(new File((getCodeBase() + File.separator + "music").substring(6)));
        for (File s:lib) {
            if (s.getName().substring(s.getName().length() - 3).equalsIgnoreCase("mp3")) {
                try {getAppletContext().showDocument(new URL("javascript:addSong('"+s.getName()+"')"));}
                catch (MalformedURLException me) {}
            }
        }
        try {getAppletContext().showDocument(new URL("javascript:init()"));}
        catch (MalformedURLException me) {}
    }
    public File[] getFiles(File dir) {
        return dir.listFiles();
    }
}

JavaScript:

function addSong(s) {
    // Adding to array
    window.songs.push("music/" + s);
    // Debug message
    alert(s);
}

function init() {
// Random code to initialze music player
// getting and listing values from "songs" which got content form addSong()
}

【问题讨论】:

  • 您是否尝试过从提供此小程序的主机之外的另一台主机执行此小程序?您无法使用new File() 访问服务器上的文件。
  • @JBNizet 我正要说同样的话,但既然你已经说过了,我只会投票赞成评论作为回复中提供的第一个明智的事情。
  • “我正在本地尝试” 那又怎样?让它在本地工作,它会仍然在生产中失败。整个方法需要改变(并且可能放弃任务)。
  • 它只应该在本地工作。
  • 那你到底为什么要编写一个applet?小程序只有在通过网络或 Internet 部署给人们时才真正有意义。顺便说一句 - 这个小程序需要数字签名,普通应用程序不需要。

标签: java javascript applet directory subdirectory


【解决方案1】:

我试过你的代码(在 Eclipse 上),它工作正常,确保你把文件放在正确的目录中

我不明白你为什么使用.substring(6)

【讨论】:

  • 这不适用于实时服务器。 File对象总是指向客户端文件系统。
【解决方案2】:

要列出(递归)给定目录中的所有文件(扩展名为 .mp3),我有以下代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class FileLister {

    private List<File> getFileList(File startingDir) throws FileNotFoundException {
        List<File> result = new ArrayList<File>();
        File[] filesAndDirs = startingDir.listFiles();
        List<File> filesDirs = Arrays.asList(filesAndDirs);
        for (File file : filesDirs) {
            result.add(file); 
            if (!file.isFile()) {               
                List<File> deeperList = getFileList(file);
                result.addAll(deeperList);
            }
        }

        return result;
    }

    public static void main(String[] args) throws FileNotFoundException {
        for(File file : new FileLister().getFileList(new File("D:\\Music"))){
            if(file.getName().contains(".")) {
                String extension = file.getName().substring(file.getName().lastIndexOf("."), file.getName().length());
                if(extension.equalsIgnoreCase(".mp3")) {
                    System.out.println(file.getName());
                }
            }
        }
    }
}

【讨论】:

  • 这在实时服务器上不起作用。 File对象总是指向客户端文件系统。
  • @AndrewThompson 谢谢。我不知道。我投了赞成票。有没有列出服务器的文件?
  • 只有在服务器本身的帮助下。例如。有些服务器不安全,会在目录中提供 HTML 表格或文件列表。小程序可能会解析它,但它很容易受到服务器更改的影响。或者,服务器端人员可能会提供一个小程序可以连接到的 servlet(PHP、ASP 等)以获得更简单的列表。据推测,此服务器端功能将进行检查以确保小程序仅询问特别允许的目录的内容。
【解决方案3】:

我对您的代码做了些微改动。看看这个。这应该可以解决您的问题:

import java.applet.Applet;
import java.io.File;
import java.io.FilenameFilter;
import java.net.MalformedURLException;
import java.net.URL;

public class Main extends Applet {
    private static final long serialVersionUID = 1L;

    @Override
    public void init() {
        File[] lib = getMP3Files("E:/Music/BollywoodMusic"); // pass your directory name here
        for(File s:lib) {
            try { getAppletContext().showDocument(new URL("javascript:addSong('"+s.getName()+"')")); } catch(MalformedURLException me) {}
        }

        try {getAppletContext().showDocument(new URL("javascript:init()"));}
        catch (MalformedURLException me) {}
    }

    public static File[] getMP3Files(String directoryName) {
        File directory = new File(directoryName);
        return directory.listFiles(new FilenameFilter() {
            public boolean accept(File directory, String fileName) {
                return fileName.endsWith(".mp3"); } });
    }

}

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2013-08-30
    相关资源
    最近更新 更多