Archiv verlassen und diese Seite im Standarddesign anzeigen : Webdatei speichern + auswerten
hi!
mein ziel war es eine html datei lokal in einer textdatei zu speichern und diese dann nach bestimmten strings zu durchsuchen.
da ich javaanfänger bin wird der code wahrscheinlich sehr inperformant sein... nun ja ;)
bei kleinen html dateien ist es ziemlich problemlos, bei großen jedoch wird irgendwann einfach abgeschnitten.. hängt wohl mit der max größe eines arrays zusammen... glaube ich...
naja meine frage ist nun wie ich diese größenbeschränkung umgehen kann - habe zwar auch schon das filereader topic weiter unten gelesen - scheint mir das gleiche oder zumindest ein ähnliches problem zu sein - jedoch bin ich nicht ganz durchgestiegen was ich nun machen müsste...
über hinweise würde ich mich freuen - mein code kommt unterhalb:
public class URLCONNEC
{
public static void main(String[] args)
{
try
{
URL yourUrl = new URL("http", "175.8.25.55", "/wetter.html");
InputStream yourIs = yourUrl.openStream();
byte readFile[] = new byte[yourIs.available()];
yourIs.read(readFile);
yourIs.close();
File neueDatei = new File("test.txt");
neueDatei.delete();
String str = new String(readFile);
FileWriter schreibDatei = new FileWriter(neueDatei);
schreibDatei.write(str);
schreibDatei.close();
}
catch (Exception e)
{
System.out.println("Fehler");
}
String zeile;
int i = 0;
try
{
BufferedReader infile = new BufferedReader(new FileReader("test.txt"));
while ((zeile= infile.readLine()) != null)
{
if (zeile.indexOf("stark") != -1)
{
i++;
}
}
System.out.println(i + " Mal gefunden");
}
catch (Exception e)
{
System.out.println("hat nicht geklappt");
}
}
}
StoreMaster
03.09.2002, 14:40
Beim Filereader weiter unten wurde einfach der String durch einen StringBuffer ersetzt.
Stringbuffer szBuffer = new StringBuffer();
dieser erzeugt einen dynamischen buffer, welcher sich selbst nach wenn nötig verdoppelt und keine begrenzung hat.
bei meinem beispiel scheint es an etwas anderem zu liegen...
URL yourUrl = new URL("http", "175.8.25.55", "/wetter_stadt_ist.html");
InputStream yourIs = yourUrl.openStream();
System.out.println(yourIs.available());
Auszug aus der API-Hilfe: availabler() Returns the number of bytes that can be read (or skipped over) from this input stream without blocking by the next caller of a method for this input stream.
egal bei welcher datei - available liefert immer nur 2635 bytes... also müsste ich wohl etwas anderes als InputStream benutzen ... auf jeden fall müssen mehr als 2635 bytes eingelesen werden können.. es sollten eher so 15-30k eingelesen werden können...
jemand ne idee was für einen typ ich benutzen könnte ?
[edit]
gerade habe ich nochmal für URL nachgeschaut... leider stellte sich folgendes heraus: "openStream() - Opens a connection to this URL and returns an InputStream for reading from that connection."
Hört sich ja so an als würde er automatisch InputStream als varTyp benutzen müssen.... dann kann es doch eigentlich nicht sein dass der Typ "InputStream" nur 2635 bytes kann oder !?
schreib doch alles was du liest sofort wieder raus; hab ein ganz altes prog von mir gefunden, was das gleiche macht, wie deins soll (durch die verwendung von bufferedreadern und writern is das ganze auch noch'n bissel performanter als rein mit in und outputstreams:
public class main {
public main() {
}
public static void main(String[] args) {
URL[] url = new URL[args.length];
int cChar = 0;
for (int i = 0; i < args.length; i++) {
try {
url[i] = new URL(args[i]);
InputStream is = url[i].openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
BufferedWriter bw = new BufferedWriter(new FileWriter("offline" + i + ".html"));
while ((cChar = br.read()) != -1) {
bw.write(cChar);
}
bw.close();
br.close();
}
catch (java.net.MalformedURLException malex) {
System.err.println("Error:\t" + malex.getMessage());
}
catch (java.io.IOException ioex) {
System.err.println("Error:\t" + ioex.getMessage());
}
}
}
}
thx!!
durch dein programm ist mir gerade ein weiteres licht in sachen java aufgegangen *g*
das war echt spitze... mensch so langsam fügen sich ein paar teile des puzzles zueinander *bg*
aber sag mal...
ich möchte jetzt in der heruntergeladenen datei nach etwas bestimmten suchen.. ist soweit auch kein problem:
String zeile;
int i = 0;
try
{
BufferedReader infile = new BufferedReader(new FileReader("wetter.html"));
while ((zeile = infile.readLine()) != null)
{
if (zeile.indexOf("stark") != -1)
{
i++;
}
}
System.out.println(i + " Mal gefunden");
}
catch (Exception e)
{
System.out.println("hat nicht geklappt");
}
nur würde ich jetzt gerne Zeilenweise auslesen.. unter perl / unix habe ich es in ein Array gelesen und dann mit "grep" die jeweilige zeile gesucht ... aber wie des unter java geht.. kein plan!
also ich würde gerne die Zeile in der bei mir z.B. "stark" vorkommt einfach ausgeben lassen, gegebenenfalls noch vorher untersuchen und ein paar Zeichen löschen (das Löschen sollte ich noch hinbekommen...)
die zeilen liest du ja schon zeilenweise; warum machst du dann das was du machen willst nicht an der stell an der du i++; hast ?
String zeile;
int i = 0;
try
{
BufferedReader infile = new BufferedReader(new FileReader("wetter.html"));
while ((zeile = infile.readLine()) != null)
{
modifyLine(zeile);
}
System.out.println(i + " Mal gefunden");
}
catch (Exception e)
{
System.out.println("hat nicht geklappt");
}
private void modifyLine(String s) {
if (s.indexOf("stark") == -1) return;
// hier dann s.substring(); s.trim(); s.replace('c', 'd');
// oder was auch immer du mit der zeile machen willst
}
es geht um diese zeilen:
while ((zeile = infile.readLine()) != null)
{
modifyLine(zeile);
}
ich hoffe ich verstehe das richtig, aber mit dieser zeile werden doch die einzelnen zeilen an "modifyLine" übergeben... und wenn darin stark vorkommt dann soll etwas geschehen, ansonsten (bei -1) irgendwas anderes wiedergegeben werden...
allerdings kommt bei mir immer folgender fehler:
D:\free\java>javac main.java
main.java:66: non-static method modifyLine(java.lang.String) cannot be reference
d from a static context
modifyLine(zeile);
^
1 error
hab zuerst gedacht dass ich evt. vergessen habe die richtige classe zu importieren, aber laut api gehört indexof ja zu java.lang.String.. naja der fehler hört sich auch eher nach einer variablendefinition oder sowas an.. hoffe du kannst mir nochmal helfen ;)
das is im prinzip kein fehler, du musst nur die modifyLine methode auch statisch machen, also
public static void midifyLines(String s) { ....... }
oh so einfach wars :)
vielen vielen dank, auf dich ist doch immer verlass *schleim* ;)
okay ich habe ein neues problem.. und zwar möchte ich das gleiche mit einer generierten (php) datei machen...
mein ansatz ist folgender:
--
URL url = new URL("http", "localhost/wbboard/", 80, "main.php");
HttpURLConnection uCon = (HttpURLConnection) url.openConnection();
uCon.setRequestMethod("GET");
--
mit einer normalen html datei kommt bei uCon.getContentLength() auch die richtige anzahl bytes... bei einer php datei kommt jedoch nur -1 .... ich suche hier schon überall rum aber ich habe den leisen (eigentlich schon fast lauten) verdacht dass ich irgendwie doch komplett auf dem holzweg bin...
vielleicht weiss ja wer rat? :)
okay war fehler in meinem quelltext.. habe nochmal neu angefangen und nun scheint es auch so zu funktionieren!
*spam*
dazu eine frage...
kann ich wenn ich auf eine URL connecte irgendwie vorher lokal nen authent für meinen proxyserver machen? der fordert dass ich username+pw eingebe für jede connection nach ausserhalb... aber wenn ich in der api unter der klasse "url" gucke dann finde ich leider nichts mit proxy oder ähnlichem...
p.s. @MrEasy (denke ich mal :) )
folgende url möchte ich lokal speichern als textdatei:
http://wetter.msn.de/e.asi?ityp=ss&sid=263480&tkt=ak&sf=1
nur irgendwie will das nicht.. php und asp funktionieren wunderbar mit oben genannten funktionen.. diese page allerdings nicht :mauer:
ne idee womit das gehen könnte `?
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.