Zastanawia minie dlaczego te dwa kody działają w różny sposób:
- to jest działanie pożadane (tak chciałem żeby zadziałało):
- ... a takie działanie mnie zaskoczyło:
... czy ma to coś wspólnego z opakowywaniem / automatycznym rzutowaniem?
Zastanawia minie dlaczego te dwa kody działają w różny sposób:
... czy ma to coś wspólnego z opakowywaniem / automatycznym rzutowaniem?
Nie wiem co cie zaskoczyło ale nowa linia to nie 13 a 10.
OK, dziękuję ... zonk!!! numer 1
a teraz zonk!!! numer 2 >>> ... a dlaczego nie wyświetlają się znaki?
tak wygląda plik źródłowy:
Ale jakie znaki?
Jakbyś pokazał cały kod, najlepiej go wkleił a nie robił screeny. Pokazał to co masz na wejściu, bo to jakiś plik chyba, napisał co chcesz na wyjściu to może i dałoby się coś odpowiedzieć. Na teraz to ci doradzę odpalić debugger.
Tak działa jak na pierwszym screen'ie:
import java.io.*;
public class FileReadExample {
public static void main(String[] args) throws IOException{
FileInputStream fileInput = null;
FileOutputStream fileOutput = null;
int buff;
fileInput = new FileInputStream("C:\\Users\\tkar\\IdeaProjects\\" +
"KompendiumJavaExamples\\out\\production\\KompendiumJavaExamples\\TestIn.txt");
fileOutput = new FileOutputStream("C:\\Users\\tkar\\IdeaProjects\\" +
"KompendiumJavaExamples\\out\\production\\KompendiumJavaExamples\\TestOut.txt");
do {
buff = fileInput.read();
if(buff == 13) System.out.print("[ENTER]") ;
System.out.print((char)buff);
//if(buff == '\n') System.out.print("[ENTER]") ;
fileOutput.write(buff);
} while(buff != -1);
fileInput.close();
fileOutput.close();
}
}
Tak działa jak na 2 screen'ie:
import java.io.*;
public class FileReadExample {
public static void main(String[] args) throws IOException{
FileInputStream fileInput = null;
FileOutputStream fileOutput = null;
int buff;
fileInput = new FileInputStream("C:\\Users\\tkar\\IdeaProjects\\" +
"KompendiumJavaExamples\\out\\production\\KompendiumJavaExamples\\TestIn.txt");
fileOutput = new FileOutputStream("C:\\Users\\tkar\\IdeaProjects\\" +
"KompendiumJavaExamples\\out\\production\\KompendiumJavaExamples\\TestOut.txt");
do {
buff = fileInput.read();
if(buff == '\n') System.out.print("[ENTER]") ;
System.out.print((char)buff);
//if(buff == '\n') System.out.print("[ENTER]") ;
fileOutput.write(buff);
} while(buff != -1);
fileInput.close();
fileOutput.close();
}
}
Obydwa kody różnią się linią:
if(buff == 13) System.out.print("[ENTER]") ;
if(buff == '\n') System.out.print("[ENTER]") ;
plik tekstowy źródłowy:
saasdasd
saadsdasd
asdasd
asdasd
asdasd
123
Nowa linia na windowsie (więc w notepad.exe) to \r\n
a nie samo \n
. Samo \n
to tzw newline linuxowy, a samo \r
to newline MacOS.
To takie troche antyczne zaszłości z czasów DOSowych terminali. \n
to znak nowej linii, a \r
to carrige-return
czyli powrót karetki maszynopisu na początek linii...
ok ... czyli 10 i 13 w int.
Dwie rzeczy, po pierwsze \r
jest nie tylko używany do oznaczania końca linii ale również do cofania karetki na początek linii w terminalu.
Przydaje się to czasem do robienia pasków postępu w konsoli, na przykład (na Linuxie):
$ echo -e 'kurwa-mac\rCENZURA'
CENZURAac
(-e oznacza że echo traktuje \r nie jako tekst ale jako escape sequence)
Wbudowany w IJ terminal ma problemy z \r jak napiszesz na przykład
System.out.print("XXXkurwa-macXXX\rCENZURA\n");
System.out.println();
to się wypisze jedynie CENZURA.
Druga sprawa jest taka że jak wstawiasz [ENTER] pomiędzy \r i \n to tak naprawdę psujesz znak końca linii.
Oba te znaki muszą na Windzie występować jeden po drugim.
Na zakończenie pasek postępu wyrzeźbiony od ręki (więc nie piękny):
for i in $(seq 1 10); do seq 1 $i | tr -d '\n' | tr '[0-9]' '='; echo -ne '\r'; sleep 1; done
Odpalać w wind sussys for Linux lub na prawdziwym Linuxie :D
Dziękuję za wniesienie wkładu do moich przemyśleń ...
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.