2

我有一个非常奇怪的问题,我正在尝试使用一些 Java 代码和 JLayer 播放一些 MP3。我有一个方法设置来生成文件路径,但这让我很伤心。这是返回语句(以及该方法中涉及的所有代码):

private static String findSoundFile(String numSeq)
{
    return "file:///Users/user/Desktop/FinishedPhone/" + numSeq + ".mp3"
}

我有一组大约 150 个 mp3 文件,全部命名为 1.mp3、2.mp3 等。它们最多可达 156 个(中间有一些缺失)。根据用户输入的 3 位代码,它会播放其中一种声音。这段代码完美地适用于 1-99 之间的任何东西,当你到达 100 时它会停止工作。当用户输入 100 或 110 或你有什么时,Java 会抛出 FileNotFoundException。我向你保证,文件在那里。下面是使用 findSoundFile 返回的文件路径的代码:

public static void processNumberSequence(String numSeq) throws IOException
{
    if (numSeq != "")
    {
        String soundLoc = findSoundFile(numSeq);
        File file = new File(soundLoc);
        System.out.println("System can read: " + file.canRead());
        System.out.println(soundLoc);
        SoundPlayer soundToPlay = new SoundPlayer(soundLoc);
        soundToPlay.play();
    }
}

当我填写 numSeq 应该填写的空间时,它变得更奇怪了,如下所示:

private static String findSoundFile(String numSeq)
{
    return "file:///Users/user/Desktop/FinishedPhone/110.mp3";
}

上面的代码工作正常,播放声音没有挂断。任何想法将不胜感激,如果有任何困惑,请询问。

堆栈跟踪:

java.io.FileNotFoundException: /Users/user/Desktop/FinishedPhone/111.mp3 (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:120)
at java.io.FileInputStream.<init>(FileInputStream.java:79)
at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
at java.net.URL.openStream(URL.java:1010)
at SoundPlayer.play(SoundPlayer.java:26)
at SerialProcessor.processNumberSequence(SerialProcessor.java:37)
at SerialTest.serialEvent(SerialTest.java:98)
at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732)
at gnu.io.RXTXPort.eventLoop(Native Method)
at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575)

ls -l 文件之一:

-rw-r--rw-  1 user  staff  432923 Feb 27 14:15 /Users/user/Desktop/FinishedPhone/111.mp3

ls -l 用于 100 岁以下的人:

-rw-r--rw-  1 user  staff  480570 Feb 25 20:43 /Users/user/Desktop/FinishedPhone/99.mp3
4

2 回答 2

1

你的 numSeq 有问题。试着像这样修剪它

 return "file:///Users/user/Desktop/FinishedPhone/" + numSeq.trim() + ".mp3
于 2013-03-12T00:00:15.007 回答
-1

好吧,我想问题在于您file://在路径前面使用了方案。我不确切知道File(String pathname)使用此方案时的行为方式。File 类采用许多构造函数,尤其是File(URI uri)Javadoc 中说的这个:

通过将给定的 file: URI 转换为抽象路径名来创建一个新的 File 实例。

所以,在我看来,你应该使用这个构造函数而不是之前的构造函数。让我向您展示一些证明我所说的话的代码:

    public class FileTest {

    /**
     * @param args
     * @throws URISyntaxException 
     */
    public static void main(String[] args) throws URISyntaxException {
        // TODO Auto-generated method stub
        String pathWithNoScheme = "/home/dimitri/workspace/Coursera/collinear/input6.txt";
        String pathWithScheme = "file://" + pathWithNoScheme;
        URI uri = new URI(pathWithScheme);


        File fileWithNoScheme = new File(pathWithNoScheme);
        System.out.println(fileWithNoScheme.canRead()); //returns true

        File fileWithScheme = new File(uri);
        System.out.println(fileWithScheme.canRead()); //returns true

        fileWithNoScheme = new File(pathWithScheme);
        System.out.println(fileWithNoScheme.canRead()); //returns false

    }

}

如您所见,将file://方案传递给File(String pathName)构造函数时,它返回 false,但是当我将其传递给 URI 时,它返回 true。

所以更改findSoundFile为返回一个URI而不是一个字符串或将此方法的返回值包装到一个URI

于 2013-03-11T23:54:46.380 回答