2013-10-13 2 views
3

Как я могу преобразовать inputStream в URL? Вот мой код:Java конвертировать inputStream в URL

InputStream song1 = this.getClass().getClassLoader().getResourceAsStream("/songs/BrokenAngel.mp3"); 
URL song1Url = song1.toUrl(); //<- pseudo code 
MediaLocator ml = new MediaLocator(song1Url); 
Player p; 
try { 
    p = Manager.createPlayer(ml); 
    p.start(); 
} catch (NoPlayerException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

Нет, вы не можете, если входной поток считывается. –

ответ

1

Обратите внимание, что этот подход требует mp3 быть в подкаталог песен вашего приложения. Вы можете также использовать относительные Pathing для /songs/BrokenAngel.mp3 части (../../ или что-то в этом роде. Но это занимает ваш каталог приложений в качестве базы! Не

File appDir = new File(System.getProperty("user.dir")); 
    URI uri = new URI(appDir.toURI()+"/songs/BrokenAngel.mp3"); 
    // just to check if the file exists 
    File file = new File(uri); 
    System.out.println(file.exists()) 
    URL song1Url = uri.toURL(); 
-1

Попробуйте

InputStream input = new URL("http://www.somewebsite.com/a.txt").openStream(); 
1

Я думаю, что вы хотите ClassLoader.findResource(String)

Это должно вернуть правильно отформатированный банку: // URL. Я не тестировал его сам, так что будьте осторожны

3

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

URL url = this.getClass().getClassLoader().getResource("/songs/BrokenAngel.mp3");

Если же вы получить входной поток в одной части вас кода, а затем передать его в другой модуль, и там хотят, чтобы найти то, что было источником URL для этого входного потока «почти» невозможно. Проблема в том, что вы получаете BufferedInputStream, который обертывает FileInputStream, который не хранит информацию об этом источнике. Вы не можете получить его, даже используя отражение. Если вы действительно хотите сделать это, вы можете сделать следующее.

  1. реализовать у вас есть UrlInputStream extends InputStream попадает в конструктор URL, хранит его в классе varible, создает входной поток посредством вызова url.openStream() и заворачивает.

  2. Теперь вы можете использовать свой поток как обычный поток ввода, пока не получите URL-адрес. На этом этапе вы должны отдать его на свой UrlInputStream и вызвать метод getUrl(), который вы реализуете.

+0

Но тогда я получаю NullPointer Exeption: 'исключение в потоке "главный" java.lang.NullPointerException \t на javax.media.MediaLocator (MediaLocator.java:37) \t в com.ymail.sanchixx.sanchixx.Interface. .initComposant (Interface.java:39) \t at com.ymail.sanchixx.sanchixx.Interface. (Interface.java:31) \t на com.ymail.sanchixx.sanchixx.Main.main (Main.java:8) ' – sanchixx

+0

Не могли бы вы обновить свой пост, с новым кодом, чтобы мы могли найти новую ошибку? – Vallentin

0

Попробуйте

URI uri = new URI("/songs/BrokenAngel.mp3"); 
URL song1Url = uri.toURL(); 

MediaLocator ml = new MediaLocator(song1Url); 
Player p; 
try { 
    p = Manager.createPlayer(ml); 
    p.start(); 
} catch (NoPlayerException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

'Исключение в потоке "основной" java.lang.IllegalArgumentException: URI не является абсолютным \t в java.net.URI.toURL (Unknown Source) \t в com.ymail.sanchixx.sanchixx.Interface.initComposant (Interface.java : 49) \t at com.ymail.sanchixx.sanchixx.Interface. (Interface.java:33) \t at com.ymail.sanchix.sanchixx.Main.main (Main.java:8) ' – sanchixx