代码之家  ›  专栏  ›  技术社区  ›  Peter Perháč

Java文件和ByTAREARE或输入流

  •  1
  • Peter Perháč  · 技术社区  · 14 年前

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

    我需要Jfugue从两个 二进制数组 输入流 . 在伪代码中,我想这样做:

    Pattern.load(new File(Assets.get("mymidifile.midi")));
    

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

    5 回复  |  直到 11 年前
        1
  •  2
  •   Maurice Perry    14 年前

    的确,jfugue只允许加载一个文件,这是很遗憾的,因为没有任何东西可以阻止使用任何其他类型的流:

    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)

    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
  •  1
  •   Behrang Saeedzadeh    14 年前

    如果我没有错,模式文件包含纯文本。使用getasstream()加载文件,然后使用

    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(字符串…模式)加载模式的方法:

    add(pattern);
    
        3
  •  1
  •   Itay Maman    14 年前

    您可以使用此代码(取自 Pattern.loadPattern() 方法:

        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
    
        4
  •  -1
  •   duffymo    14 年前

    可以读取字节数组并将其转换为字符串。

    问题将是inputstream。有一个stringbufferinputstream,但是为了支持stringreader,它被弃用了。

    byte [] b = Assets.get();
    InputStream is = new StringBufferInputStream(new String(b));
    Pattern.load(is);
    
        5
  •  -2
  •   Rob Di Marco    14 年前

    你不想用 File ,您要使用 java.io.ByteArrayInputStream