PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nur die letzen 128Byte von einem File lessen



pfefferkeks
20-12-2004, 15:42
Hi,
ich habe mir folgende Methode gebuat:
/**
* The methode reads the IDv1 tag from the given data file.
* Than the IDv1 tag will be written out at the console.
*
* @param data : String to the data file (mp3 file)
* @return String with the Tag
* @throws IOException if String hasn't a correct mp3 file.
*/
public void printMp3Tag (String data) throws IOException{
if (data.endsWith("mp3")) {
FileReader in = new FileReader(data);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
int i=0, tag=0;

while ((i = in.read()) != -1) {
out.write(i);
}
in.close();
out.flush();
}
else {
throw new IOException();
}
}
}

wie schaffe ich es das nur die letzten 128 Byte von dem File gelessen werden?

danke pfefferkeks

Boron
20-12-2004, 16:52
Wenn du die "Länge" des FileReader-Streams irgendwie feststellen kannst, dann könnte Folgendes funktionieren:
char trailer[128];
in.read( trailer, size-128, 128);Wie du allerdings die Länge des Stream bestimmen kannst weiß ich auch nicht.
Da es sich ja um eine Datei handelt, durfte es sich ja um die Größe der Datei handeln.

pfefferkeks
20-12-2004, 17:53
File file = new File(data);
FileReader in = new FileReader(data);
char[] tag = new char[128];
long length=0;

length = file.length();
int size = (int) (length-128);
in.read(tag, size, 128);

Das habe ich eben geschrieben und ich bekomme immer ein:
java.lang.IndexOutOfBoundsException
auf
in.read(tag, size, 128);

wer weiss warum? das array ist doch gross genug oder?

danke pfeffer

ExRevel
20-12-2004, 17:57
Ich weiss nun nicht zu 100% wie es in Java ist, aber mach das Array doch mal ein Byte größer, ich meine in C z.B. gibt es ja auch noch ein Terminierungsbyte.

ciao Exi

pfefferkeks
20-12-2004, 18:03
Hi,

also ich habe es schon mit "char[] tag = new char[130];" versucht selber Fehler ;(.


danke dir pfeffer

pfefferkeks
20-12-2004, 21:13
hi,

habe es geloest danke!

gruesse pfefferkeks

marius
22-12-2004, 04:07
hi

gratuliere.
vergiss aber nicht dass jeder fehler max. einmal gemacht werden sollte.
da das sicher nicht erreichbar ist sollten wir doch versuchen wenigstens so nah dran zu kommen wie moeglich.

also denk an die die den thread irgendwann ergooglen werden und dann gern sehen wuerden wie man das problem denn nun loest! haben wir ja alle was von.

gruss marius

peschmae
22-12-2004, 07:37
Eventuell wäre auch was mit NIO (Memory Mapped Files) noch recht effizient.

MfG Peschmä

Reality
24-12-2004, 21:29
Wenn ich nicht daneben liege, muss man folgedes machen:


in.read(tag, size, size+128);

Liebe Grüße
Reality

pfefferkeks
31-12-2004, 14:08
Meine Loesung:

/**
* The methode reads the IDv1 tag from the given data file.
*
* @param data : String to the data file (mp3 file)
* @return String[] : The Array includes 5 Strings with the ID3 tag.
* @throws IOException if String data hasn't a correct mp3 file.
*
* written from Swen Walkowski 2004
*/
public String[] printMp3Tag(String data) throws IOException{
if (data.endsWith("mp3")) {
File file = new File(data);
FileReader in = new FileReader(data);
char[] tag = new char[125];
long length=0;
int i=0;
String[] strReturn = new String[5];
String strTitle="", strArtist="", strAlbum="";
String strYear="", strComment="";

//finde the right place of the ID3 tag
length = file.length();
in.skip(length-125);
in.read(tag, 0, 125);
in.close();

//build the strings with the tag
if (0 != tag[0]) {
for (i=0; i<30; i++) {
if (0 != tag[i]) {
strTitle = strTitle + tag[i];
}
}
}

if (0 != tag[30]) {
for (i=30; i<60; i++) {
if (0 != tag[i]) {
strArtist = strArtist + tag[i];
}
}
}

if (0 != tag[60]) {
for (i=60; i<90; i++) {
if (0 != tag[i]) {
strAlbum = strAlbum + tag[i];
}
}
}

if (0 != tag[90]) {
for (i=90; i<94; i++) {
if (0 != tag[i]) {
strYear = strYear + tag[i];
}
}
}

if (0 != tag[94]) {
for (i=94; i<124; i++) {
if (0 != tag[i]) {
strComment = strComment + tag[i];
}
}
}

//Fillup the String[] with the correct strings
strReturn[0] = strTitle;
strReturn[1] = strArtist;
strReturn[2] = strAlbum;
strReturn[3] = strYear;
strReturn[4] = strComment;

return strReturn;
}
else {
throw new IOException();
}
} //end printMp3File