ملف Java و bytearray أو inputStream
سؤال
أريد استخدام JFugue لتشغيل بعض موسيقى MIDI في التطبيق. هناك فصل لنمط MIDI - Pattern
- والطريقة الوحيدة لتحميل النمط هي من ملف. الآن ، لا أعرف كيف تقوم تطبيقات التطبيق بتحميل الملفات وما لا ، لكنني أستخدم إطار عمل (PulpCore) الذي يجعل تحميل الأصول مهمة بسيطة. إذا كنت بحاجة إلى الحصول على أصل من كتالوج مضغوط ، يمكنني استخدام Assets
الفصل الذي يوفر get()
و getAsStream()
طُرق. get()
يعيد الأصل المعطى ك ByteArray
, والآخر ك InputStream
.
أحتاج إلى JFugue لتحميل النمط من أي منهما ByteArray
أو InputStream
. في الكود الزائف ، أود أن أفعل هذا:
Pattern.load(new File(Assets.get("mymidifile.midi")));
ومع ذلك ، لا يوجد مُنشئ للملفات يأخذ bytearray. اقتراحات ، من فضلك؟
المحلول
صحيح أن 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;
}
نصائح أخرى
إذا لم أكن مخطئًا ، فإن ملفات الأنماط تحتوي على نص عادي. قم بتحميل الملف باستخدام 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.
حيث تم إرجاع outstream الخاص بك بواسطة getAsstream (). ثم استخدم طريقة إضافة (سلسلة ... أنماط) لتحميل النمط:
add(pattern);
يمكنك استخدام هذا الرمز (مأخوذ من تنفيذ 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
يمكنك قراءة صفيف البايت وتحويلها إلى سلسلة.
ستكون المشكلة هي InputStream. هناك stringBufferInputStream ، ولكن تم إهمالها لصالح StringReader.
byte [] b = Assets.get();
InputStream is = new StringBufferInputStream(new String(b));
Pattern.load(is);
أنت لا تريد استخدامها File
, ، تريد استخدام java.io.ByteArrayInputStream