Avatar billede kenneth_breve Nybegynder
07. januar 2008 - 16:24 Der er 14 kommentarer og
1 løsning

Proces bjælke som viser fil download status

Jeg er igang med at lave en applet hvor man bla. bruger en fil som ligger på serveren applet'en loades fra.

Jeg ville bruge en progressbar til at finde ud af hvor langt man er i læsningen af filen.
Hvordan kan dette gøres?

Jeg læser csv filen på følgende måde:


       
        copyOfDataFromWebserver = new ArrayList();
       
       
        URL url=null;

        try {
            String [] nextLine;
           
            url = new URL (getCodeBase(), measureFileToRead );
                               
            InputStream in=url.openStream();
           
            BufferedReader reader = new BufferedReader ( new InputStreamReader ( in ) );
       
                       
            CSVReader reader1 = new CSVReader(reader, ';');
           
                   
            while ((nextLine = reader1.readNext()) != null) {

              // Her udskrives indholdet så af CSV filen
           
            }
           
            in.close();
       
        }
Avatar billede kenneth_breve Nybegynder
07. januar 2008 - 16:25 #1
Jeg ved godt hvordan man bruger progressbar'en men hvordan ved jeg hvor langt jeg er kommet i læsningen af filen?
Avatar billede arne_v Ekspert
07. januar 2008 - 16:34 #2
Der er 2 muligheder:
1) serveren sender ikke laengden i HTTP header i response => saa kan du ikke vise procent done
2) serveren sender info

I sidste tilfaelde skal du laese lidt anderleded:

        URL url = new URL(fileurl);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.connect();
        int status = con.getResponseCode();
        if (status == HttpURLConnection.HTTP_OK) {
            InputStream is = con.getInputStream();
            // nu er laengden i bytes i con.getContentLength()
Avatar billede kenneth_breve Nybegynder
07. januar 2008 - 16:45 #3
Tak for svaret Arne.

Men hvordan ved jeg så løbende i fillæsningen hvor langt jeg er kommet?

Vil:

con.getContentLength()

Løbende ændre størrelse efterhånden som jeg læser?
Avatar billede arne_v Ekspert
07. januar 2008 - 16:54 #4
con.getContentLength() returnerer samme stoerrelse hele tide nemlig antal bytes i filen du henter.

Men du kan relativt nemt taelle op hvor mange bytes du har laest med:

nbyt += nextLine.length(); // linien
nbyt += 2; // linie skift
Avatar billede arne_v Ekspert
07. januar 2008 - 16:56 #5
Hmm. Eller maaske er det lidt mere tricky end som saa.

antal bytes kan vaere stoerre end antal chars for UTF-8.

nbyt += nextLine.getBytes(encoding).length; // linien
nbyt += 2; // linie skift

boer virke generelt.
Avatar billede kenneth_breve Nybegynder
07. januar 2008 - 22:39 #6
Hej Arne

Så fik jeg prøvet koden.

url = new URL(getCodeBase(), fileToRead);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.connect();
int status = con.getResponseCode();



Jeg får en exception fra denne linje:
HttpURLConnection con = (HttpURLConnection) url.openConnection();



java.lang.ClassCastException: sun.net.www.protocol.file.FileURLConnection cannot be cast to java.net.HttpURLConnection
Avatar billede arne_v Ekspert
07. januar 2008 - 22:57 #7
Hmmm.

Tester du i et lokal disk setup ?

Min kode forudsaetter at filen hentes med HTTP.

Starter URL'en ikke med http: men med file: skal du bruge noget andet kode - det
er ret nemt at finde stoerrelsen paa en lokal fil - men er vel ret uinteressant.
Avatar billede kenneth_breve Nybegynder
07. januar 2008 - 23:05 #8
Hej Arne

Jeg tester på en webserver hvor Applet'en også er placeret. På denne server ligger der samtidig en fil som ændrer størrelse nogen gange.

Denne applet åbnes igennem en hjemmeside fra en anden computer. Når filen åbnes af applet'en skal man kunne se hvor langt indlæsningen er undervejs.

Filen ligger altså på webserveren (der hvor applet'en også ligger).


Hvordan får man størrelsen af denne fil?

Og hvor langt man er nået igennem filen når den indlæses?
Avatar billede arne_v Ekspert
08. januar 2008 - 02:54 #9
Altså - applet kører på client og fil ligger på server - hvordan kan det så være en
file URL ?
Avatar billede kenneth_breve Nybegynder
08. januar 2008 - 09:13 #10
Ja. Fil ligger på server. Og client kører applet'en.

Men hvordan finder jeg så størrelsen af filen og hvor langt jeg er nået i indlæsningen?


Måden at hente filen på fandt jeg på denne side: http://www.particle.kth.se/~fmi/kurs/PhysicsSimulation/Lectures/12B/fileReadByApplet.html
Avatar billede kenneth_breve Nybegynder
08. januar 2008 - 11:30 #11
Tak for hjælpen arne fik det til at virke ved at bruge:

getContentLength()


Jeg har kun standard tegn (a-z og ; og :) i min fil så jeg behøves ikke bekymre mig om encoding :-)
Avatar billede kenneth_breve Nybegynder
08. januar 2008 - 11:30 #12
Smid et svar
Avatar billede kenneth_breve Nybegynder
08. januar 2008 - 11:33 #13
Det er dog lidt mærkeligt at procesbjælken ikke opdaterer ordentlig.

Det er som om systemet hænger når CSV filen læser. Og først efter filen er blevet læst opdateres procesbjælken.

Har prøvet repaint() lige efter procesbjælkens værdi tilskrives.

Så er der jo ikke megen ide i at have den :-(
Avatar billede kenneth_breve Nybegynder
08. januar 2008 - 11:44 #14
Har brugt følgende til at løse det sidste omtalte problem:

downloadProgressBar.update(downloadProgressBar.getGraphics());
Avatar billede arne_v Ekspert
08. januar 2008 - 17:15 #15
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