FileNotFoundException,该文件存在Java

时间:2013-03-11 23:10:15

标签: java file-io mp3 filenotfoundexception jlayer

我有一个非常奇怪的问题,我正在尝试用一些Java代码和JLayer播放一些MP3。我有一个方法设置来生成文件路径,但它给了我一大堆的悲伤。这是return语句(以及方法中涉及的所有代码):

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";
}

上面的代码,工作正常,播放声音而不挂断。任何想法都将不胜感激,请询问是否有任何混淆。

stacktrace:

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

2 个答案:

答案 0 :(得分:1)

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

 return "file:///Users/user/Desktop/FinishedPhone/" + numSeq.trim() + ".mp3

答案 1 :(得分:-1)

好吧,我想问题来自你在路径前面使用file://方案的事实。我不确切知道File(String pathname)在使用此方案时的行为。 File类需要很多构造函数,特别是Javadoc所说的File(URI uri)

  

通过将给定文件: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而不是String或将此方法的返回值包装到URI