我需要频繁调用一个音乐文件,有什么方法可以只从磁盘读取一次,然后重复加以利用吗?

mumasgw 2007-12-03 10:17:19
程序如下:
FileInputStream fis = new FileInputStream(url);
AudioStream music = new AudioStream(fis);
AudioPlayer.player.start(music);

因为需要重复播放文件,如何才能重磁盘获取一次,后面几次播放不再读磁盘呢?怎样把这个文件流定为到文件头呢?
...全文
213 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinxfei 2007-12-04
  • 打赏
  • 举报
回复
不一定非要MID
guojie1689 2007-12-03
  • 打赏
  • 举报
回复
不能把他放到缓存里吗?
然后一直放着,用的时候取
jinxfei 2007-12-03
  • 打赏
  • 举报
回复
可不可以这样,把文件内容全部读到一个byte[]中,然后再建一个ByteArrayInputStream()给你的播放器用?
hoo428 2007-12-03
  • 打赏
  • 举报
回复
用对象序列化行不?
mumasgw 2007-12-03
  • 打赏
  • 举报
回复
没人知道吗?好逮也凑点人气吗:)
cursor_wang 2007-12-03
  • 打赏
  • 举报
回复
我认为可能是文件格式的关系,要用.mid,不能用其他格式.你们试下.我这里可以运行.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import sun.audio.AudioPlayer;
import sun.audio.AudioStream;

public class ByteArrayTest {
public ByteArrayTest(){
FileInputStream fis = null;
AudioStream music = null;
try {
fis = new FileInputStream("F:/95.mid");
music = new AudioStream(fis);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
AudioPlayer.player.start(music);
}
public static void main(String[] args) throws FileNotFoundException{
new ByteArrayTest();
}
}
jinxfei 2007-12-03
  • 打赏
  • 举报
回复
upgrade:

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import sun.audio.AudioPlayer;
import sun.audio.AudioStream;


public class ByteArrayTest {

public static void main(String[] args) throws Exception{
File audioFile=new File("d:/alarm.wav");
InputStream in=new FileInputStream(audioFile);
byte[] bt = new byte[(int)audioFile.length()];

//大文件的话,可能一次读不完,需要多次循环来读出全部内容
in.read(bt);

ByteArrayInputStream bin=new ByteArrayInputStream(bt);
AudioStream music = new AudioStream(bin);
AudioPlayer.player.start(music);
int lastAvail=bin.available();
while(true){
while(bin.available()!=lastAvail){
lastAvail=bin.available();
Thread.sleep(1000);
}
bin.reset();
AudioPlayer.player.stop(bin);
AudioPlayer.player.start(bin);
}

}
}
qybao 2007-12-03
  • 打赏
  • 举报
回复
估计是reset造成的问题,你把LS的代码改成


import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.InputStream;


public class ByteArrayTest {

public static void main(String[] args) throws Exception{
File audioFile=new File("");
InputStream in=new FileInputStream(audioFile);
byte[] bt = new byte[(int)audioFile.length()];

//大文件的话,可能一次读不完,需要多次循环来读出全部内容
in.read(bt);

//ByteArrayInputStream bin=new ByteArrayInputStream(bt); //remove this

while(true){
ByteArrayInputStream bin=new ByteArrayInputStream(bt); //move to here
AudioStream music = new AudioStream(bin);
AudioPlayer.player.start(music);
//bin.reset(); //remove this

}

}
}


用管道会死掉,奇怪了,这样试试看

FileInputStream fis = new FileInputStream(url);

//保存文件信息到byte数组中
byte[] bt = new byte[(int)new File(url).length()];
fis.read(bt);

//用个管道连接
InputStream is = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream((PipedInputStream)is);
PrintStream ps = new PrintStream(pos);

while (true) {
ps.write(bt, 0, bt.length);
AudioStream music = new AudioStream(is);
AudioPlayer.player.start(music);
}

ziqing_1_2_3 2007-12-03
  • 打赏
  • 举报
回复
存在本地%temp%目录下,重复播放时再调就得了。
mumasgw 2007-12-03
  • 打赏
  • 举报
回复
楼上会出现如下错误
java.io.IOException: could not create audio stream from input stream
at sun.audio.AudioStream.<init>(AudioStream.java:65)
at ByteArrayTest.main(ByteArrayTest.java:32)
声音只播放了一次
jinxfei 2007-12-03
  • 打赏
  • 举报
回复
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.InputStream;


public class ByteArrayTest {

public static void main(String[] args) throws Exception{
File audioFile=new File("");
InputStream in=new FileInputStream(audioFile);
byte[] bt = new byte[(int)audioFile.length()];

//大文件的话,可能一次读不完,需要多次循环来读出全部内容
in.read(bt);

ByteArrayInputStream bin=new ByteArrayInputStream(bt);

while(true){
AudioStream music = new AudioStream(bin);
AudioPlayer.player.start(music);
bin.reset();

}

}
}
sht_123 2007-12-03
  • 打赏
  • 举报
回复
刚才考虑的不很全面,这是在一个类里而言,要是在多个类里调用我认为 5 楼的可以实现.
sht_123 2007-12-03
  • 打赏
  • 举报
回复
FileInputStream fis = new FileInputStream(url);
AudioStream music = new AudioStream(fis);
AudioPlayer.player.start(music);


我觉得mumsgw,你的这三行代码就可以实现啊!
如你的:
FileInputStream fis = new FileInputStream(url);
AudioStream music = new AudioStream(fis);

代码已经创建了一个 music对象,你可以在你需要的地方多次调用
AudioPlayer.player.start(music);
即已实现一次读取到多次播放的了.
mumasgw 2007-12-03
  • 打赏
  • 举报
回复
很奇怪,我用楼上的方法,执行到pos.write(bt, 0, bt.length);这步就会死掉,没有任何出错信息?
qybao 2007-12-03
  • 打赏
  • 举报
回复
AudioStream有没有AudioStream(InputStream stream)这样的构造函数,如果有的话,还有可能,否则,估计做不到,FileInputStream不支持mark,所以也不能reset, 要构造FileInputStream就必须通过文件或文件路径。

如果有AudioStream(InputStream stream)的构造函数的话,可以把文件信息保存在一个byte数组里

FileInputStream fis = new FileInputStream(url);

//保存文件信息到byte数组中
byte[] bt = new byte[(int)new File(url).length()];
fis.read(bt);

//用个管道连接
InputStream is = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream((PipedInputStream)is);
pos.write(bt, 0, bt.length);
pos.flush();

AudioStream music = new AudioStream(is);
AudioPlayer.player.start(music);

//反复调用
pos.write(bt, 0, bt.length);
pos.flush();

AudioStream music = new AudioStream(is);
AudioPlayer.player.start(music);


如果AudioStream是自己写的class的话,建议修改一下构造函数。


62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧