Program przestał wczytywać dane

0

Cześć,

Mam mały problem.

Otóż po jakimś czasie chciałem wprowadzić zmiany w programie, które uczyniłem, kompiluje aby przetestować, a tu zonk. Program który wcześniej działał teraz nie działa.

W załącznik wysyłam jego treść, być może pomożecie znaleźć błąd. Ogólnie program niby działa, ale generuje pusty plik wyjściowy - co ciekawe wyświetlenie linii działa, natomiast nie mogę ich zapisać. Ktoś pomoże ??

0

Koszmarnie długa klasa, nazwa sugeruje, że chodzi o metodę SaveToFile. Otóż ta metoda wpierw otwiera plik a potem go zamyka. Niczego w międzyczasie do pliku nie zapisuje.

0

Do testów zrobiłem aby tylko wyświetlił, tak powinno to wyglądać:

 
public static void SaveToFile(String HEADR, ArrayList OutputLines) throws MessagingException{
        try {
            String FileName = GetFileName().replace(".OUT", ".txt");
            try (BufferedWriter OutputWriter = new BufferedWriter(new FileWriter("Z:\\OUTPUTtest\\" + FileName))) { 
                if(null != tempHEADR)
                {
                    OutputWriter.write(GetHeader());
                    OutputWriter.newLine();
                    //System.out.println(HEADR);
                    for (int i = 0; i< OutputLines.size(); i++){
                        //System.out.println(OutputLines.get(i).toString());
                        OutputWriter.write(OutputLines.get(i).toString());
                        OutputWriter.newLine();
                    }
                OutputWriter.close();
                }
            }
        } catch (IOException e) {
            DisplayErrorMessage(e.getMessage());
            SendErrorMessage(e.getMessage(), Arrays.toString(e.getStackTrace()));
            SetLastFileNumber();
            System.exit(0);
        }
0

Ogólnie program niby działa, ale generuje pusty plik wyjściowy - co ciekawe wyświetlenie linii działa
Skąd wiesz, że wyświetlanie linii działa skoro niczego nie wyświetlasz? Wypróbuj program, który jednocześnie wypisuje na konsoli i zapisuje do pliku.

0

Myślałem o tym, ale pod koniec pliku generowana jest zmienna, która zawiera ilość wygenerowanych linii, która musi się znajdować w pierwszej linii pliku.

Dziwne jest to, że wcześniej to działało (testowałem na ponad 100 plikach) a teraz nie działa :/

0

Napisałem

Wypróbuj program, który jednocześnie wypisuje na konsoli i zapisuje do pliku.

Zrobiłeś to? Może wywołanie GetHeader() rzuca wyjątkiem.

0

Zrobiłem mały test. W głównej sekcji wywołałem osobno funkcję LoadFromFile(); oraz SaveToFile(); zadziałało, jednakże jeśli funkcje są "wewnątrz" FTPDownload(); to nie chce działać :/

Może podasz jakiś krótki przykład w C++ zrobiłbym to vectorem, w Java nie wiem jak :(

0

Wypróbowałeś w końcu taką funkcję?

public static void SaveToFile(String HEADR, ArrayList OutputLines) throws MessagingException{
        try {
            String FileName = GetFileName().replace(".OUT", ".txt");
            try (BufferedWriter OutputWriter = new BufferedWriter(new FileWriter("Z:\\OUTPUTtest\\" + FileName))) { 
                if(null != tempHEADR)
                {
                    OutputWriter.write(GetHeader());
                    OutputWriter.newLine();
                    System.out.println(HEADR);
                    for (int i = 0; i< OutputLines.size(); i++){
                        System.out.println(OutputLines.get(i).toString());
                        OutputWriter.write(OutputLines.get(i).toString());
                        OutputWriter.newLine();
                    }
                OutputWriter.close();
                }
            }
        } catch (IOException e) {
            DisplayErrorMessage(e.getMessage());
            SendErrorMessage(e.getMessage(), Arrays.toString(e.getStackTrace()));
            SetLastFileNumber();
            System.exit(0);
        }
0

TAK, na razie jest OK. Zobaczymy dalej ;)

Dzięki :)

P.S Pytanie z tytułu głupich jak z pliku Java zrobić pliczek exe albo jak wywołać taki skrypt w konsoli. Chodzi o zrobienie w schedulerze automatu.

0

Dzięki spróbuje. Ostania rzecz. Jak StackTrace wyrzucić do maila (mam funkcję która wysyła maila w przypadku błędu), tak aby każdy "krok" był w oddzielnej linii, a nie wszystko w jednym ??

0

Jeszcze jedna sprawa. Generowany plik jest widoczny po stronie serwera jako sciezka\plik, tzn. nazwą pliku jest sama ścieżka. Jak się tego pozbyć ?

0

Tego zdania

Generowany plik jest widoczny po stronie serwera jako sciezka\plik, tzn. nazwą pliku jest sama ścieżka.
zupełnie nie rozumiem.

0

Przykładowo serwer widzi plik jako /IN/D:\OUTPUT\test.txt zamiast /IN/test.txt

Serwer jest uniksowy

0

Problem rozwiązany :)
Wystarczyło zamiast:

String FileName = "Z:\\OUTPUTtest\\" + GetFileName().replace(".OUT",".txt");
client.storeFile("/2W/IN/" + FileName, fis);

dać

client.storeFile("/2W/IN/" + GetFileName().replace(".OUT",".txt"), fis);
0

Już po samych importach widać, że klasa robi wszystko. Ja tu widzę kilka rzeczy które powinieneś poprawić:

  • Rozbić funkcjonalności na poszczególne klasy- jedna klasa jedna odpowiedzialność
  • Nie używać metod statycznych
  • Nazwy metod z małych liter
  • Metody nie powinny rzucać wszystkich wyjątków jakie istnieją
  • Staraj się nie używać ścieżek bezwzględnych w aplikacji, na innym komputerze nie będzie działać
  • Na samym dole masz serię dziwnych wywołań metody substring, pozbądź się tego
  • Korzystaj z typów generycznych:
    Użyj:
List<String> deliveryLines = new ArrayList<>();

zamiast

ArrayList DeliveryLines = new ArrayList();

lub najlepiej korzystając z Google Guava:

List<String> deliveryLines = Lists.newArrayList();
  • Ogólnie weź się za refactoring, ponieważ aplikacja jest całkiem rozbudowana, ale napisana co najmniej "strasznie" :)
0
bakeraw2 napisał(a):

Już po samych importach widać, że klasa robi wszystko. Ja tu widzę kilka rzeczy które powinieneś poprawić:

  • Rozbić funkcjonalności na poszczególne klasy- jedna klasa jedna odpowiedzialność
  • Nie używać metod statycznych
  • Nazwy metod z małych liter
  • Metody nie powinny rzucać wszystkich wyjątków jakie istnieją
  • Staraj się nie używać ścieżek bezwzględnych w aplikacji, na innym komputerze nie będzie działać
  • Na samym dole masz serię dziwnych wywołań metody substring, pozbądź się tego
  • Korzystaj z typów generycznych:
    Użyj:
List<String> deliveryLines = new ArrayList<>();

zamiast

ArrayList DeliveryLines = new ArrayList();

lub najlepiej korzystając z Google Guava:

List<String> deliveryLines = Lists.newArrayList();
  • Ogólnie weź się za refactoring, ponieważ aplikacja jest całkiem rozbudowana, ale napisana co najmniej "strasznie" :)

Ad.1 Dam radę ;)
Ad.2 W takim razie co proponujesz ?
Ad.3 Jakie to ma znaczenie ?
Ad.4 Nie bardzo rozumiem dlaczego ??
Ad.5 Niestety wiem. Jakaś podpowiedź jak użyć ścieżki względnej ??
Ad.6 Z tym może być problem, gdyż to cały sens działania programu ;) chyba że coś innego miałeś na myśli a ja źle zrozumiałem :/
Ad.7 Jakiś przykład w nawiązaniu do aktualnego kodu, bo chyba nie bardzo rozumiem :(
Ad.8 Użyj..... tutaj akurat nie będzie to konieczne, gdyż ta część programu "wyleciała" ;)
Ad.9 Tak wiem ;) Każdy ma swoje zdanie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1