首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java文件和ByteArray或InputStream

Java文件和ByteArray或InputStream
EN

Stack Overflow用户
提问于 2010-04-24 18:48:06
回答 5查看 1.4K关注 0票数 1

我想使用jFugue在小程序中播放一些MIDI音乐。有一个用于MIDI模式的类- Pattern -加载模式的唯一方法是从文件。现在,我不知道applet是如何加载文件的,但我使用的是一个框架(PulpCore),它使加载资产成为一项简单的任务。如果我需要从ZIP目录中获取资产,我可以使用提供get()getAsStream()方法的Assets类。get()ByteArray的形式返回给定的资产,另一个以InputStream的形式返回。

我需要jFugue从ByteArrayInputStream加载模式。在伪代码中,我想这样做:

代码语言:javascript
复制
Pattern.load(new File(Assets.get("mymidifile.midi")));

但是,没有可以接受ByteArray的文件构造函数。有什么建议吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-24 19:21:24

确实,jFugue只允许加载文件,这很遗憾,因为没有什么可以阻止使用任何其他类型的流:

代码语言:javascript
复制
public static final String TITLE = "Title";

public static Pattern loadPattern(File file) throws IOException {
    InputStream in = new FileInputStream(file);
    try {
        return loadPattern(in);
    } finally {
        in.close();
    }
}

public static Pattern loadPattern(URL url) throws IOException {
    InputStream in = url.openStream();
    try {
        return loadPattern(in);
    } finally {
        in.close();
    }
}

public static Pattern loadPattern(InputStream in) throws IOException {
    return loadPattern(new InputStreamReader(in, "UTF-8")); // or ISO-8859-1 ?
}

public static Pattern loadPattern(Reader reader) throws IOException {
    if (reader instanceof BufferedReader) {
        return loadPattern(reader);
    } else {
        return loadPattern(new BufferedReader(reader));
    }
}

public static Pattern loadPattern(BufferedReader bread) throws IOException {
    StringBuffer buffy = new StringBuffer();

    Pattern pattern = new Pattern();
    while (bread.ready()) {
        String s = bread.readLine();
        if ((s != null) && (s.length() > 1)) {
            if (s.charAt(0) != '#') {
                buffy.append(" ");
                buffy.append(s);
            } else {
                String key = s.substring(1, s.indexOf(':')).trim();
                String value = s.substring(s.indexOf(':')+1, s.length()).trim();
                if (key.equalsIgnoreCase(TITLE)) {
                    pattern.setTitle(value);
                } else {
                    pattern.setProperty(key, value);
                }
            }
        }
    }
    return pattern;
}

更新(用于loadMidi)

代码语言:javascript
复制
public static Pattern loadMidi(InputStream in) throws IOException, InvalidMidiDataException
{
    MidiParser parser = new MidiParser();
    MusicStringRenderer renderer = new MusicStringRenderer();
    parser.addParserListener(renderer);
    parser.parse(MidiSystem.getSequence(in));
    Pattern pattern = new Pattern(renderer.getPattern().getMusicString());
    return pattern;
}

public static Pattern loadMidi(URL url) throws IOException, InvalidMidiDataException
{
    MidiParser parser = new MidiParser();
    MusicStringRenderer renderer = new MusicStringRenderer();
    parser.addParserListener(renderer);
    parser.parse(MidiSystem.getSequence(url));
    Pattern pattern = new Pattern(renderer.getPattern().getMusicString());
    return pattern;
}
票数 2
EN

Stack Overflow用户

发布于 2010-04-24 19:07:10

如果我没记错的话,模式文件包含纯文本。使用getAsStream()加载文件,然后使用

代码语言:javascript
复制
BufferedReader br = new BufferedReader(new InputStreamReader(yourStream));
//...
String pattern = convertToString(br); // you should implement convertToString yourself. It's easy. Read the java.io APIs.

其中yourStream是getAsStream()返回的InputStream。然后使用add(字符串...patterns)方法来加载模式:

代码语言:javascript
复制
add(pattern);
票数 1
EN

Stack Overflow用户

发布于 2010-04-24 19:12:42

您可以使用以下代码(取自Pattern.loadPattern()方法的实现):

代码语言:javascript
复制
    InputStream is = ...; // Get a stream from the Asset object

    // Prepare a pattern object
    Pattern pattern = new Pattern();

    // Now start reaing from the stream
    StringBuffer buffy = new StringBuffer();
    BufferedReader bread = new BufferedReader(new InputStreamReader(is));
    while (bread.ready()) {
        String s = bread.readLine();
        if ((s != null) && (s.length() > 1)) {
            if (s.charAt(0) != '#') {
                buffy.append(" ");
                buffy.append(s);
            } else {
                String key = s.substring(1, s.indexOf(':')).trim();
                String value = s.substring(s.indexOf(':')+1, s.length()).trim();
                if (key.equalsIgnoreCase(TITLE)) {
                    pattern.setTitle(value);
                } else {
                    pattern.setProperty(key, value);
                }
            }
        }
    }
    bread.close();
    pattern.setMusicString(buffy.toString());

    // Your pattern is now ready
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2704151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档