[Çözüldü]Java ile yazdığım program Windowsta çalışmıyor

Başlatan stef_q, 08 Ocak 2011 - 21:10:48

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

stef_q

Kaç gecedir java ödevim ile uğraşıyorum. Sonunda bitirdim. Ubuntu üzerinde Netbeans ile yazdım. Program belirtilen bir txt dosyasından verileri okuyup, okuduğu verilere göre başka bir txt dosyasına başka veriler yazıyor. Programda i/o kütüphaneleri dışında bir şey yok. Hoca (%99.9) programı windows üzerinde test edecek. Ben bu programı windows üzerinde az önce test ettim ve çalışmadığını farkettim. Hatta benim hazırladığım txtlerin bile windowsta düzgün gözükmediğini farkettim. Şu anda ne yapacağımı bilemiyorum. Windows üzerinden bu txt leri elle tekrar yazıyorum ve öyle programı çalıştırdığımda yine olmuyor. Kaldıki bir dosyayı liuxta gedit, windows notepad ile açamam neyi değiştirebilirki ? Ben bu dosyaları hiç açmadan (değiştirmeden) java programını derliyorum ve bu txt uzantılı dosyalardan java otomatik okuyor. Yani bir bayt okuyacaksa bir bayt okuyor. Başka yolu yok. Dosya sisteminde aynı baytlar aynı sıra ile duruyor bu txt dosyasının içinde. Benim mantığım bir türlü almadı bunu. Programı tekrar elle yazmam mümkün değil. Bu şekilde hocaya teslim edersem de sıfır alacam. Bu konu hakkında fikri olan birileri yardımcı olursa sevinirim.

mistrafantastic

dosya sonu karakterleri uyuşmuyordur.

dosyaları windowsa al, dosyanın içeriğini windowsta yarattığın dosyaya kopyala.

hallolacaktır.
winston soft
djarum black (mobile) 

jacobs monarch nescafe 3 in 1 (mobile)  iletişim: [email]mistrafantastic@gmail.com[/email]

eribol

dos2unix paketini kurmak işini rahatlatır.
Alıntı YapThis package contains utilities dos2unix, unix2dos, mac2unix,
unix2mac to convert the line endings of text files between UNIX (LF),
DOS (CRLF) and Mac (CR) formats.

Text files under Windows and DOS typically have two ASCII characters
at the end of each line: CR (carriage return) followed by LF (line
feed). Older Macs used just CR, while UNIX uses just LF. While most
modern editors can read all these formats, there may still be a need
to convert files between them.

This is the classic utility developed in 1989.

stef_q

Alıntı yapılan: mistrafantastic - 09 Ocak 2011 - 01:35:10
dosya sonu karakterleri uyuşmuyordur.

dosyaları windowsa al, dosyanın içeriğini windowsta yarattığın dosyaya kopyala.

hallolacaktır.

Bunu denedim olmadı. Dosyaları windowsa aynen dosya olarak kopyaladım olmadı. Dosyayı text görüntüleyicisi ile windowsta açıp, windowsta yarattığım txt ye kopyaladım. Yine olmadı. Hatta sadece notepad ile değil worppad ile de düzenlemeyi denedim yine olmadı.

Alıntı yapılan: eribol - 09 Ocak 2011 - 01:44:31
dos2unix paketini kurmak işini rahatlatır.
Alıntı YapThis package contains utilities dos2unix, unix2dos, mac2unix,
unix2mac to convert the line endings of text files between UNIX (LF),
DOS (CRLF) and Mac (CR) formats.

Text files under Windows and DOS typically have two ASCII characters
at the end of each line: CR (carriage return) followed by LF (line
feed). Older Macs used just CR, while UNIX uses just LF. While most
modern editors can read all these formats, there may still be a need
to convert files between them.

This is the classic utility developed in 1989.

Bunu kurduğum zaman ne olacak ? Linux üzerinde de mi bu program çalışmayacak ?
Şimdi benim programın mantığı çok basit. Aynı mantıkta bugün arkadaşın birine aynı programı yazıverdim. Fakat onunkisinde try-catch tarzı şeyler yapmadığımız için kısa sürdü. Benimkisini tekrardan yazma gibi bir lürksüm malesef yok. Ama arkadaşa aynı liuxta yazarmış gibi windowsta program yazdım. Benim kodun windowsta çalışmaması benim mantığıma hala yatmıyor.

muzir

"mistrafantastic" da  belirttiği gibi dosya sonu karakterleri ile ilgili bir problem olabilir, ancak bu problem eğer karakter karakter okayarak bir ayırma(parsing) operasyonu ise dosyaları windows'ta yeniden oluşturman problemi çözmez. Burada kendi koduna bakıp orada ki ayırma işlemini değiştirmen gerekebilir. Örneğin ASCII karakter setinde  LF (Line feed, '\n', 0x0A, 10 in decimal) , CR (Carriage return, '\r', 0x0D, 13 in decimal)  ya da beraber kullanılırlar  CR + LF (CR+LF, '\r\n', 0x0D 0x0A).

Linux da bu sadece LF iken;
Windows da CR+LF dir,

Byte operasyonarında da windows da olan "CR" karakteri yüzünden bir biri üzerine yazma gibi hatalarda olabiliyor. Belki kod da ayırma operasyonun yapıldığı kısmı eklersen daha fazla yardım alabilirsin. Kolay gelsin.
Bir Tellioğlu asla geç kalmaz...

stef_q

#5
Kodun asıl parçası burda diğer kısımlarda bir işlem gerçekleşmiyor :

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Formatter;
import java.util.Scanner;
import javax.swing.JOptionPane;
//sadece anlaşılması zor olan satırları açıkladım
public final class Islemler
{
        boolean hatavar=false;
File siparisdosyasi=null;//kullanıcının gösterdiği dosya
Scanner siparisoku=null;//kullanıcının gösterdiği dosyayı okumak için
File musteridosyasi=null;
Scanner musterioku=null;
File ogedosyasi=null;
Scanner ogeoku=null;
File hatadosyasi=null;
Formatter hatayaz =null;
SiparisOge[] siparisoge=null;
Siparis siparis=null;
Musteri musteri=null;
MuzikCD muzikcd=null;
Yazilim yazilim=null;
Kitap kitap=null;
String musteriid=null;
int kayitsayisi=0;
String urunid=null;
int urunadet=0;
boolean killislemler=false;//bu değer true olursa işlemler constractoru sonlandırılıyor.
File fatura=null;
Formatter faturayaz=null;
//buraya kadarki parametlelerin değerleri zaten java tarafından otomatik aynı benim girdiğim şekilde verildiğini biliyorum.Fakat yinede kendimi garatiye almak istedim. O kısımları yok varsayabilirsiniz.
Islemler(String dosyaadresi)
{
DosyalariAc(dosyaadresi);
if(killislemler==true)
{
return;
}
while(siparisoku.hasNext())//aşağıdaki for döngüsü müşterinin kaç adet ürünü varsa o kadar satır okuyor. o satırlar bitince for döngüsü de bitiyor. for bitince while bir kere daha has.next diye kontrol ediyor. eğer var ise tekar müşteri id yi ve kaç farklı ürün alındığını okuyor ve yine for a giriyor.
{
musteriid = siparisoku.next();
kayitsayisi = siparisoku.nextInt();
siparisoge = new SiparisOge[kayitsayisi];
musteri = new Musteri(Integer.parseInt(musteriid), getAd(musteriid), getSoyad(musteriid), getAdres(musteriid));
                        if(getAd(musteriid)!=null)//müşteriid null değilse müşteri için fatura döngüsü yaratılıyor.
                        {
                            int i=0;
                            for(i=0; i<kayitsayisi; i++)//müşterinin kaç farklı ürün aldığını gösteren integer değeri kadar satır okunuyor.
                            {
                                    try//madem döngü devam ediyor o halde hasnext=true olmak zorunda. çünkü döngü sayısı kadar farklı ürün almış bu müşteri. eğer hata alırsak yani (try-catch bloğu bu hatayı yakalıyor kendim başka basit bir kod üzerinde test ettim), hasnext=false ise kullanıcının verdiği dosyada başka bir bilgi de yok demektir. O dosyada başka bir veri yoksa program bir hata yazar. ve işlemleri sonlandırır. gui kapanmaz.
                                    {
                                            urunid = siparisoku.next();
                                            urunadet = Integer.parseInt(siparisoku.next());
                                    }
                                    catch(Exception ex)
                                    {
                                            Hatayaz(musteriid + " numaralı müşterinin aldığı farklı ürünlerin adeti ( Kayıt sayısı ) eksik girilmiş. Bu müşterinin faturası işlenmedi. (Dosyada başka veri yok. Bu son müşteriydi.)");
                                            CloseAll();
                                            JOptionPane.showMessageDialog(null, "Faturalar dosyaya yazıldı.\nFaturalamada bazı hatalar meydana geldi. Çıkan hataları java programi ile aynı dizinde olan hatadosyasi.txt den okuyabilirsiniz.\nFaturaları java programı ile aynı dizinde olan faturadosyasi.txt den okuyabilirsiniz.");
                                            return;
                                    }
                                    if(getUrun(urunid)!=null)
                                    {
                                            siparisoge[i] = new SiparisOge(getUrun(urunid), urunadet);
                                    }
                                    else//getUrun ürün bulamazsa
                                    {
                                            if(killislemler)//bu ihtimal hemen yukarıdaki if koşulundaki getUrun(urunid) metodunda filenotfound uyarısı için
                                            {
                                                    JOptionPane.showMessageDialog(null, "Program işlemlere devam etmeyecek. Java programının bulunduğu dizindeki yazma haklarınızı kontrol edin ve tekrar deneyin.");
                                                    CloseAll();
                                                    return;
                                            }
                                            siparisoge = BirAzalt(siparisoge);
                                            kayitsayisi--;//getUrun ürün bulamazsa o ürün es geçlir
                                            i--;//getUrun ürün bulamazsa o ürün es geçlir
                                    }
                            }
                            if(i!=0)//müşteriye ait siparişlerden en az biri doğru ise
                            {
                            siparis= new Siparis(musteri, siparisoge);
                            FaturaEkle(siparis);
                            }
                         }
                         else
                         {
                            Hatayaz(musteriid+" numaralı müşteri sistemde bulunmamaktadır. Bu müşteri es geçildi. Bu müşterinin faturası çıkarılmayacaktır.");
                         }
}
                if(hatavar==true)
                {
                    JOptionPane.showMessageDialog(null, "Faturalar dosyaya yazıldı.\nFaturalamada bazı hatalar meydana geldi.\nÇıkan hataları java programi ile aynı dizinde olan hatadosyasi.txt den okuyabilirsiniz.\nFaturaları java programı ile aynı dizinde olan faturadosyasi.txt den okuyabilirsiniz.");
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "Faturalar hatasız bir şekilde dosyaya yazıldı.\nFaturaları java programı ile aynı dizinde olan faturadosyasi.txt den okuyabilirsiniz.");
                }
        CloseAll();
return;
}

    SiparisOge[] BirAzalt(SiparisOge[] siparisoge)
    {

            SiparisOge[] temp=new SiparisOge[siparisoge.length-1];
            for(int i=0;i<siparisoge.length-1;i++)
            {
                   temp[i]=siparisoge[i];
            }
            return temp;
    }

String getAdres(String musteriid)
{
String musteriAdres=null;
while(musterioku.hasNext())
{
if(musterioku.next().equals(musteriid))
{
musterioku.next();//adına denk gelir
musterioku.next();//soyadına denk gelir
musteriAdres=musterioku.next();//adrese denk gelir(adres sadece şehir yani tek string olarak girilmiştir)
musterioku.close();
try
{
musterioku = new Scanner(musteridosyasi);
}
catch(FileNotFoundException e)
{
CloseAll();
killislemler=true;
return null;
}
return musteriAdres;
}
}
musterioku.close();
try
{
musterioku = new Scanner(musteridosyasi);
}
catch(FileNotFoundException e)
{
CloseAll();
killislemler=true;
return null;
}
return null;
}

String getAd(String musteriid)
{
String ad=null;
while(musterioku.hasNext())
{
if(musterioku.next().equals(musteriid))
{
ad= musterioku.next();
musterioku.close();
try
{
musterioku = new Scanner(musteridosyasi);
}
catch(FileNotFoundException e)
{
CloseAll();
killislemler=true;
return null;
}
return ad;
}
}
musterioku.close();
try
{
musterioku = new Scanner(musteridosyasi);
}
catch(FileNotFoundException e)
{
CloseAll();
killislemler=true;
return null;
}
return null;
}

String getSoyad(String musteriid)
{
String soyad;
while(musterioku.hasNext())
{
if(musterioku.next().equals(musteriid))
{
musterioku.next();//adına denk geliyor
soyad= musterioku.next();//soyadına denk geliyor
musterioku.close();
try
{
musterioku = new Scanner(musteridosyasi);
}
catch(FileNotFoundException e)
{
CloseAll();
killislemler=true;
return null;
}
return soyad;
}
}
musterioku.close();
try
{
musterioku = new Scanner(musteridosyasi);
}
catch(FileNotFoundException e)
{
CloseAll();
killislemler=true;
return null;
}
return null;
}

Oge getUrun(String urunid)
{
String ogeadi=null;
while(ogeoku.hasNext())
{
if(ogeoku.next().equals(urunid) )
{
ogeadi = ogeoku.next();
if(ogeadi.equals("Yazilim"))
{
ogeoku.close();
try
{
ogeoku=new Scanner(ogedosyasi);
}
catch(Exception ex)
{

}
return new Yazilim();
}
if(ogeadi.equals("MüzikCD"))
{
ogeoku.close();
try
{
ogeoku=new Scanner(ogedosyasi);
}
catch(Exception ex)
{

}
return new MuzikCD();
}
if(ogeadi.equals("Kitap"))
{
ogeoku.close();
try
{
ogeoku=new Scanner(ogedosyasi);
}
catch(Exception ex)
{

}
return new Kitap();
}
}
}
ogeoku.close();
try
{
ogeoku = new Scanner(ogedosyasi);
}
catch(FileNotFoundException e)
{
CloseAll();
killislemler=true;
return null;
}
Hatayaz(urunid+" numaralı oge sistemde bulunmamaktadır. Bu ürün es geçildi. Bu müşterinin faturası bu ürünsüz çıkarılacaktır.");
return null;
}

void FaturaEkle(Siparis siparis)
{
        int toplamtutar=0;
faturayaz.format("%s", "Müşteri No: " + musteriid + "\nAdı:"+ siparis.musteri.ad + "\nSoyadı: " + siparis.musteri.soyad + "\nAdres: " + siparis.musteri.adres + "\nUrun_Adı Birim_Fiyat Adet Fiyat \n");
for(int i=0 ; i<siparis.ogeler.length ; i++)
{
            toplamtutar= toplamtutar+siparis.ogeler[i].oge.fiyat*siparis.ogeler[i].adet;
faturayaz.format("%s", siparis.ogeler[i].oge.id + "    " + siparis.ogeler[i].oge.fiyat + "      " + siparis.ogeler[i].adet + "   " + siparis.ogeler[i].oge.fiyat*siparis.ogeler[i].adet + "\n");
}
        faturayaz.format("          Toplam tutar : %s\n", toplamtutar);
        faturayaz.format("%s", "----------------------------------\n");
return;
}

    void DosyalariAc(String dosyaadresi)
{
    if(dosyaadresi==null)
{//burayı dosya henüz hiç seçilmişse uyarı "hiç dosya seçmedinizki" tarzında çıksın diye yaptım. ama çalışmıyor.
JOptionPane.showMessageDialog(null, "Dosya seçmediniz. Gözat tuşuna basıp .txt uzantılı bir dosya seçin ve tekrar deneyin.");
CloseAll();
killislemler=true;
return;
}
    try
{
siparisdosyasi = new File(dosyaadresi);
siparisoku=new Scanner(siparisdosyasi);
}
catch (FileNotFoundException ex)
{
JOptionPane.showMessageDialog(null, "Seçiminiz sadece bir dizin belirtiyor veya seçtiğiniz dosya seçildikten kısa bir süre sonra silinmiş. .txt uzantılı dosyanızı tekrar seçmeyi deneyin.");
CloseAll();
killislemler=true;
return;
}
try//daha uzun süreceğini bilmeme rağmen, try bloğunun içine en fazla 2 veya 3 satır almayı tercih ettim. Böylece hataların nereden kaynaklandığını daha detaylı olarak yakalayıp kullanıcıya spefikik hata sebebini yazabileceğim.
{
hatadosyasi=new File("hatadosyasi.txt");
hatayaz = new Formatter(hatadosyasi);
musteridosyasi=new File("musteridosyasi.txt");
musterioku = new Scanner(musteridosyasi);
ogedosyasi=new File("ogedosyasi.txt");
ogeoku = new Scanner(ogedosyasi);
fatura = new File("fatura.txt");
faturayaz = new Formatter(fatura);
}
catch (FileNotFoundException e)
{
JOptionPane.showMessageDialog(null, "Program işlemlere devam etmeyecek. Java programının bulunduğu dizindeki yazma haklarınızı kontrol edin ve tekrar deneyin.");
CloseAll();
killislemler=true;
return;
}
return;
}

void Hatayaz(String hatamesaji)
{//bu metod sadece hatadosyasına girilen hata stringini eklemek için yaratıldı. kill=true olursa program işlemleri sonlandırır. gui kapanmaz. böylece kullanıcı tekrar deneyebilir.
hatavar=true;
                try
{
hatayaz.format("%s", hatamesaji+"\n");
}
catch(Exception ex)
{
JOptionPane.showMessageDialog(null, "Hata dosyasına işlenemiyor. Bu yüzden program devam etmeyecek. Java programının bulunduğu dizindeki yazma haklarınızı kontrol edin ve tekrar deneyin.");
CloseAll();
killislemler=true;
return;
}
return;
}

void CloseAll()
{//bu metodu bana kolaylık olsun diye yarattım. program işlemeyi durdurduğu zaman her defasında aşağıdaki bazı if bloklarını ayrı ayrı duruma göre eklemem gerekiyordu. Şu anda return anahtarının önüne bu metodu çalıştırmam yetiyor.
if(faturayaz!=null)
{
faturayaz.close();
}
if(hatayaz!=null)
{
hatayaz.close();
}
if(hatayaz!=null)
{
ogeoku.close();
}
if(hatayaz!=null)
{
musterioku.close();
}
if(siparisoku!=null)
{
siparisoku.close();
}
return;
}
}


Burada şüpheli java kütüphane fonksiyonları (metodları) sadece : dosya.hasNext() => true veya false döndürüyor, dosya.next()=> bir sonraki stringi döndürüyor, nextInt() =>bir sonraki integerı döndürüyor, dosya.format("%s", "buradaki stringi dosyaya yazıyor").

stef_q

nextInt() metodunda sorun varmış arkadaşlar. Bu metod test etmedim ama linuxta geliba bir integera karşılık gelen rakamları txt den komple okuyor , windowsta ise ya hiç yapmıyor yada tek bir rakamı txtden okuyor.

Arada farklılığın olması hala bana ilginç geliyor. Sonuçta bu, SunJava nın kendi ortak kütüphanesi ve bunu kullananlar nasıl tüm sistemlerde çalışan bir program yapacaklar bilemiyorum. Netbeans veya Eclipse de bu konuda bir uyarı tarzı bir şey vermiyor...

İlginiz için teşekkürler!