#java
Есть URL.
Нужно чтобы был отправлен запрос : т.е. Java перешла по ссылке.
И получила ответ : в виде Wav файла,который необходимо воспроизвести.
Как это реализовать?Какие дополнительные библиотеки нужно подключить?
Посмотрел похожие темы,есть реализованная на PHP. Но нужна Java.
Отправить запрос насколько мне известно можно так :
URL url = new URL("https://");
url.openConnection();
А вот как полученный ответ в виде Waw файла сохранить и воспроизвести.Хотя сохранять
необязательно.
ещё увидел вот такую конструкцию
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.URL;
public class MainClass {
public static void main(String[] args) {
try {
URL url = new URL("file:youraudiofile.wav" );
AudioClip ac = Applet.newAudioClip(url);
ac.play();
System.out.println("Press any key to exit.");
System.in.read();
ac.stop();
} catch (Exception e) {
System.out.println(e);
}
}
Вся проблема в том,что когда переходишь по ссылке итоговая страница уже воспроизводит
звук в браузере.
А нужно чтобы Java сохранила файл,дала ему расширение.
Пример простой попытки включить аудио-файл:
package sayme;
import java.io.IOException;
import java.net.*;
import java.applet.*;
public class URLReader {
public static void main(String a[]) {
try {
String str1 = "http://dll.zf.fm/music/f/7e/clean_bandit_feat_sean_paul__anne-marie_-_rockabye_(zf.fm).mp3";
URL url = new URL(str1); // 1
AudioClip clip = Applet.newAudioClip(url);
clip.play();
} catch (java.net.MalformedURLException e) {
e.printStackTrace();
}
}
}
я не слышу звук,когда выполняется код.
даже если после поставить вот так :
clip.play();
Thread.sleep(10000);
программа отработает 15 секунд и выключится.
программа отлично работает с файлами которые имеются в системе,а не в интернете.
естественно,если перейти по этой ссылке в браузере - он включит это трек в браузере.
А вот воспроизвести так сказать из кода он не даёт.
В чем проблема?
Ответы
Ответ 1
Отправить запрос насколько мне известно можно так : URL url = new URL("https://"); url.openConnection(); Цитата Это не совсем так... URL url = new URL("https://"); - просто создается инстанс URL. url.openConnection(); - создается инстанс коннекта (URLCOnnection). Но никаких данных еще никуда не отправлено. Это только заготовка. Помимо этого недурно еще установить параметры коннекта: будет ли он принимать/отправлять данные (setDoInput(), setDoInput()), метод запроса (GET, POST, PUT и т.д.), таймаут коннекта, указать заголовки запроса. В качестве примера: proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("", )); conn = (HttpURLConnection) url.openConnection(proxy); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); conn.setConnectTimeout(60000); conn.setRequestMethod("GET"); // подготовили коннект // Т.к. запрос у нас GET, то сразу принимаем входящие данные. // Вот тут как раз (при открытии InputStream ) и происходит отправка GET запроса на сервер. InputStream inStream = conn.getInputStream(); // Т.к. файл у нас бинарный, открываем ReadableByteChannel и создаем файл ReadableByteChannel rbc = Channels.newChannel(conn.getInputStream()); FileOutputStream fos = new FileOutputStream("<имя_файла_для_сохранения>"); // Перенаправляем данные из ReadableByteChannel прямо канал файла. // Говорят, так быстрее, чем по одному байту вычитывать из потока и писать в файл. long filePosition = 0; long transferedBytes = fos.getChannel().transferFrom(rbc, filePosition, Long.MAX_VALUE); while(transferedBytes == Long.MAX_VALUE){ filePosition += transferedBytes; transferedBytes = fos.getChannel().transferFrom(rbc, filePosition, Long.MAX_VALUE); } rbc.close(); fos.close(); Если прокси нет, то conn = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); А вообще это хардкорный способ. Гораздо удобнее использовать библиотеку Apache HttpClient Код грубоват, но должен с работать. Но сначала советую попробовать скачать файл на более простом ресурсе, где нет "охранных систем": public class NewClass { public static void main(String[] args) throws IOException{ HttpURLConnection conn = null; try{ URL url = new URL("http://dll.zf.fm/music/f/7e/clean_bandit_feat_sean_paul__anne-marie_-_rockabye_(zf.fm).mp3"); conn = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); conn.setDoInput(true); //conn.setDoOutput(true); conn.setUseCaches(false); conn.setConnectTimeout(60000); conn.setRequestMethod("GET"); // подготовили коннект // Т.к. запрос у нас GET, то сразу принимаем входящие данные. // Вот тут как раз (при открытии InputStream ) и происходит отправка GET запроса на сервер. InputStream inStream = conn.getInputStream(); // Т.к. файл у нас бинарный, открываем ReadableByteChannel и создаем файл ReadableByteChannel rbc = Channels.newChannel(conn.getInputStream()); FileOutputStream fos = new FileOutputStream("qwe.mp3"); // Перенаправляем данные из ReadableByteChannel прямо канал файла. // Говорят, так быстрее, чем по одному байту вычитывать из потока и писать в файл. long filePosition = 0; long transferedBytes = fos.getChannel().transferFrom(rbc, filePosition, Long.MAX_VALUE); while(transferedBytes == Long.MAX_VALUE){ filePosition += transferedBytes; transferedBytes = fos.getChannel().transferFrom(rbc, filePosition, Long.MAX_VALUE); } rbc.close(); fos.close(); }catch(Exception e){ InputStreamReader inStream = new InputStreamReader(conn.getErrorStream()); char[] cbuf = new char[1]; String result= ""; BufferedReader in = new BufferedReader(inStream); while (in.read(cbuf) != -1) { result += String.valueOf(cbuf); } System.out.println("result:" + result); } } }
Комментариев нет:
Отправить комментарий