πρόβλημα με new line σε OutputStreamWriter

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

πρόβλημα με new line σε OutputStreamWriter

Post by Zifnab » Fri Dec 07, 2007 10:11 pm

Όταν βάζω newline /n μέσα στο write της συγκεκριμένης class απλά δεν με υπακούει και το παρακάμπτει...Με άλλα λόγια δεν βρίσκω τρόπο να αλλάξω γραμμή.Παρακαλώ μην μου προτείνετε να αλλάξω class γιατί πολύ απλά η απορία μου είναι γιατί συμβαίνει με την συγκεκριμένη.

Code: Select all

import java.io.*;
import java.util.Date;
public class Main {
    public static void main(String[] args) throws IOException  {

          StringBuffer strbuf=new StringBuffer(10);
          strbuf.append("blabla"); 
          File file = new File("test.txt");
          FileOutputStream fs = new FileOutputStream(file,true); 
          OutputStreamWriter osw = new OutputStreamWriter(fs);
          Date date = new Date();
          osw.append('\n');
          osw.write(strbuf.toString()+date.toString());
          osw.flush();
     }
}
Ότι και να κάνω ακόμα δλδ γράφω append/write ή ακόμα και πολλά /n μαζί
και τπτ. Ή ακόμα και write("33333\n\n\n\n44444"); μου βγάζει 3333344444 κολλητά :???:
StormRider
Gbyte level
Gbyte level
Posts: 1040
Joined: Mon Dec 18, 2006 5:34 pm
Gender:

Post by StormRider » Fri Dec 07, 2007 10:57 pm

Code: Select all

String lineSep = System.getProperty("line.separator"); 
Μου φαίνεται με αυτό θα κάνεις τη δουλειά σου.
Απλά πρόσθεσε το lineSep εκεί που θες.
Image
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Sat Dec 08, 2007 1:05 am

wow Δούλεψε thnx :-D ! Αν ήξερες να μου πεις τί τον χάλαγε το \n σαν string ή σαν χαρακτήρα θα σου ήμουν ευγνώμων...
User avatar
sandra
Wow! Terabyte level
Wow! Terabyte level
Posts: 4917
Joined: Mon Oct 02, 2006 11:37 am
Academic status: Alumnus/a
Gender:
Location: στη φωλιά μου κοιτώντας ένα χωράφι με στάρι...

Post by sandra » Sat Dec 08, 2007 1:20 am

κ.συντονιστά το είχαμε ξανασυναντήσει εδώ το πρόβλημα. Κάτι με τα windows παίζει...
Από εδώ κι εμπρός θα είσαι για πάντα υπεύθυνος για εκείνο που έχεις ημερώσει.
Είσαι υπεύθυνος για το τριαντάφυλλο σου...
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Sat Dec 08, 2007 1:28 am

'εδώ' που ακριβώς ?! :shock: βασικά πρέπει εσωτερικά να κάνει αναπροσαρμογή του string και να πετάει τα newline ....
Δεν ξέρω...
StormRider
Gbyte level
Gbyte level
Posts: 1040
Joined: Mon Dec 18, 2006 5:34 pm
Gender:

Post by StormRider » Sat Dec 08, 2007 1:39 am

:-) Δεν παίζει κάτι περίεργο με τα Windows... απλά τα windows -in general- για eol(end-of-line) character χρησιμοποιούν τον "\r\n" character, το Unix "\n" και το Mac τον "\r"...

Αυτό που κάνει η System.getProperty("line.separator"); είναι να "ζητήσει" από το OS να επιστρέψει ποιον χαρακτήρα χρησιμοποιεί για αλλαγή γραμμής!

Παρατήρησε όμως κάποια περίεργα points:
-Αν γράψεις \n και το ανοίξεις με WordPad or Textpad θα το δεις όπως το περιμένεις το output.
-Aν τρέξεις το πρόγραμμα στα Windows και στείλεις το output σε ένα unix σύστημα τότε ενδέχεται να δείς ξεκάρφωτα "\r" στο output σου

Γενικά διαλέγεις και παίρνεις! Δεν είναι πανάκεια ο line.separator... δεν πρέπει να υπάρχει κάτι που να καλύπτει όλες τις περιπτώσεις...

Όταν βέβαια χρησιμοποιείς το System.out.println(); και βάζεις ειδικούς χαρακτήρες, εκεί φροντίζει η Java για εσένα να βρεί τον eol char για το σύστημα στο οποίο τρέχει το πρόγραμμά σου.

edit: Όταν το είχα πρωτοχρησιμοποιήσει μου το χε πεί η sandra σε κάποιες από εκείνες τις σελίδες του "Προγραμματισμός με Java", σε κάποια από τις προηγούμενες σελίδες από το λινκ που έδωσε πρέπει να είναι
Last edited by StormRider on Sat Dec 08, 2007 1:43 am, edited 2 times in total.
Image
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Sat Dec 08, 2007 1:42 am

χμ ενδιαφέρον ! thnx StormRider και πάλ ι ;) Αν και θα προτιμούσα η java είτε να μην κάνει τίποτα δλδ να μην μετατρέπει τα \n σε \r ή \r\n είτε να το κάνει παντού δλδ και στο OutputStreamWriter....Πως φαίνεται ότι η java έχει φτιαχτεί από χιλιάδες διαφορετικούς προγραμματιστές :lol: :lol:
StormRider
Gbyte level
Gbyte level
Posts: 1040
Joined: Mon Dec 18, 2006 5:34 pm
Gender:

Post by StormRider » Sat Dec 08, 2007 1:45 am

Προφανώς ναι... μάλλον όχι προφανώς, δεν ξέρω ακριβώς την υλοποίηση, αλλά πρέπει να κάνει υπερφόρτωση των ειδικών χαρακτήρων... δλδ το \n να το παίρνει μέσω της .getProperty("line.separator");
Last edited by StormRider on Sat Dec 08, 2007 1:49 am, edited 1 time in total.
Image
User avatar
cactus
Mbyte level
Mbyte level
Posts: 959
Joined: Tue Apr 25, 2006 7:14 pm
Academic status: N>4
Gender:

Post by cactus » Sat Dec 08, 2007 1:46 am

Εμέ μου δούλεψε μια χαρά αυτό που έγραψε ο Zifnab στο 1ο ποστ...μου άλαξε και γραμμη, και για να είμαι σίγουρος έβαλα πολύ πράμα, δεν βλέπω πρόβλημα.

anyway, η sun προτείνει:
For top efficiency, consider wrapping an OutputStreamWriter within a BufferedWriter so as to avoid frequent converter invocations. For example:

Writer out
= new BufferedWriter(new OutputStreamWriter(System.out));
edit
windows τρέχω
laikedelic !
StormRider
Gbyte level
Gbyte level
Posts: 1040
Joined: Mon Dec 18, 2006 5:34 pm
Gender:

Post by StormRider » Sat Dec 08, 2007 1:55 am

@cactus: εχεις vista? λες να άλλαξαν τους eol chars? :) αν είχα θα δοκίμαζα... πάντως κατα κύριο λόγο ισχύει Win:"\r\n", Unix "\n" , Mac: "\r" (το χα ψάξει τότε που το χα πρωτοσυναντήσει)

Ας το δοκιμάσει κάποιος στο dia ή σε linux(αν και δεν ξέρω κατά πόσο το έχει κληρονονομήσει από τo unix)
Image
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Sat Dec 08, 2007 1:56 am

εγώ σε vista τρέχω σε NetBeans ide 6.0 συγκεκριμένα.... To vm της java μήπως άλλαξε?! μπα... :???:
User avatar
cactus
Mbyte level
Mbyte level
Posts: 959
Joined: Tue Apr 25, 2006 7:14 pm
Academic status: N>4
Gender:

Post by cactus » Sat Dec 08, 2007 1:58 am

StormRider wrote:@cactus: εχεις vista?
xp έχω.

Αλλά όσα προγράμματα έχω γράψει πάντα \n χρησιμοποιώ και ποτέ δεν είχα πρόβλημα.
Τέλος πάντων συμβαίνουν και περίεργα φαίνεται.
laikedelic !
StormRider
Gbyte level
Gbyte level
Posts: 1040
Joined: Mon Dec 18, 2006 5:34 pm
Gender:

Post by StormRider » Sat Dec 08, 2007 2:03 am

Είναι τόσο περίεργο όμως...
Και εγώ xp sp2, με Eclipse και jre1.6.0_01...
Σίγουρα το ανοίγεις με notepad ή χρησιμοποιείς κανα ultraedit or notepad++ ??
Image
User avatar
cactus
Mbyte level
Mbyte level
Posts: 959
Joined: Tue Apr 25, 2006 7:14 pm
Academic status: N>4
Gender:

Post by cactus » Sat Dec 08, 2007 2:10 am

@StormRider
Μισό, τι εννοείς δεν βλέπεις αλλαγή γραμμή;
εννοείς ότι στο notepadδεν σου άλλαξε γραμμή ή ότι δεν βλέπεις αυτό το όρθιοπαραλληλόγραμμο μετά τη λέξη σου.
Η java χρησιμοποιεί unicode(τι άθλια που το έθεσα, δεν ξέρω να το πω καλύτερα), δεν θα αλλάξει γραμμή στο notepad αλλά θα δεις ένα όρθιο παραληλόγραμμο ακριβώς μετά το γράμμα που έβαλες το '\n'. Και \r να βάλω πάλι τα ίδια.

Αν το βλέπεις όλα οκ. Αν όχι τότε έιναι περίεργο.
laikedelic !
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Sat Dec 08, 2007 2:28 am

Λοιπόν μισό γιατι υπάρχουν δύο πράγματα εδώ. Άλλο τι γράφεις και άλλο τι βλέπεις και νομίζεις ότι έγραψες. Γράφεις \nblabla στο file αυτό είναι δεδομένο*. Το θέμα είναι πως πας να δεις εάν το έχεις γράψει όντως αυτό; Με κάποιον text editor (πχ notepad); Εάν ναι τότε το Notepad, αλλά και όλοι οι windows based text editors, για να αλλάξουν γραμμή περιμένουν το \r\n και όχι το \n μόνο του (προφανώς και δεν το βλέπεις γιατί ο χαρακτήρας \n δεν είναι printable). Αυτό δεν σημαίνει ότι δεν είναι εκεί. Εάν πάρεις το file.txt και το πας σε ένα unix based σύστημα και το δεις εκεί με έναν editor θα δεις ότι θα αλλάξει κανονικά line.

*:
Δοκίμασε αυτό:

Code: Select all

import java.io.*;
import java.util.Date;
public class Main {
    public static void main(String[] args) throws IOException  {

          StringBuffer strbuf=new StringBuffer(10);
          strbuf.append("blabla");
          File file = new File("test.txt");
          FileOutputStream fs = new FileOutputStream(file,true);
          OutputStreamWriter osw = new OutputStreamWriter(fs);
          Date date = new Date();
          osw.append('\n');
          osw.write(strbuf.toString());
          osw.flush();
     }
}
αν και εσύ μπορεί να βλέπεις blabla μέσα σε ένα file, δες το μέγεθος του. Πρέπει να είναι 7 bytes. Εάν ναι τότε έχει γραφτεί μέσα το: \nblabla άσχετα εάν εσύ δεν το βλέπεις.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
StormRider
Gbyte level
Gbyte level
Posts: 1040
Joined: Mon Dec 18, 2006 5:34 pm
Gender:

Post by StormRider » Sat Dec 08, 2007 2:37 am

Εννοώ ότι δεν αλλάζει γραμμή...
Ναι, βγάζει το σηματάκι του παραλληλογραμου (εκεί που βάζω το \n) αλλά δεν αλλάζει γραμμή...
Αντικατέστησα το "\n" με το "\r\n" και όντως αλλάζει γραμμή!... άρα τα win έχουν end-of-line char τον "\r\n", αντιστοιχεί δλδ στο CR-LF combination.

@Microsoft: δώστε μας τον source code να δούμε τί παίζει!!! :Ρ

Edit: nice HdkiLLeR!
Image
User avatar
elsupreme
Gbyte level
Gbyte level
Posts: 1573
Joined: Mon Nov 21, 2005 10:16 pm
Academic status: N>4
Gender:

Post by elsupreme » Sat Dec 08, 2007 4:08 am

HdKiller, σου ξέφυγε το Date :-p
"Must float like lotus on river... and kill old lady!"
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Sat Dec 08, 2007 10:43 am

Hd ευχαριστώ για το explanation. Κάτι αντίστοιχο τελευταίο. Στο cmd ή τέλος πάντων στην embedded console του NetBeans αλλάζει με το \n ή απλά γίνεται μετατροπή όπως λέγαμε πιο πρίν?

Επίσης το λειτουργικό είναι εκείνο που όταν δώσω εγώ input Enter θα το μεταφράσει σε \n ή \r ή \r\n για να το γράψει π.χ σε ένα αρχείο?
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Sat Dec 08, 2007 12:58 pm

StormRider wrote: Αντικατέστησα το "\n" με το "\r\n" και όντως αλλάζει γραμμή!... άρα τα win έχουν end-of-line char τον "\r\n", αντιστοιχεί δλδ στο CR-LF combination.
Ναι έτσι είναι, η αλλαγή γραμμής είναι δύο χαρακτήρες στα Windows και δεν μπορείς να κάνεις κάτι γι' αυτό :) :). Υπάρχουν και πολλά utils και σε Linux/Unix αλλά και σε Windows για τις μετατροπές text απο το ένα OS στο άλλο.
Zifnab wrote:Hd ευχαριστώ για το explanation. Κάτι αντίστοιχο τελευταίο. Στο cmd ή τέλος πάντων στην embedded console του NetBeans αλλάζει με το \n ή απλά γίνεται μετατροπή όπως λέγαμε πιο πρίν?

Επίσης το λειτουργικό είναι εκείνο που όταν δώσω εγώ input Enter θα το μεταφράσει σε \n ή \r ή \r\n για να το γράψει π.χ σε ένα αρχείο?
To Netbeans έχει δικό του "console" οπότε φροντίζει να τα τυπώνει σωστά. Τώρα σχετικά με την άλλη σου ερώτηση ναι. To ΟS παίρνει το interrupt απο τον Keyboard Controller και διαβάζει μια τιμή (την τιμή που αντιστοιχεί στο Key που πάτησες) απο έναν buffer του KBC*. Απο εκεί και πέρα μεταφράζει την τιμή αυτή σε ένα χαρακτήρα ή και σε συνδιασμό αυτών.

*: Βασικά είναι λίγο διοαφορετικό κάνει ένα πιο έξυπνο κόλπο για να πιάνει και multiple keys pressed κλπ κλπ. Δεν είναι δηλαδή απλό serial interface..πατάω κουμπί μπαίνει σε μια ουρά και απο την κεφαλή της διαβάζει το OS ανάλογα με τα interrupts που σκάνε.
elsupreme wrote:HdKiller, σου ξέφυγε το Date :-p
Ναι αλλά εάν σκεφτείς ότι καλούμε το JVM με default parameters και το heap size είναι minimum τότε δεν θα το θυμηθεί ο garbage collector σύντομα :-p
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
User avatar
elsupreme
Gbyte level
Gbyte level
Posts: 1573
Joined: Mon Nov 21, 2005 10:16 pm
Academic status: N>4
Gender:

Post by elsupreme » Sun Dec 09, 2007 4:01 am

Σόρρυ που θα πάει μακριά αυτό - εννοούσα ότι ξέχασες :

Code: Select all

osw.write(strbuf.toString()+date.toString()); 
(Τώρα, αν αυτό που μου απάντησες αναφερόταν στο αμέσως επάνω, η εξήγηση με το garbage collector θέλει παραπάνω εξήγηση φοβάμαι...)
"Must float like lotus on river... and kill old lady!"
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Mon Dec 10, 2007 7:16 pm

elsupreme wrote:Σόρρυ που θα πάει μακριά αυτό - εννοούσα ότι ξέχασες :

Code: Select all

osw.write(strbuf.toString()+date.toString()); 
(Τώρα, αν αυτό που μου απάντησες αναφερόταν στο αμέσως επάνω, η εξήγηση με το garbage collector θέλει παραπάνω εξήγηση φοβάμαι...)
Lol μου αρέσει να το τραβάμε για τέτοια θέματα :)

Αυτό που έλεγα, ή μάλλον υπονοούσα, είναι ότι παρά το γεγονός ότι το ξέχασα να το βάλω στο stream άφησα και την αρχικοποίηση του (Date date = new Date()), οπότε ουσιαστικά θα γίνει ένα allocation το οποίο δεν θα χρησιμοποιηθεί ποτέ (θα δεσμευτεί χώρος στο heap για το object date). Δεν πειράζει όμως γιατί eventually the gc will come to clean the mess :)
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
The Punisher
Venus Former Team Member
Posts: 7561
Joined: Thu Oct 27, 2005 1:43 pm
Academic status: Alumnus/a
Gender:
Location: Boston, MA

Post by The Punisher » Wed Dec 12, 2007 2:01 am

Η συζήτηση περί Garbage Collector μετακινήθηκε εδώ
Post Reply

Return to “Προγραμματισμός”