2013-03-11 4 views
2

У меня очень странная проблема, я пытаюсь воспроизвести некоторые MP3-файлы с некоторым кодом Java и JLayer. У меня есть метод настройки для создания пути к файлу, но это дает мне массу горя. Вот оператор возврата (и весь код участвует в методе):FileNotFoundException, файл существует Java

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

У меня есть набор, может быть ~ 150 mp3 файлов, все названные 1.mp3, 2.mp3 и т.д. Они идут до примерно 156 (между ними есть недостающие промежутки). Основываясь на пользовательском вводе трехзначного кода, он воспроизводит один из звуков. Этот код работает безупречно для чего-то между 1-99, его когда вы добираетесь до 100, где он перестает работать. Когда пользователь нажимает 100 или 110 или что у вас есть, Java выдает исключение FileNotFoundException. Уверяю вас, файл есть. Вот код, который использует FilePath возвращенное 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 
+0

Можете ли вы показать стек? – beny23

+0

В findSoundFile(), что вы видите при просмотре «numSeq» в отладчике или при печати на System.out? –

+0

Что вы получите, если вы отлаживаете findSoundFile для значения numSeq, когда пользователь вводит 100 или выше? –

ответ

1

Ваш numSeq имеет проблемы. Попробуйте обрезать его вот так:

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

Ну, я думаю, проблема заключается в том, что вы используете схему file:// перед дорогой. Я не знаю точно, как ведет себя File(String pathname) при использовании этой схемы. Класс File занимает много конструкторов и particuly это один File(URI uri) которого Javadoc говорит:

Создает новый экземпляр File, преобразовывая данный файл: URI в абстрактном пути.

Итак, на мой взгляд, вы должны использовать этот конструктор вместо предыдущего. Позвольте мне показать вам код, который доказывает, что я говорю:

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) конструктору, он возвращает ложь, но когда я прохожу его в URI, он возвращает истину.

Меняет findSoundFile вернуть URI вместо строки или завернутого возвращаемого значение этого метода к URI

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