2014-11-16 4 views
0

나는 인터넷에서 오디오 파일을 스트리밍하고 재생하려고합니다. 이 코드 사용하고 있습니다 :자바 스트림 병렬 읽기/쓰기

int readBytes = 0; 
    byte[] audioBuffer = new byte[this.EXTERNAL_BUFFER_SIZE]; 

    readBytes = in.read(audioBuffer, 0, audioBuffer.length); 
    while (readBytes != -1) { 
     readBytes = in.read(audioBuffer, 0, audioBuffer.length); 
     if (readBytes >= 0) { 
      dataLine.write(audioBuffer, 0, readBytes); 
     } 
    } 

이 가진 문제는 스트림이 읽을 때, 그것은 기록되지 않는다는입니다. 따라서 음악은 몇 초마다 짧은 시간 동안 재생되지 않습니다. 그래서 스트림이 동시에 inputstream에서 읽고 데이터 라인에 쓸 수있는 방법이 있는지 궁금 해서요 그래서 쓰기가 결코 읽기 위해 일시 ​​중지되지 않았습니다.

답변

0

예 있습니다. 한 번에 2 가지 이상의 작업을 수행하려고 할 때 멀티 스레딩을 찾고 있습니다. 그래서 당신에 대해 읽어야하지만

그것은 당신이 5 분 배울 수있는 일이 아니다 그것은 예를 들어 here

:

public class Printer implements Runnable{ 

String name; 
public Printer(String name){ 
this.name=name; 
} 
public void run(){ 

    while(true){ 
    System.out.println("i am thread"+name); 
    //in your case read or write bytes to dataline here; 
    } 
} 
public static void main(String[] args){ 
Printer print1= new Printer("a"); 
Printer print2 = new Printer("b"); 
new Thread(print1).start(); 
new Thread(print2).start(); 
} 
} 

이 "내가 스레드 B"나는 스레드입니다 "인쇄 유지할 것 "동기화되지 않았기 때문에 정해진 순서가 없기 때문에 아바바 바브보다는 오히려 aabbbbaababaaba를 줄 수 있지만 아이디어는 동시에 모두 실행된다는 것입니다.

이것은 스레드를 사용하는 방법, 스레드가 빠져 나오기 전에 읽어야 할 동기화 및 안전 및 물건에 대한 대략적인 예입니다.

+0

답변 해 주셔서 감사합니다. 네, Threads에 익숙합니다. 그래서 거기에 자바 API를 빌드하는 방법이 없다고 가정합니다. – Finaltransmit

+0

스트리밍 할 API를 찾고 있다면 vlcJ 또는 xuggler를 권하고 싶습니다. 이전에는 이러한 행운을 보았습니다. vlcJ는 내가 생각할 수있는 가장 쉬운 API입니다. – vlatkozelka

-1

이것이 가능한지 확실하지 않지만 dataLine.write(audioBuffer, 0, in.read());은 원하는대로 할 수 있습니까?

+0

동시에 실행되는 것처럼 보입니다 ... 프로그램이 in.read()를 수행 한 다음 write() .it의 기본 프로그래밍 논리에 응답을 전달합니다. – vlatkozelka