[java] download file van internet rechtstreeks in array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
Hoi,

Ik kan momenteel een (tekst) bestand downloaden van internet met behulp van URL, URLConnection en InputStream en deze lokaal opslaan. Nu mijn vraag is, aangezien dit een tekstbestand is, is het mogelijk om dit bestand lijn per lijn rechtstreeks in een array van Strings op te slaan? Of kan ik alleen maar met een array van bytes, byte per byte uitlezen?

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
String authString = username + ":" + password;
System.out.println("auth string: " +authString);
String authStringEnc = Base64.encodeBytes(authString.getBytes());
System.out.println("Base64 encoded auth string: " + authStringEnc);

URL url = new URL(webpage);
URLConnection urlConnection = url.openConnection();
urlConnection.setRequestProperty ("Authorization", "Basic " + authStringEnc);
try
{
    Thread.sleep(5000);
}
catch (InterruptedException e)
{
}

InputStream is = urlConnection.getInputStream();
byte[] buffer = new byte[1024];
OutputStream outStream = new BufferedOutputStream(new FileOutputStream("H:\\test\\test.txt"));

while ((ByteRead = is.read(buffer)) != -1)
{
    outStream.write(buffer, 0, ByteRead);
    ByteWritten +=ByteRead;
}

System.out.println("Downloaded successfully.");
System.out.println("File Name: test.txt" + "\"\nNo of bytes :" + ByteWritten);

is.close();
outStream.close();

Acties:
  • 0 Henk 'm!

  • Bartjeh
  • Registratie: September 2010
  • Laatst online: 13-10 11:55
Op Google m'n eerste hit... http://www.roseindia.net/...d-file-line-by-line.shtml

Lijkt me redelijk makkelijk aan te passen aan wat jij wil :)

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Het wordt mij niet helemaal duidelijk wat je nu eigenlijk wilt doen. Of het nu een tekstbestand is of niet, als je gewoon de bytes opslaat in het doelbestand, dan gaat het vanzelf goed.

Als je echter de regels in je programme wilt hebben, dan moet je character- en line-oriented gaan lezen. Hiervoer moet je de InputStream wrappen in een InputStreamReader (met de juiste karakterset) zodat je karakters kunt lezen ipv butes, en deze weer wrappen in een BufferedReader zodat je per regel kunt lezen. Dan kan je vervolgens met readLine regel voor regel een string ophalen.

Ik zou overigens geen array van Strings gebruiken: je weet immers niet hoeveel regels het bestand heeft: dan is het beter om een List te gebruiken.

Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
Remus schreef op vrijdag 04 november 2011 @ 09:54:
Het wordt mij niet helemaal duidelijk wat je nu eigenlijk wilt doen. Of het nu een tekstbestand is of niet, als je gewoon de bytes opslaat in het doelbestand, dan gaat het vanzelf goed.

Als je echter de regels in je programme wilt hebben, dan moet je character- en line-oriented gaan lezen. Hiervoer moet je de InputStream wrappen in een InputStreamReader (met de juiste karakterset) zodat je karakters kunt lezen ipv butes, en deze weer wrappen in een BufferedReader zodat je per regel kunt lezen. Dan kan je vervolgens met readLine regel voor regel een string ophalen.

Ik zou overigens geen array van Strings gebruiken: je weet immers niet hoeveel regels het bestand heeft: dan is het beter om een List te gebruiken.
Tnx, dit is exact wat ik wil/nodig heb. Het enige struikelblok dat ik nog zie, is dat het bestand niet met newline werkt, maar wel de html <br> code gebruikt... dus zal ik eerst hier nog een oplossing voor moeten vinden.

Acties:
  • 0 Henk 'm!

  • Bartjeh
  • Registratie: September 2010
  • Laatst online: 13-10 11:55
Is het dus een HTML file? Al naar een HTML-reader gekeken?

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
ZodiacQ schreef op vrijdag 04 november 2011 @ 09:59:
[...]

Tnx, dit is exact wat ik wil/nodig heb. Het enige struikelblok dat ik nog zie, is dat het bestand niet met newline werkt, maar wel de html <br> code gebruikt... dus zal ik eerst hier nog een oplossing voor moeten vinden.
Maar wat wil je bereiken: je denkt volgens mij nu al te veel in technische oplossingen, waardoor wij je alleen maar suggesties kunnen geven om die technische oplossing te realiseren. Neem even een stapje terug en beschrijf wat je uiteindelijke doel is.

Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
OK. Mijn exact doel is om een bestand van internet te halen (gewoon tekst, behalve er staat een <br> ipv een newline op het einde). De eerste lijn van dit bestand zou ik in een String willen lezen. De rest van het bestand moet ik in een matrix lezen.

Zoals gezegd, de eerste lijn is afwijkend van de rest. De rest van het bestand staat in de vorm van:

data;data;data;data;data<br>
data;data;data;data;data<br>

Aangezien hier een delimiter is ';' dacht ik met StringTokenizer dit op te splitsen en in een matrix te zetten.

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
ZodiacQ schreef op vrijdag 04 november 2011 @ 10:47:
OK. Mijn exact doel is om een bestand van internet te halen (gewoon tekst, behalve er staat een <br> ipv een newline op het einde). De eerste lijn van dit bestand zou ik in een String willen lezen. De rest van het bestand moet ik in een matrix lezen.

Zoals gezegd, de eerste lijn is afwijkend van de rest. De rest van het bestand staat in de vorm van:

data;data;data;data;data<br>
data;data;data;data;data<br>

Aangezien hier een delimiter is ';' dacht ik met StringTokenizer dit op te splitsen en in een matrix te zetten.
Ik zou zelf eerder aan Scanner denken, dan heb je wat meer flexibiliteit wat betreft splitsen en lezen van gegevens.

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Uit je voorbeeld is niet duidelijk of er nu wel of niet echte line breaks (dus '\n' en/of '\r') karakters in de file staan?

Zo ja, dan kun je gewoon Reader.readLine gebruiken, de <br> van de ingelezen regel slopen en daarna splitten (of tokenizen of scannen). Zo niet (als alles dus op één regel staat), dan kun je character voor character uit de Reader lezen tot de laatste 4 chars gelijk zijn aan <br> en dan hetzelfde trucje toepassen.

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
Herko_ter_Horst schreef op vrijdag 04 november 2011 @ 13:48:
Uit je voorbeeld is niet duidelijk of er nu wel of niet echte line breaks (dus '\n' en/of '\r') karakters in de file staan?

Zo ja, dan kun je gewoon Reader.readLine gebruiken, de <br> van de ingelezen regel slopen en daarna splitten (of tokenizen of scannen). Zo niet (als alles dus op één regel staat), dan kun je character voor character uit de Reader lezen tot de laatste 4 chars gelijk zijn aan <br> en dan hetzelfde trucje toepassen.
Ik weet het zelf eigenlijk niet. Het heeft geen windows-newline karakter. Maar misschien wel een unix-newline karakter. Ik heb niet veel pap van die karakter-sets en controle-karakters gegeten. Als ik het bestand in notepad++ opendoe, zegt hij dat het unix-indeling is en ANSI. Hier verschijnt de text wel regel/regel. Als ik het gewoon in windows notepad open doe, komt alles in 1 lijn te staan....

Ik heb het in ieder geval opgelost. Hier is een voorlopige test versie :) Bedankt voor alle hulp, ik geraak er voor de rest wel uit :-D

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            String authString = username + ":" + password;
            System.out.println("auth string: " +authString);
            String authStringEnc = Base64.encodeBytes(authString.getBytes());
            System.out.println("Base64 encoded auth string: " + authStringEnc);

            URL url = new URL(webpage);
            URLConnection urlConnection = url.openConnection();
            urlConnection.setRequestProperty ("Authorization", "Basic " + authStringEnc);

            InputStream is = urlConnection.getInputStream();
            InputStreamReader isr = new InputStreamReader(is,"US-ASCII");
            BufferedReader bfr = new BufferedReader(isr);

            String taf = bfr.readLine().replaceAll("<br>", "");
            System.out.println("TAF= " + taf);
            while (bfr.ready() == true)
            {
                String str = bfr.readLine();
                String nstr = str.replaceAll("<br>", "");
                System.out.println(nstr);
            }

[ Voor 34% gewijzigd door ZodiacQ op 04-11-2011 14:21 ]


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
ZodiacQ schreef op vrijdag 04 november 2011 @ 13:58:
[...]


Ik weet het zelf eigenlijk niet. Het heeft geen windows-newline karakter. Maar misschien wel een unix-newline karakter. Ik heb niet veel pap van die karakter-sets en controle-karakters gegeten. Als ik het bestand in notepad++ opendoe, zegt hij dat het unix-indeling is en ANSI. Hier verschijnt de text wel regel/regel. Als ik het gewoon in windows notepad open doe, komt alles in 1 lijn te staan....

Ik heb het in ieder geval opgelost. Hier is een voorlopige test versie :) Bedankt voor alle hulp, ik geraak er voor de rest wel uit :-D

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            String authString = username + ":" + password;
            System.out.println("auth string: " +authString);
            String authStringEnc = Base64.encodeBytes(authString.getBytes());
            System.out.println("Base64 encoded auth string: " + authStringEnc);

            URL url = new URL(webpage);
            URLConnection urlConnection = url.openConnection();
            urlConnection.setRequestProperty ("Authorization", "Basic " + authStringEnc);

            InputStream is = urlConnection.getInputStream();
            InputStreamReader isr = new InputStreamReader(is,"US-ASCII");
            BufferedReader bfr = new BufferedReader(isr);

            String taf = bfr.readLine().replaceAll("<br>", "");
            System.out.println("TAF= " + taf);
            while (bfr.ready() == true)
            {
                String str = bfr.readLine();
                String nstr = str.replaceAll("<br>", "");
                System.out.println(nstr);
            }
Als er in Notepad++ newlines staan, dan zitten ze er wel in.

Er zit nog wel een fout in je programma: ready() moet je niet gebruiken om te kijken of er nog meer te lezen valt. Gewoon readLine() doen tot dit null oplevert. Zie de documentatie van BufferedReader: ready() wil alleen maar zeggen dat er iets klaarstaat in de buffer of de onderliggende stream dat zonder blocken gelezen kan worden. Dit wil niet zeggen dat !ready() betekent dat de stream leeg is. Dus meer iets als:
Java:
1
2
3
4
5
6
String line = bfr.readLine();
while(line != null) {
  String cleanLine = line.replaceAll("<br>", "");
  processLine(cleanLine); // hier doe je de rest van de processing
  line = bfr.readLine();
}

[ Voor 5% gewijzigd door Herko_ter_Horst op 04-11-2011 14:56 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
Remus schreef op vrijdag 04 november 2011 @ 09:54:
Het wordt mij niet helemaal duidelijk wat je nu eigenlijk wilt doen. Of het nu een tekstbestand is of niet, als je gewoon de bytes opslaat in het doelbestand, dan gaat het vanzelf goed.

Als je echter de regels in je programme wilt hebben, dan moet je character- en line-oriented gaan lezen. Hiervoer moet je de InputStream wrappen in een InputStreamReader (met de juiste karakterset) zodat je karakters kunt lezen ipv butes, en deze weer wrappen in een BufferedReader zodat je per regel kunt lezen. Dan kan je vervolgens met readLine regel voor regel een string ophalen.

Ik zou overigens geen array van Strings gebruiken: je weet immers niet hoeveel regels het bestand heeft: dan is het beter om een List te gebruiken.
Ik ga de lijnen nog opsplitsen (via de ;-delimiter).
Is het aan te raden om een 2-dimensionale ArrayList te gebruiken... of is dat 'not done'?

@Herko_ter_Horst: Tnx voor de info.

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Een 2-dimensionale ArrayList zou ook een Map kunnen zijn. Het hangt van je data af wat de juiste structuur is.

Het feit dat je begint te denken vanuit arrays en collections geeft mij echter het gevoel dat je (nog) in "object denial" bent.

Een veel belangrijker vraag is namelijk: wat stelt de data voor en waarom introduceer je daar geen class voor?

[ Voor 28% gewijzigd door Herko_ter_Horst op 04-11-2011 15:26 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
Herko_ter_Horst schreef op vrijdag 04 november 2011 @ 15:22:
Een 2-dimensionale ArrayList zou ook een Map kunnen zijn. Het hangt van je data af wat de juiste structuur is.

Het feit dat je begint te denken vanuit arrays en collections geeft mij echter het gevoel dat je (nog) in "object denial" bent.

Een veel belangrijker vraag is namelijk: wat stelt de data voor en waarom introduceer je daar geen class voor?
Je hebt gelijk. Het is meer dan 6 jaar geleden dat ik nog eens java heb geprogrammeerd (sind het school) en er is meer kennis over het 1e jaar blijven plakken, dan de volgende...
Het is idd beter om een object te maken per record en deze dan in een ArrayList te steken.
Pagina: 1