Avatar billede mmmap Nybegynder
26. maj 2009 - 18:06 Der er 6 kommentarer og
1 løsning

Læs .txt-fil som InputStream

Hej,
Jeg har et problem med at læse hver linie af en .txt-fil. Jeg indlæser filen som en InputStream, hvorefter jeg vil overføre hver linje (alle er kun med ét ord) i en List<String>. Jeg har denne method, som dog ikke fungerer helt optimalt. List'en indeholder ikke txt-filens indhold, men info om filen, f.eks. er det første entry "#!/usr/bin/env xdg-open". Hvordan får jeg den rigtige information ud?

public List<String> getWords(InputStream aFile) {

  List<String> contents = new ArrayList<String>();
  try {
    BufferedReader input =  new BufferedReader(new InputStreamReader(aFile));
    try {
      String line = null; //not declared within while loop
      while (( line = input.readLine()) != null){
        contents.add(line);
      }
    }
    catch (Exception ex) {
        ex.printStackTrace();
    }
  catch (Exception ex){
    ex.printStackTrace();
  }
  input.close();
  return contents;

}

Mange tak,
//madsanders
Avatar billede arne_v Ekspert
26. maj 2009 - 18:20 #1
Koden virker god nok.

(2 catch er nok overfloedigt, men ...)

Er du sikker paa at den fil ikke er et shelel script som indeholder "#!/usr/bin/env xdg-open" i foerste linie ?
Avatar billede mmmap Nybegynder
26. maj 2009 - 18:32 #2
Ja, det er jeg sikker på. Filen indeholder kun en masse engelske ord. Selvom der er et par tusinde ord i txt-filen får jeg kun følgende værdier i min List:

    [0]    "#!/usr/bin/env xdg-open" (id=830060383216)   
    [1]    "" (id=830060383472)   
    [2]    "[Desktop Entry]" (id=830060383528)   
    [3]    "Encoding=UTF-8" (id=830060383616)   
    [4]    "Version=1.0" (id=830060383696)   
    [5]    "Name=words-english" (id=830060383776)   
    [6]    "Comment=Åbn "/home/madskaloer/Skrivebord/words-english"" (id=830060383864)   
    [7]    "Icon=text-x-generic" (id=830060384032)   
    [8]    "Name[da_DK]=words-english" (id=830060384128)   
    [9]    "Comment[da_DK]=Åbn "/home/madskaloer/Skrivebord/words-english"" (id=830060384232)   
    [10]    "Icon[da_DK]=text-x-generic" (id=830060384408)   
    [11]    "URL=file:///home/madskaloer/Skrivebord/words-english" (id=830060384512)   
    [12]    "Type=Link" (id=830060384672)   
    [13]    null   
    [14]    null   
    [15]    null   
    [16]    null   
    [17]    null   
    [18]    null   
    [19]    null   
    [20]    null   
    [21]    null   
    [22]    null   
    [23]    null
Avatar billede mmmap Nybegynder
26. maj 2009 - 18:33 #3
Hov, kom jeg til at skrive som svar, men det var naturligvis ikke meningen..
Avatar billede arne_v Ekspert
26. maj 2009 - 19:59 #4
Der foregaar noget mystisk her.

1)  Der bliver laest million af tekst filer i Java programmer hver dag, saa det boer virke.
2)  Din kode tester eksplicit for null i while loekken, saa det er mystisk at din liste indeholder null'er.

Kan du poste noget komplet kode som vi kan teste med?
Avatar billede mmmap Nybegynder
26. maj 2009 - 20:45 #5
Jeg kan starte med at sige at jeg programmerer til det mobile operativsystem Android, hvis det kan have en betydning.

Jeg kalder min method fra følgende kode:

public class Main extends Activity {
   
    private String userWord;
   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //Initialiserer min class WordReader, som
        //indeholder getWords-metoden
        final WordReader reader = new WordReader();
        Resources myResources = getResources();
        InputStream file = myResources.openRawResource(R.raw.words);

        //Får txt-filen fra en resource-mappe som android
        //bruger til at opbevare forskellige filer som
        //tilføjes til den færdige fil. Det er der ingen
        //fejl i.
        InputStream file = myResources.openRawResource(R.raw.words);
        List<String> words = new ArrayList<String>();

        //Her kalder den så min method
        words = reader.getWords(file);


Min class ser således ud:

public class WordReader {
   
    public List<String> getWords(InputStream aFile) {

        List<String> contents = new ArrayList<String>();
        try {
          BufferedReader input =  new BufferedReader(new InputStreamReader(aFile));
          try {
            String line = null; //not declared within while loop
            while (( line = input.readLine()) != null){
              contents.add(line);
            }
          }
          finally {
            input.close();
          }
        }
        catch (Exception ex){
          ex.printStackTrace();
        }

        return contents;
    }
Avatar billede mmmap Nybegynder
28. maj 2009 - 15:24 #6
Nu har jeg fået det til at virke. Sjovt nok, så var det faktisk hvad der stod i filen som den udskrev. Problemet var bare, at de gange jeg har åbnet filen inde fra Eclipse har den åbnet den rigtige fil. Den anden fil var åbentbart bare en genvej.

Men tak for hjælpen, læg et svar. Du fik mig trods alt gjort mig sikker på, at det ikke var koden den var galt med.
Avatar billede arne_v Ekspert
28. maj 2009 - 19:11 #7
svar
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