Avatar billede Fnugus Nybegynder
10. november 2010 - 12:00 Der er 11 kommentarer og
1 løsning

Simpelt spørgsmål om while

Hvad er der galt med følgende statement:

while(byte b = file.read()){
}

Burde den ikke læse hele statementet som en samlet boolean? Og hvis det ikke er tilfældet, hvordan kan jeg så loope igennem en fil byte for byte? Ville gerne have noget i stil med:

while(byte b = file.read() && b != -1){
// code stuff here
}
Avatar billede aaberg Nybegynder
10. november 2010 - 12:13 #1
Nei. read metoden returnere en integer, som indeholder antal bytes som blev læst, den returnere ikke en byte. Derudover kan du ikke have et enkelt ligmed-tegn (=) inde i while-parantesen, da indeholdet skal resolves til en boolean.

Du skal gøre noget lignende dette:

byte[] buffer = new byte[1024];
while(file.read(buffer) > 0){
  //Gjør noget med din buffer her.
}
Avatar billede Fnugus Nybegynder
10. november 2010 - 12:33 #2
Vil det ikke begrænse størrelsen af fil man kan smide ind til ~1 kb?
Avatar billede aaberg Nybegynder
10. november 2010 - 12:45 #3
Nei, for du looper igennem med 1024 bytes for hver iteration, indtil hele filen er læst.

Hvis indholdet af filen er tekst, og du vil læse hele indholdet til en streng, kan du gøre sådan:

public String convertStreamToString(InputStream stream, String encoding){

  StringWriter writer = new StringWriter();
  char[] buffer = new char[1024];

  Reader reader = new BufferedReader(new InputStreamReader(stream, encoding));
  int charsRead;
  while ((charsRead = reader.read(buffer)) >= 0){
    writer.write(buffer, 0, charsRead);
  }

  return writer.toString();
}
Avatar billede Fnugus Nybegynder
10. november 2010 - 13:05 #4
Hvis man skal bruge en byte ad gangen, kan det så betale sig? Jeg kom til at tænke på at flg. også kan lade sig gøre, men jeg ved ikke helt hvilken af de to der er bedst:

byte b = 0;
while(b != -1) { // FileInputStream.read() returnerer -1 at end of file
b = file.read();
// operation på b
}
Avatar billede aaberg Nybegynder
10. november 2010 - 13:12 #5
Joda, det kan du gøre. Med store filer bliver det dog en hulens masse iterationer.
Avatar billede Fnugus Nybegynder
10. november 2010 - 13:15 #6
Hvilken af metoderne vil fungere bedst? Jeg er ikke så genial til java (har egentlig kun erfaring fra php), og jeg har sat mig for at forsøge at lave en mp3-decoder..
Avatar billede arne_v Ekspert
16. november 2010 - 02:55 #7
int c;
        while ((c = is.read()) >= 0) {
            os.write((byte)c);
        }

og:

        byte[] b = new byte[10240];
        int n;
        while ((n = is.read(b, 0, b.length)) > 0) {
            os.write(b, 0, n);
        }

virker begge, men den sidste vil være mange gange hurtigere (10 gange hurtigere er ikke urealistisk)
Avatar billede arne_v Ekspert
27. december 2010 - 00:30 #8
fnugus??
Avatar billede Fnugus Nybegynder
27. december 2010 - 02:31 #9
Sorry jeg ikke har lukket den her tråd. Jeg har opgivet Java efter at have erfaret at det er temmelig skidt til mp3 audio... og rettet min opmærksomhed C++ i stedet.
Avatar billede Fnugus Nybegynder
27. december 2010 - 02:36 #10
Beklager jeg ikke har svaret. Hvordan lukker man en tråd?

Jeg har opgivet Java og valgt at kigge nærmere på C og C++ i stedet.
Avatar billede Fnugus Nybegynder
27. december 2010 - 06:01 #12
Masser af interessante og nyttige svar, men ultimativt blev mit problem ikke løst.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester