» »

[Java]Branje podatkov iz datoteke

[Java]Branje podatkov iz datoteke

jeryslo ::

Pozdravljeni!

Imamo sledeči problem, doma imam vremensko postajo, iz katere se podatki izpisujejo na PC, oziroma na program HeavyWeather. V tem programu lahko vidim trenutno stanje in pa vso zgodovino vnosov, katerih interval imam nastavljen na 5min, torej vsakih 5min pošlje vremenska postaja podatke na računalnik. No in ta zgodovina se shranjuje v datoteko z imenom history.dat. Ker bom v kratkem delal spletno stran, na kateri bodo trenutni podatki in tudi grafi, bi rad vsebino te datoteke prebral, tako da bom lahko na podlagi teh podatkov izrisal graf. Odločil sem se, da bom verjetno naredil kar Applet, glede na to da znam najbolje programirat v Javi in še najlažje bo potem vse to implementirat na stran. Vem, da obstajajo komercialni programi, ki ti sami izrišejo grafe in podobne reči, tako ima tudi večina lastnikov vremenski postaj na Zevs forumu(vremenski forum ,če pozna kdo), toda ker rad programiram in ker bi se rad naučil še kaj novega sem se odločil da bom spisal svoj program za izpis grafov + glede na to da hodim na FRI bi se to tudi spodobilo:D.

No in zdaj k "pravemu" problemu:
Ta datoteka history.dat, ki shranjuje vse podatke(temperatura, veter, padavine,pritisk,temperatura rosišča....) se update-a, tako kot sem že napisal na vsakih 5-min. V programu se doda nova vrstica, katera vsebuje vse te podatke. Program ima možnost, da vse te podatke izvoziš ročno kot txt file, kar bi lahko potem z uporabo BufferedReader enostavno prebral ter potem ločil podatke, ki so v txt datoteki ločeni z "" in ; kar z StringTokenizer, kjer bi za delim določil ; ter "". To vse lepo in prav toda da dobiš txt file moraš, kot sem že napisal ročno izvozit, ker pa bodo podatki dostopni na netu, bi bilo to rahlo nepraktično ročno izvažat vsakič, ko bi se datoteka update-ala. No in tako mi ostane to, da preberem datoteko history.dat, kjer pa se zalomi. Problem je, da ne vem, kako so zapisani podatki v njej, recimo če odprem z notepad, so vidni sami nerazpoznavni simboli. Malo sem gledal sun dokumentacijo, najprej sem nekaj brezveze čaral z Byte Streams, s katerim sem prepisal podatke iz history.dat v izhod.txt, kar da popolnoma isti rezultat kot če bi odprl datoteko history v notepad:D, potem pa sem naletel na Data Streams, ki podpira branje primitivnih podatkovnih tipov. Zdaj seveda tukaj samo ugibam, če so podatki v tej datoteki sploh tako zapisani.

Tukaj je link do datoteke, da se bo vedelo o kakšni datoteki gre. Upam da sem dovolj razločno napisal, kaj želim in se zahvaljujem če bi kdo dal vsaj kakšen namig, kako rešiti ta problem.

Lp, Jernej

Trinitron ::

To ne boš mogel prebrat.

.dat datoteka nima neke tipične zgradbe. Vsak program se sam odloči, katere informacije katerega tipa bo vpisoval notri. Tako so lahko .dat datoteke tekstovne, lahko pa tudi ne - in tvoja definitivno ni. Torej jo zna prebrati (in izvoziti) le program, ki jo je ustvaril.

Edini način, da jo lahko dekodiraš je ta, da dobiš izvorno kodo programa, ki je datoteko ustvaril in tam pogledaš, kaj sploh v njej je. To pa verjetno ne pride v poštev.

Tutankhamun ::

No ja tko mal sm gledu to *.dat datoteko, pa tko na hitrco najdu sledeče:
- prvih 4 bajte nima veze s podatki o vremenu. Kljub temu, 2 bajt pove dolžino vrjetno enega zapisa.
Prvi 4 bajti
E4 38 8E E3 (nekakšni header podatki)
Potem pa prebereš zapis dolžine 0x38
94 6D E3 40 CD 0C 74 44 ..... 00 00 00 00
Naslednji štarta takoj za prejšnjim tudi dolžine 0x38
95 6D E3 40 ...... 1C C7 71 1C
in tako dalje.
Kaj je pa vsebina, enega zapisa, bi mogu pa vedt, recimo za prvi zapis, katere vrednosti in s kakšno vsebino so shranjene.

Seveda, to samo ugibam da je format daoteke tak kot sm napisu. Na prvi pogled se mi nekak izide. Dolžina vsebine je deljiva z vrednostjo 0x38 (moreš pa prej odštet 4 začetne bajte). Nekak pride da je shranjenih 48317 zapisov.

To je največ kar ti lahko povem iz tega kar si povedal. Lahko pa pošlješ še enkrat novo dat datoteko, v kateri je zapisan nov zapis. Poleg tega pa pošlji še kateri podatke, ki so zapisani, recimo 28 stopinj, pritisk, vlaga ... al kar kol že maš, da ti lahko dekodiramo te mini podatke. Če imaš pa izvorno kodo programa, pol je pa tko use enostavno.
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

jeryslo ::

Hm, me je bilo tega strah ja. Me zanima če jim pošljem mail glede te stvari, če bodo kaj odpisali. Glede na to, da je bila vremenska 150€, bi lahko kaj odgovorili, čeprav izvorno kodo mi skoraj zagoto ne bi poslali.

Edit:
Skoraj pravilno Tutankhamu, podatkov je zdajle 48049, približno za 20 vnos več kot pa jih je bilo, ko sem pred 2h dal datoteko gor.

Zgodovina sprememb…

  • spremenil: jeryslo ()

Tutankhamun ::

No vidš, povej podatke o vremenu, ko se shran v datoteko. Pa recimo za ene 3 zapise. Pol se pa poglobimo v ta simpl format.
Povej še število vseh podatkov.
To mi je blo pa zmer zanimiv mal "hekat" :P take mičkene formatke.
Pa če maš kšn programček za braje te datoteke, pa sam to pošl.
AMD Phenom QUAD 9950 Black Edition, 8GB

jeryslo ::

Bom prilepil kar sliko, kako zgledajo podatki v programu:
Tole je osnovna stran, sicer nima veze, sam vseen:

HeavyWeather1



Tole je pa tisto kar je važno, vrstni red je kot vidiš številka vnosa, datum,....:

HeavyWeather2

Zgodovina sprememb…

  • zavaroval slike: Mavrik ()

Tutankhamun ::

Ja pa res sm neki zaj. Windows kalkulator ne zna računat v hex obliki,če pride do decimalne številke! Tko, da sm se mal nategnu s številom zapisov. Bo treba mal bol prečekirat. Ampak še zmer če maš program za pregledovanje te datoteke, ga pošl.

AHa, ok bom mal prečekiru če bo šlo ;)
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

Tutankhamun ::

Lahk pa nardiš še eno dat datoteko, s samo enim zapisom + tistimi podatki o vsebin fajla. Da vidm, kaj sploh je en zapis...
AMD Phenom QUAD 9950 Black Edition, 8GB

AmokRun ::

Tukaj je format history.dat datoteke.

jeryslo ::

Program lahko zastonj dobiš tukaj:
http://www.heavyweather.info/new_englis...

AmokRun, pazi, tist file ki si ga prilepil je za postaje WS-2310 in WS-2315, saj piše:
HeavyWeather V2.0 beta
La Crosse WS-2310 and WS-2315 weather stations

Edit:
Sem opazil, da piše tudi za WS-3610, čeprav moja postaja je WS-3600, vendar mislim da se navedeni podatki ujemajo.

Zgodovina sprememb…

  • spremenil: jeryslo ()

AmokRun ::

Jaz sem delal za WS 2300 in deluje. Verjetno bo za WS 3600 tudi.

PaX_MaN ::

Poskusi ofnat datoteko s programčkom, ki ga dobiš tukaj in primerjaj njegov izhod s tistim v Heavy Weatherju.
Kul je, ker je izvorna koda zraven, a nekul, ker je Delphi(to čist iz berljivostnega pogleda).

jeryslo ::

Podatki se ujemajo, čeprav če odprem z tem programom je vnosov 48376, medtem ko v HeavWeather jih je 48075. Še nisem uspel najti od kje pride razlika, namreč pri 13000 in pa pri 20000 vnosu se podatki ujemajo. Super tole da je izvorna koda zraven, samo problem bo ker Delphi-ja ne poznam. No se bom že nekako znašel. Še nekaj, če "predelam" v javo, moram uporabiti za branje predvidevam da Data Stream?

Tutankhamun ::

No pa imaš :). Mal sm falu. Ok dolžino zapisa sm pa useen zadel :P. Pa število zapisov tut :P.
Zdej, ko pa veš kakšn je format je pa košček torte (peace of cake).
AMD Phenom QUAD 9950 Black Edition, 8GB

jeryslo ::

Ja to bomo še videli, dejansko branja podatkov na tako "low level" še nisem nikoli delal. No sej, če bom še rabil kaj bom vprašal tukaj. Drugače res hvala vsem za odgovore.

jeryslo ::

Ok, po dolgem času imam spet nekaj časa za moj "projekt". Imam pa naslednje vprašanje, najprej izvorna koda:

import java.io.*;
public class BranjeHistory{
	public static void main(String[] args){
		PrintWriter izhod = null;
		int i = 0;
		try{
			DataInputStream vhod = new DataInputStream(new FileInputStream("history.dat"));
			izhod = new PrintWriter(new FileWriter("izhod.txt"));
			while(vhod.available() != 0){
				double Timestamp = vhod.readDouble();
				float AbsPresure = vhod.readFloat();
				float RelPresure = vhod.readFloat();
				float WindSpeed = vhod.readFloat();
				float WindDirection = vhod.readFloat(); //ULong!!!
				float WindGust = vhod.readFloat();
				float TotalRainFall = vhod.readFloat();
				float NewRainFall = vhod.readFloat();
				float IndoorTemp = vhod.readFloat();
				float OutDoorTemp = vhod.readFloat();
				float InDoorHumidity = vhod.readFloat();
				float OutDoorHumidity = vhod.readFloat();
				float unknown = vhod.readFloat();//ULong!!
				i++;
				izhod.println(TotalRainFall + ", " + NewRainFall);
			}
			System.out.println("Stevilo vrstic: " + i);
		vhod.close();
		izhod.close();
		}
		catch(Exception e){
		}
	}
}


Najprej sem preverjal če se število vrstic ujema z tistim v programu HeavyWeather. Izpiše mi, da se i prešteje do 53831, medtem ko je v HeavyWeather 53529, dokaj podobno, sicer ne vem, kje nastane ta razlika? Naslednje kar sem sprobal in me zanima je, da sem izpisval v novo datoteko TotalRainfall in pa NewRainFall in glej ga zlomka, vrednosti se ujemajo, vsaj do 1100 vrstice, naprej se mi ni dalo gledati. Edino kar me muči je tole:

0.0, 0.0
-1.0756436E-15, -1.0756436E-15
-1.0756436E-15, 0.0

Prvi stolpec je TotalRainFall, drugi pa NewRainFall. To je 159,160 in 161 vrstica v HW. Torej podatki se mi ujemajo, namreč ta vnos je bolj na začetku, kjer je TotalRainfall 0mm, no in potem je v 160 vnosu postaja zabeležila 0.5mm. Zdaj me pa zanima glede tega zapisa, namreč kot vidite mi float vrže v eksponentni obliki. Zdaj me pa zanima, na kakšen način naj spremenim, da bom dobil v obliki 0.5? Nekaj sem že probal kastat, pa ni najbolje šlo.

Zgodovina sprememb…

  • spremenil: Primoz ()

Tutankhamun ::

A ti mislš, kako dobiš iz številke -1.0756436E-15 v 0.5?
AMD Phenom QUAD 9950 Black Edition, 8GB

Tutankhamun ::

Drgač pa probi tko prebrat datoteko. Najprej narediš strukturo enega zapisa:
struct Podatki
{
	double Timestamp;
	float AbsPresure;
	float RelPresure;
	float WindSpeed;
	float WindDirection; //ULong!!!
	float WindGust;
	float TotalRainFall;
	float NewRainFall;
	float IndoorTemp;
	float OutDoorTemp;
	float InDoorHumidity;
	float OutDoorHumidity;
	float unknown;//ULong!!
};


Potem pa nevem kako je to v javi, prebereš ceu zapis naenkrat nekak v tem stilu.
Podatki zapis;
vhod.read (zapis, sizeof(zapis));
//pol pa izpisuješ
console.writeline ("podatek1:" + zapis.Timestamp.ToString());
AMD Phenom QUAD 9950 Black Edition, 8GB

jeryslo ::

A ti mislš, kako dobiš iz številke -1.0756436E-15 v 0.5?


Tako je, to me matra. Glede struktur v C-ju, ok sem se jih letos učil na faksu, pa bom kar raje na Javi ostal:). Pa še tole me zanima, tam v kodi, kjer sem napisal v komentar ULong, sem dal kar za tip float, glede na to da je iste dolžine [4], ker sploh ne poznam tega tipa. To gledam iz te tabele, katere link je dal AmokRun:
00 Double [8] Timestamp days from 12/30/1899 00:00:00 (GMT)
08 Float [4] Abs Pressure hectopascals (millibars)
12 Float [4] Relative Pressure hectopascals (millibars)
16 Float [4] Wind Speed meters/second
20 ULong [4] Wind Direction see below
24 Float [4] Wind Gust meters/second
28 Float [4] Total Rainfall millimeters
32 Float [4] New Rainfall millimeters
36 Float [4] Indoor Temp celsius
40 Float [4] Outdoor Temp celsius
44 Float [4] Indoor Humidity %
48 Float [4] Outdoor Humidity %
52 ULong [4] unknown - (Value is always 0)

Našel sem sicer tole na netu glede ULong:
Holds unsigned 64-bit (8-byte) integers ranging in value from 0 through 18,446,744,073,709,551,615 (more than 1.84 times 10 ^ 18).

Vendar je presenetljivo malo zadetkov glede tega tipa in jave.

Tutankhamun ::

Aja ne veš kaj je ULONG. To je unsigned long (nepredznačeno število long).
(signed)long lahko zavzame vrednosti od -2147483647 do +2147483647
unsigned long pa zavzame vrednosti od 0 do 4294967295

Kar se pa tiče vrednosti -1.0756436E-15 je pa ne moreš spravt v 0.5, ker je daleč od te vrednosti, pa še negativna je povrh!
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

PaX_MaN ::

El ghetto spaghetto koda iz tistega priljepljenega v Delphiju sportana v Javo:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.FileChannel;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class reader 
{
	//date'n'stuff
	Calendar c; 
	
	//for printout
	String[] names = 
	{
			"Datum in čas meritve",
			"Absolutni pritisk (hPa)",
			"Relativni pritisk (hPa)",
			"Zunanja temperatura (°C)",
			"Zunanja vlažnost (%)",
			"Temperatura rosenja(°C)",

			"Notranja temperatura (°C)",
			"Notranja vlažnost (%)",

			"Hitrost vetra (km/h)",
			"Smer vetra (°)",
			"Hitrost sunka (km/h)",

			"Skupna količina padavin (mm)",
			"Relativna količina padavin (mm)",
			"Temp. Ressentie (WTF? - rosenja, mrbit?)(°C)"
	};
	String[] strings;
	
	//temporary byte buffer
	ByteBuffer buff,buffd;
	
	//channel
	FileChannel in;
	
	public static void main(String[] args) 
	{
		reader r = new reader(new File("history.dat"));
	}
	
	public reader(File f) 
	{
		parse(f);
			
		close();
	}
	
	private void parse(File f) 
	{
		// TODO Auto-generated method stub
		set(f);
		
		int entries = (int) (f.length()/56);
		
		for (int j = 0; j < this.names.length; j++) 
		{
			System.out.print(this.names[j]+" | ");
		}
		System.out.println();

		for (int i = 0; i < entries; i++) 
		{	
	        //date
			this.strings[0]= getDate(getNextDouble());
			//abs pressure
			this.strings[1]= String.valueOf(getNextFloat());
			//rel pressure
			this.strings[2]= String.valueOf(getNextFloat());
			//wnd speed
			float wndspeed= getNextFloat();
			//this.strings[8]= String.valueOf(wndspeed);
			//wnd dir
			int wnddir= getNextInt();
			//this.strings[9]= String.valueOf(wnddir);
			//wnd gust
			float wndgust= getNextFloat();
			//this.strings[10]= String.valueOf(wndgust);
			//abs rainfall
			this.strings[11]= String.valueOf(getNextFloat());
			//rel rainfall
			this.strings[12]= String.valueOf(getNextFloat());
			//in temp 
			this.strings[6]= String.valueOf(getNextFloat());
			//out temp
			float outtemp = getNextFloat();
			this.strings[3]= String.valueOf(outtemp);
			//in hum
			this.strings[7]=  String.valueOf(getNextFloat());
			//out hum
			float outhum= getNextFloat();
			this.strings[4]=  String.valueOf(outhum);
			//empty - just read it, dont save it
			getNextInt();
		
			//other
			this.strings[5] = String.valueOf(ConvertToDewPoint(outtemp,outhum));

			float D =wndspeed*3.6f; //50 last value, 51 Invalid va
	        if (D<=180)
	        {
	        	this.strings[8]= String.valueOf(D);
	        	this.strings[9]=String.valueOf(wnddir*22.5f);
	        	this.strings[13]=String.valueOf(ConvertToWindChill(outtemp,D));
	        }
	        else
	        {
	        	this.strings[8]="--";
	        	this.strings[9]="--";
	        	this.strings[13]="--";
	        }

	        D=wndgust*3.6f;
	        if (D<=180)
	        	this.strings[10]=String.valueOf(D);
	        else
	        	this.strings[10] = "--";	
	        
	        for (int j = 0; j < this.strings.length; j++) 
	        {
	        	System.out.print(this.strings[j]+spaces(j));
			}
	        
	        System.out.println();
		}
	}

	public void set(File f)
	{
		//buffers
		this.buff = ByteBuffer.allocate(8);
		this.buffd = ByteBuffer.allocate(4);

		//important!
		this.buff.order(ByteOrder.LITTLE_ENDIAN);
		this.buffd.order(ByteOrder.LITTLE_ENDIAN);
		
		//input channel
		try {
			in= new FileInputStream(f).getChannel();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//printout
		this.strings = new String[14];
	}
	
	public void close()
	{
		try {
			this.in.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private String spaces(int i) 
	{
		String spaces ="";
		
		//if(i >0)
		{
			for (int j = 0; j < (this.names[i].length()-this.strings[i].length())+3; j++) 
			{
				spaces += " ";
			}
		}
		return spaces;
	}
	
	//helper functions
	public String getDate(double time)
	{ 
	    Calendar c =Calendar.getInstance();
		c.set(1899,11,30,0,0);// init delphi version of start of time
		
		//parse date & minutes from double
		int t = (int)time;
		int m = (int)((60*24) *(time - t));
		
		//months go 0..11	        
		c.add(Calendar.DATE,t);  // add in the days
		c.add(Calendar.MINUTE,m); // add the minutes

		SimpleDateFormat sdf = new SimpleDateFormat();
		return sdf.format(c.getTime());
	}
	
	public double getNextDouble()
	{
		//empty buffer
		this.buff.clear();
		
		//start filling buffer
		int readNum = 0;
		while (readNum < 8) 
		{
			this.buff.rewind();
			try {
				readNum = this.in.read(buff);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			buff.rewind();
		}
	
		return buff.getDouble();
	}
	
	public float getNextFloat()
	{
		//empty buffer
		this.buffd.clear();
		
		//start filling buffer
		int readNum = 0;
		while (readNum < 4)
		{
			this.buffd.rewind();
			try {
				readNum = this.in.read(buffd);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			this.buffd.rewind();
		}
	
		return this.buffd.getFloat();
	}
	
	public int getNextInt()
	{
		//empty buffer
		this.buffd.clear();
		
		//start filling buffer
		int readNum = 0;
		while (readNum < 4) 
		{
			this.buffd.rewind();
			try {
				readNum = this.in.read(buffd);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			this.buffd.rewind();
		}
	
		return this.buffd.getInt();
	}
	
	public double ConvertToDewPoint(double Temp, double RH)
	{
		double D,ES,E;

		double  K=237.7,
	       		Z=6.11 ,
	       		C=7.5;
	
	 // Temp : Actual Temperature °C
	 // RH   : Relative Humidity  %RH
	 // Out  : DewPoint Temp      °C

	 D = (C*Temp)/(K+Temp);
	 ES =Z*Math.pow(10,D);
	 E  =(RH*ES)/100;
	 D =Math.log(E/Z);

	 return D*K/(C*Math.log(10)-D);
	}
	
	public double DegToFahrenheit(double DegC)
	{
		return (9*DegC/5)+32;
	}

	public double FahrenheitToDeg(double DegF)
	{
		return (DegF-32)*5/9;
	}


	public double ConvertToWindChill(double Temp,double WindSpeed)
	{
		double F,Mph,D;

	 // wind chill temperature
	 // Temp       : Actual Temperature   °C
	 // WindSpeed  : Wind Speed           km/h
	 // Out        : ind Chill Temp       °C
	 // windchill = 35.74 + 0.6215*t - 35.75*v^0.16 + 0.4275*t*v^0.16

	 //WindSpeed:=50;
	 //Temp:=5;

	 if(WindSpeed<4.8)
	 {
	  return Temp;
	 }
	 else
	 {
	  F  =DegToFahrenheit(Temp);
	  Mph=WindSpeed/1.609;
	  D  = 35.74 + 0.6215*F - 35.75*Math.pow(Mph,0.16) + 0.4275*F*Math.pow(Mph,0.16);
	  return FahrenheitToDeg(D);
	 }

	}
}

Zgodovina sprememb…

  • spremenilo: PaX_MaN ()

jeryslo ::

Uf, hvala za odgovor, no bom malo pregledal, vendar sem mislil probati sam narediti. Si bom pa pomagal s to kodo.

jeryslo ::

Mogoče kdo ve, kako bi recimo iz Stringa:
"blablabla:1200"
Avtomatsko pretvoril številko v tip double. Poznam metodo parseDouble() vendar tist zahteva da je v stringu samo število, brez kakršnih drugih znakov. Sigurno obstaja kakšna metoda, ki iz celotnega stringa "izlušči" število?

EDIT:
Sem kar sam naredil metodo in s pomočjo StringBufferja brisal mesta, ki se niso ujemala s številkami.

Zgodovina sprememb…

  • spremenil: jeryslo ()

Nuke_H2 ::

lohk z metodo charAt, subString itd... mal si dokumentacijo poglej.

jeryslo ::

Ok novo vprašanje:D:
Ravno prejle sem napisal program ki bere trenutne podatke iz datoteke currdat.lst, ter ga nato "spravil" v applet. Če applet poženem v eclipse se mi lepo izpiše recimo zunanja temperatura 17°C. No potem sem vključil applet v mojo spletno stran, katero laufam preko Apache-ja. Applet se lepo vključi prikaže se takšno ozadje kot sem ga nastavil, izpiše se zunanja temperatura, vendar je le ta 0°C, toliko kot imam spremenljivko nastavljeno na začetku, preden program prebere iz datoteke currdat.lst. Torej dejansko če poženem applet na eclipse se podatek pravilno izpiše, če pa ga vključim v html kodo pa se pokaže vse, razen podatek je napačen. Probal sem tudi dodati glavno metodo in izvršiti program preko cmd v datoteki htdocs, iz koder Apache bere html datoteke in se vsi podatki pravilno izpišejo, torej tukaj ni težava, da applet ne bi moral prebrati datoteke currdat. Any ideas?

Zgodovina sprememb…

  • spremenil: jeryslo ()

jeryslo ::

Evo, še dokaz:
En applet pognan preko Eclipse, drugi pa preko cmd z appletviewer. Koda je popolnoma identična:

Problem

Zgodovina sprememb…

  • zavaroval slike: Mavrik ()

celebro ::

Če poženeš program iz eclipsa, se zažene v drugi mapi, kot če ga zaženeš iz cmd-ja. Kar pomeni, da relativne poti ne držijo več.

jeryslo ::

Pot je nastavljeno absolutno, vendar sem že rešil problem tako da sem podpisal applet. Vendar me zdaj zanima sledeče, nisem ravno prepričan kako to deluje:
Recimo jaz sem zdaj vključil ta applet na svojo spletno stran, katero kot sem že zgoraj napisal poganjam z Apache server-jem. Če jaz zdaj odprem to svojo stran na svojem računalniku se zdaj podatki pravilno izpišejo, medtem ko na bratovem računalniku pa se izpišejo podatki, vsi z vrednostmi 0, toliko kot so nastavljene spremenljivke. Torej, ko se applet zažene, bere tole vrstico kode, iz koder berem trenutne podatke:

FileReader fileReader = new FileReader("C:/Program Files (x86)/HeavyWeather/currdat.lst");

Torej če poženem na keremkoli drugem računalniku ta applet, bo iskal to datoteko na tistem računalniku iz koder poganjam applet, ne pa na mojem osebnem, kjer se ta datoteka dejansko nahaja, imam prav?

infiniteLoop ::

Tocno tako. Applet se zazene na klientu in ce dostopas do datoteke bo to datoteka na klientu (torej racunalniku na katerem zazenes applet). Ce hoces brati podatke iz oddaljenega racunalnika bos moral vzpostaviti mrezno povezavo. Glej sockete, RMI in podobno.
None of us is as dumb as all of us.

jeryslo ::

Hvala za odgovor, sem potem rešil na tale način, ki je pravzaprav ekstremno preprost, ne rabiš nobenih socketov, nič:
URL naslov = new URL("http://moj.ip/heavyweather/currdat.lst");//Dinamični IP
BufferedReader vhod = new BufferedReader(new InputStreamReader(naslov.openStream()));


Dejansko kar ustvariš objekt tipa URL, z povezavo na strežnik. Potem pa še narediš objekt tipa BufferedReader z inputom, ki odpre povezavo na datoteko. Edino kar še ne vem, kaj bom naredil z dinamičnim ip-jem, študiral sem da bi pri Siolu zaprosil za statičnega.

Zgodovina sprememb…

  • spremenil: jeryslo ()

PaX_MaN ::

Ne rabiš Siolu težit. Tule si registriraj poljubno poddomeno.

techfreak :) ::

Če pa rabiš statični ip, pa moraš samo prošnjo s svojim uporabniškim imenom/šifro kupca poslati preko faksa ali preko navadne pošte.

jeryslo ::

Hvala za odgovor, sem potem rešil na tale način, ki je pravzaprav ekstremno preprost, ne rabiš nobenih socketov, nič:
URL naslov = new URL("http://moj.ip/heavyweather/currdat.lst");//Dinamični IP
BufferedReader vhod = new BufferedReader(new InputStreamReader(naslov.openStream()));


Dejansko kar ustvariš objekt tipa URL, z povezavo na strežnik. Potem pa še narediš objekt tipa BufferedReader z inputom, ki odpre povezavo na datoteko. Edino kar še ne vem, kaj bom naredil z dinamičnim ip-jem, študiral sem da bi pri Siolu zaprosil za statičnega.


Še nekaj me muči, trenutno imam applet, ki je podpisan iz moje strani, torej uporabnik potrdi certifikat, da lahko vidi applet. Toda sem začel premišljevati, da veliko uporabnikov noče potrjevati takšnih varnostnih opozoril. Kot prvo sem naredil podpisal applet, ker drugače mi ni hotelo brati podatkov iz datoteke na MOJEM serverju. Kot veste ima nepodpisan applet zelo veliko varnostnih omejitev zaradi možnosti zlorabe, toda nato sem naletel na tole:
talk to any server but the one you were loaded from. No talking to strangers. If they were loaded from a local disk, they can’t talk to any webserver at all. They can’t load classes, read files, or have socket communications with any webserver but mom, the server htey were loaded from. Applets can send/receive email to/from a different host, but only via the home host.


Torej lahko nepodpisan applet bere podatke iz mojega serverja, ker je bil naložen iz le-tega? Toda če applet ne podpišem le-ta ne pokaže nobenih podatkov.

Zgodovina sprememb…

  • spremenil: jeryslo ()

jeryslo ::

Ok, prišel sem do novega problema:
S pomočjo programske kode, ki jo je prilepil PaxMan in z svojo kodo sem spravil vse vrednosti iz history data v Access datoteko. Toda šele zdaj sem opazil, da je da datum na vsaki drugi vnos narobe napisan, namreč pri intervalu za 1 minuto zgleda takole:

26.7.2009 1:32:00
26.7.2009 1:34:00
26.7.2009 1:34:00
26.7.2009 1:35:00

Torej zgleda da tista metoda narobe "zaokrožuje" čas, kajti v programu HeavyWeather so časi lepo razporejeni na 1 minuto. Mogoče kakšna ideja kako bi to popravil.

jeryslo ::

Hehehe kera bedna napaka, edino kar sem moral dodati je bil Math.round:
int m = (int)Math.round((60*24) *(time - t));


Namreč ko sem ugotovil je pri kastanju prišlo do narobnega zaokroževanja, ne razumem zakaj Java spremeni iz spremenljivke double, ki ima vrednost npr. 5.956 v spremenljivko int, ki ima potem vrednost 5! Zato je torej prej potrebno zaokrožiti double, in šele potem kastati.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android] pomoč pri postavitvi layouta

Oddelek: Programiranje
122029 (1787) icurk
»

[android] crash

Oddelek: Programiranje
61271 (1080) messi
»

Java problem

Oddelek: Programiranje
201524 (1222) infiniteLoop
»

Java in pošiljanje elektronske pošte!!

Oddelek: Programiranje
51291 (1192) janez_janez
»

[JAVA] branje iz datoteke

Oddelek: Programiranje
242296 (1931) Bela01

Več podobnih tem