Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

Όποιος μπορεί ας βοηθήσει γιατί είμαι για χάπια. Τόσο μικρό πρόβλημα και με ταλαιπωρεί:

Έχω μία μέθοδο, τη readSettings. Η μέθοδος αυτή διαβάζει κάποιες γραμμές από κάποιο αρχείο ως string και τις αποθηκεύει σε arraylist. Αυτά που διαβάζει είναι ένας χαρακτήρας ανά γραμμή, μπορεί να είναι αριθμός, μπορεί και String. Η μετατροπή σε int γίνεται μετά. Ως εδώ όλα καλά.

Το πρόβλημα: το file που περιέχει τις γραμμές για διάβασμα, είναι πιθανό να υπάρχει ήδη αλλά και όχι. Αν δεν υπάρχει, δημιουργώ ένα αρχείο από το μηδέν και προσθέτω μέσα τις τιμές που θέλω, έστω

1,2,3,4,5,6, ανά γραμμή πάντα. Αν υπάρχει όμως το αρχείο ήδη, ελέγχω ότι υπάρχει και προσθέτω ότι λείπει. Πχ αν το αρχείο έχει 1,2,3,4 τότε προσθέτω το 5,6.

Το πρόβλημα είναι ότι αργότερα που θα χρειαστεί να διαβάσω το αρχείο, στην πρώτη περίπτωση η readSettings διαβάζει κανονικά, ενώ στη δεύτερη πετάει NumberFormatException.

Έχω δοκιμάσει τα πάντα, γράψιμο με FileWriter, PrintWriter, BufferWriter, trim στα strings, flush στον writer...Δε βλέπω φως.

Ιδέες;

Δημοσ.

Έλα φαγωθήκατε με τον κώδικα νυχτιάτικα...😁

public ArrayList<String> readPrinterSettings() {
	
	 ArrayList<String> settings = new ArrayList<String>();

	try  (
		BufferedReader br = new BufferedReader(new FileReader("printerSettings.txt"))) {
	    String line;
	    while ((line = br.readLine()) != null) {
	       
	    	settings.add(line);
	    	
	    }
	    
	    
	    
	} catch (FileNotFoundException e1) {
		
		
	} catch (IOException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	}
	
	return settings;

}

Ερώτηση:

Αν το txt πειραχτεί με το χέρι, αυτό τι διαφορές φέρνει στο αρχείο; Γιατί το πειράζω χειροκίνητα με notepad και μετά αρνείται το διάβασμα. Όταν το αρχείο δημιουργείται μέσω κώδικα, δεν έχει πρόβλημα.

 

Δημοσ.

δεν πιστεύω πως υπάρχει θέμα εδώ, σου πετάει exception η συνάρτηση αυτή; σίγουρα; Δεν παίζει ρόλο αν το πειράξεις με κώδικα ή με το χερι. Νομίζω πως το θέμα είναι αλλού, συγκεκριμένα στη μετατροπή σε int. Κάνε ένα debug και τσεκαρε τις τιμές του arraylist πριν τις μετατρέψεις μια μια σε int

Δημοσ. (επεξεργασμένο)
5 ώρες πριν, Lanike71 είπε

Ερώτηση:

Αν το txt πειραχτεί με το χέρι, αυτό τι διαφορές φέρνει στο αρχείο; Γιατί το πειράζω χειροκίνητα με notepad και μετά αρνείται το διάβασμα. Όταν το αρχείο δημιουργείται μέσω κώδικα, δεν έχει πρόβλημα.

Μήπως το edit με το notepad σου δημιουργεί BOM (Byte order mark) στο txt ?

Κάνε μία δοκιμή να κάνεις edit το txt με το notepad++ .

Επεξ/σία από htaccess
Δημοσ. (επεξεργασμένο)
6 ώρες πριν, dim_mnia είπε

δεν πιστεύω πως υπάρχει θέμα εδώ, σου πετάει exception η συνάρτηση αυτή; σίγουρα; Δεν παίζει ρόλο αν το πειράξεις με κώδικα ή με το χερι. Νομίζω πως το θέμα είναι αλλού, συγκεκριμένα στη μετατροπή σε int. Κάνε ένα debug και τσεκαρε τις τιμές του arraylist πριν τις μετατρέψεις μια μια σε int

Δοκίμασα με 

Integer.parseInt(settings.get(0));

και

Integer.parseInt(settings.get(0).trim()); // To πρώτο string του arraylist

 

1 ώρα πριν, htaccess είπε

Μήπως το edit με το notepad σου δημιουργεί BOM (Byte order mark) στο txt ?

Κάνε μία δοκιμή να κάνεις edit το txt με το notepad++ .

Και όμως έτσι είναι...Ευχαριστώ, κάτι που δε συνάντησα ως τώρα.

 

Και λίγες πληροφορίες παραπάνω για να μαθαίνουμε:

https://stackoverflow.com/questions/1835430/byte-order-mark-screws-up-file-reading-in-java

Επεξ/σία από Lanike71
Δημοσ.
2 ώρες πριν, Lanike71 είπε

Δοκίμασα με 


Integer.parseInt(settings.get(0));

και


Integer.parseInt(settings.get(0).trim()); // To πρώτο string του arraylist

Και όμως έτσι είναι...Ευχαριστώ, κάτι που δε συνάντησα ως τώρα.

Και λίγες πληροφορίες παραπάνω για να μαθαίνουμε:

https://stackoverflow.com/questions/1835430/byte-order-mark-screws-up-file-reading-in-java

α, είμαι τόσο συνηθισμένος με notepad++ που νόμιζα πως δούλευες με αυτό,  δε περίμενα να χρησιμοποιούσες το σκετο notepad των windows. Μπορείς αν θες να κάνεις το πρόγραμμα universal, με τη έννοια να υποστηρίζεις UTF-8 και UTF-8 BOM. Συγκεκριμένα το BOM είναι 3 συγκεκριμένα bytes, αν στην αρχή του αρχείου εντοπίσεις αυτά τα bytes, τότε ξέρεις πως είναι "UTF-8 with BOM" και απλώς αγνόησε τα, αν όχι, τότε μπορεί να γίνει κανονικά η μετατροπή σε int (αλλιώς θα υπάρχει πρόβλημα λόγω BOM, για αυτό σου πέταγε NumberFormatException στη πρώτο πρώτο διάβασμα).

Δημοσ.

Το notepad γενικά το αποφεύγουμε για επεξεργασία, δημιουργεί πρόβλημα από βάσεις δεδομένων μέχρι και σε απλά αρχεία με υπότιτλους ταινιών.

  • Like 1
Δημοσ. (επεξεργασμένο)

Για να μην ανοίγω άλλο θέμα παιδιά:

Γράφω με PrintWriter χαρακτήρες σε αρχείο, με Utf-8. Ενώ στο δικό μου φαίνονται και εκτυπώνονται σωστά, σε υπολογιστές άλλων (όχι όλων), φαίνονται αλλιώς.

Πχ ο χαρακτήρας ● που είναι ο U+25CF, αποθηκεύεται σωστά στο δικό μου υπολογιστή, σε άλλους όμως φαίνεται εντελώς διαφορετικό, "β--".

Καμία ιδέα; Ακόμα και αν χρειάζεται διόρθωση ο τρόπος γραψίματος αρχείου στη java.

Επεξ/σία από Lanike71
Δημοσ.

1) κώδικα για να δούμε ότι όντως ορίζεις το encoding

2) Αν το παραπάνω είναι σωστό είσαι σίγουρος ότι ο άλλος που ανοίγει το αρχείο έχει ορίσει utf8 ?

Δημοσ.
7 λεπτά πριν, tsofras είπε

1) κώδικα για να δούμε ότι όντως ορίζεις το encoding

2) Αν το παραπάνω είναι σωστό είσαι σίγουρος ότι ο άλλος που ανοίγει το αρχείο έχει ορίσει utf8 ?

writer = new PrintWriter("printerSettings.txt", "UTF-8");

Τι εννοείς "να ορίσει utf8" ; Χρησιμοποιούμε το ίδιο πρόγραμμα, που διαβάζει, επιλέγει και σώζει χαρακτήρες για εκτύπωση.

Ενώ το ίδιο πρόγραμμα σε αυτόν διαβάζει και εμφανίζει σωστά τους χαρακτήρες, όταν σώζει, σώζονται με άλλη μορφή όπως προείπα.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...