Avatar billede poloen Nybegynder
14. februar 2012 - 11:50 Der er 12 kommentarer og
1 løsning

Fillaesning langsomt?

Hej Eksperten.

Jeg har et program som laeser en fil, tager nogle ord ud fra den &
derefter skriver en fil med udtagne ord.
Det er en tekst-fil paa omkring 300KB.
Der gaar forholdsvis lang tid for programmet at afslutte.

Er det min kode eller java generelt der tager sig god tid til at faa  tingene gjort?
Avatar billede arne_v Ekspert
14. februar 2012 - 14:45 #1
Det burde ikke tage lang tid at laese og skrive 300 KB. Proev og vis noget kode.
Avatar billede poloen Nybegynder
14. februar 2012 - 16:05 #2
myKeywords.javaKeywords er en samling af strenge af java keywords,
& en streng array af alle java keywords.

int absJavaKeywordIndex = 0;
int maxJavaKeywordIndex = 52;

int absFileMinRead = 0;
int absFileLength = 0;

File myFile = new File(args[0]);
File newFile = new File(args[1]);

BufferedReader myBuffR = new BufferedReader(
                      new InputStreamReader(
                      myFile, "UTF-8"));
FileWriter myFileW = new FileWriter(newFile);

int countKeyword[] = new int[52];

while ((fileInfo = myBuffR.read()) != -1) {
    c = (char)fileInfo;
    myFileString += c;
}
myBuffR.close();

absFileLength = myFileString.length();

// Starts searching for java keywords, goes through a loop 51 time
for (absJavaKeywordIndex = 0;
    absJavaKeywordIndex < maxJavaKeywords;
    absJavaKeywordIndex++) {
    absJavaKeyword =
    myKeywords.javaKeyword[absJavaKeywordIndex];
    absJavaKeywordLength = absJavaKeyword.length();

    // Reads file for keywords
    for (absFileMinRead = 0;
        absFileMinRead <= (absFileLength - absJavaKeywordLength);
        absFileMinRead++) {
        absFileInfo = myFileString.substring(absFileMinRead,
                        (absFileMinRead + absJavaKeywordLength));

        // checks if current substring of file matches a keyword.
    // If so, it adds the substring to totalsKeywords string.
    if (absFileInfo.equals(absJavaKeyword)) {
        countKeyword[absJavaKeywordIndex] =
            countKeyword[absJavaKeywordIndex] + 1;
        totalJavaKeywords += absFileInfo + "\n";
    }
    }
}
// Writes keywords to file given by args[1] and stops
myFileW.write(totalJavaKeywords);
System.out.println("Text is written to " + newFile);
Avatar billede poloen Nybegynder
14. februar 2012 - 16:09 #3
ups der var en absFileInfo & fileInfo med der.
absFileInfo er en streng ^ fileInfo en int.
Avatar billede arne_v Ekspert
14. februar 2012 - 16:32 #4
Jeg ville proeve at udnytte String indexOf metoden til at optimere soegning i streng med!!
Avatar billede arne_v Ekspert
14. februar 2012 - 16:33 #5
BufferedReader har ogsaa en readLine metode, som jeg ville bruge fremfor enkelt char read.

Men det er naeppe skyld i hastigheden.
Avatar billede poloen Nybegynder
16. februar 2012 - 15:32 #6
Jeg har faaet aendret en del paa koden & brugt readLine istedet for read.
Dog faar jeg en fejl-meddelse, som brokker sig over foelgende kode-stump:

while ((fileInfo = myBuffR.readLine()) != null) {
    myFileString[incrChecker2] = Integer.toString(fileInfo);
    incrChecker2 = incrChecker2 + 1;
}

symbol  : method toString(java.lang.String)
location: class java.lang.Integer
        myFileString[incrChecker2] = Integer.toString(fileInfo);
Avatar billede arne_v Ekspert
16. februar 2012 - 15:42 #7
Det lyder som om fileinfo allerede er en String og derfor ikke behoever at blive konverteret til String.

(hvis du skal den anden vej er det parseInt)
Avatar billede poloen Nybegynder
16. februar 2012 - 16:55 #8
Jep det var rigtig nok.
Nu har jeg aendret den saa fileInfo er en String, en BuffRText som indsaetter fileInfo som saetter den ind i myFileString.
Hvorefter BuffRText nulstilles.
Dog af en eller anden grund for jeg nu en NullPointerException naar programmet koeres ved foelgende:

while ((fileInfo = myBuffR.readLine()) != null) {
    buffRText.insert(0, fileInfo);    // her sker fejlen
    myFileString[incrChecker2] = buffRText;;
    incrChecker2 = incrChecker2 + 1;
    buffRText = null;
}

Exception in thread "main" java.lang.NullPointerException
Avatar billede poloen Nybegynder
16. februar 2012 - 17:18 #9
Mit egentlige spoergsmaal er vidst besvaret, jeg tager den her i et nyt spoergsmaal.

Gerne send et svar Arne for mere end fyldestgoerende svar :).
Avatar billede arne_v Ekspert
16. februar 2012 - 21:58 #10
Kan du ikke bare bruge:

while ((fileInfo = myBuffR.readLine()) != null) {
    myFileString[incrChecker2] = fileInfo;
    incrChecker2 = incrChecker2 + 1;
}

?
Avatar billede arne_v Ekspert
16. februar 2012 - 21:58 #11
og et svar
Avatar billede poloen Nybegynder
17. februar 2012 - 13:18 #12
Jo det kunne jeg i grunden godt, det er bare det at myFileString er en StringBuffer, og jeg ved ikke hvordan man tilegner en StringBuffer en vaerdi som en String.
Avatar billede arne_v Ekspert
17. februar 2012 - 15:02 #13
myFileString[incrChecker2] = new StringBuffer(fileInfo);
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