2

非常に奇妙な問題があります。JavaコードとJLayerを使用してMP3を再生しようとしています。ファイルパスを生成するためのメソッド設定がありますが、それは私に多くの悲しみを与えています。returnステートメント(およびメソッドに含まれるすべてのコード)は次のとおりです。

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

私はおそらく1.mp3、2.mp3などの名前の約150のmp3ファイルのセットを持っています。それらは約156になります(間にいくつかの欠落があります)。3桁のコードのユーザー入力に基づいて、サウンドの1つを再生します。このコードは、 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

100未満の場合はls-l:

-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 に答える