/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
hente billede fra URL ?? hvad gør jeg galt~
Fra : Simon...


Dato : 07-12-02 12:33

hej,

jeg prøver på at hente et billede fra en URL og skrive det en lokal fil, men
jeg ender hele tiden med en
lille bitte fil på 4 byte ? - er der en nemmere måde at gøre det her på,
og en der virker ?

//hent billedet
URL image = new URL("http://guden.dk/test.jpg");
InputStream is = image.openStream();

//fil skrivning
FileWriter fw = new FileWriter("c:\\new.jpg");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter outFile = new PrintWriter(bw);

if (is != null)
{
for (int d = is.read(); d>0; d=is.read())
{
outFile.print((char) d);
}

outFile.close();
}


nogen der evt. kunne skrive et lille kode eksempel, eller linke til et?


mange tak

mvh.Simon



 
 
Ole Ildsgaard Hougaa~ (07-12-2002)
Kommentar
Fra : Ole Ildsgaard Hougaa~


Dato : 07-12-02 14:43

On Sat, 7 Dec 2002 12:33:08 +0100, "Simon..." <devnull@linux.org>
wrote:

>hej,
>
>jeg prøver på at hente et billede fra en URL og skrive det en lokal fil, men
>jeg ender hele tiden med en
>lille bitte fil på 4 byte ? - er der en nemmere måde at gøre det her på,
>og en der virker ?

Du mangler såmænd bare at rette to fejl:
1) Din betingelse i for-løkken er forkert. Du stopper første gang du
får 0. Du skal stoppe første gang du får -1 (som markerer end of
file).
2) Det er ikke en god idé at konvertere byte til char når du læser en
binær fil. Brug en OutputStream i stedet for en Writer. (Hvad du i
øvrigt vil med en BufferWriter og en PrintWriter ved jeg slet ikke).

<snip kode>

>nogen der evt. kunne skrive et lille kode eksempel, eller linke til et?

Din rettede kode ser sådan ud:

URL image = new URL("http://guden.dk/test.jpg");
InputStream is = image.openStream();
OutputStream os = new FileOutputStream("C:\\new.jpg");
if (is != null)
{
for (int d = is.read(); d>=0; d=is.read())
{
os.write(d);
}

os.close();
}

Et par advarsler:
1) Det er ikke særligt effektivt at læse og skrive én byte ad gangen.
Overvej at bruge en buffer.
2) Du glemmer at lukke is.
3) Hvis der kommer en exception undervejs er det heller ikke sikkert
du får lukket os.

Simon... (07-12-2002)
Kommentar
Fra : Simon...


Dato : 07-12-02 14:51

tak jeg tester lige og melder tilbage senere (er lige blevet kaldt på
arbejde :/ )

mvh.Simon



Simon... (07-12-2002)
Kommentar
Fra : Simon...


Dato : 07-12-02 14:52


> 1) Det er ikke særligt effektivt at læse og skrive én byte ad gangen.
> Overvej at bruge en buffer.

hvordan bruger man iøvrigt en sådan ? har du et eksempel på at hente en fil
og skrive den lokalt med det ?

tak
mvh.Simon



Simon... (07-12-2002)
Kommentar
Fra : Simon...


Dato : 07-12-02 17:27


> hvordan bruger man iøvrigt en sådan ? har du et eksempel på at hente en
fil
> og skrive den lokalt med det ?

nogen der kan fortælle mig om det her er korrekt brug af bufferedstream?? og
hvis ikke, hvad bør jeg så rette ? - og til hvad ?

---
String link = new String("http://www.guden.dk/test.jpg");
String lokal = new String("C:\\new.jpg");

URL image = new URL(link);
InputStream ais = image.openStream();
BufferedInputStream is = new BufferedInputStream(ais);

OutputStream aos = new FileOutputStream(lokal);
BufferedOutputStream os = new BufferedOutputStream(aos);

if (is != null)
{
for (int d = is.read(); d>=0; d=is.read())
{
os.write(d);
}
ais.close();
aos.close();
os.close();
is.close();
System.out.println("lokal link\t: " + lokal);
}

else
System.out.println("Der opstod et problem ved hentning af
fil: " + link);
---


tak

mvh.Simon



Ole Ildsgaard Hougaa~ (08-12-2002)
Kommentar
Fra : Ole Ildsgaard Hougaa~


Dato : 08-12-02 11:18

On Sat, 7 Dec 2002 17:26:52 +0100, "Simon..." <devnull@linux.org>
wrote:

>
>> hvordan bruger man iøvrigt en sådan ? har du et eksempel på at hente en
>fil
>> og skrive den lokalt med det ?
>
>nogen der kan fortælle mig om det her er korrekt brug af bufferedstream?? og
>hvis ikke, hvad bør jeg så rette ? - og til hvad ?

Det ser rigtigt ud, men jeg har ikke testet det. Man kan også bruge en
buffer med en almindelig in/outputstream sådan her:

byte[] buffer = new byte[2048];
for (int size = is.read(buffer);
size >= 0;
size = is.read(buffer)) {
os.write(buffer, 0, size);
}

Men det giver jo nok det samme resultat.

Da jeg testede ovenstående, så det ikke ud til at bufferen gjorde så
stor en forskel gennem en dobbelt ISDN, men jeg har tidligere været
ude for at for-løkken blev flaskehalsen når man skulle læse fra
og/eller skrive til en stream.


Simon... (08-12-2002)
Kommentar
Fra : Simon...


Dato : 08-12-02 15:22


> Det ser rigtigt ud, men jeg har ikke testet det. Man kan også bruge en
> buffer med en almindelig in/outputstream sådan her:

ok - det virker også det havde jeg testet, jeg var bare ikke sikker på om
den rent faktiskt
brugte bufferen, eller stadig hentede et tegn af gangen, det virkede nemlig
ligeså hurtigt som før.

men nu har jeg så lavet mit lille ripper proggie... mit eneste problem er
bare at nogengange,
kommer der grå bjælker nederst til højre i billedet ? somom der mangler
data, eller er blevet overskrevet/omskrevet noget ??

hvad går der galt her ? jeg har set det samme problem i andre ripper
værktøjer, men aner ikke hvorfor det sker... filerne
der hentes fra fejler intet, og man kan hente dem igen, så er problemet der
ikke...

tak

mvh.Simon



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste