java:byte_streams_to_data
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java:byte_streams_to_data [2020/03/04 14:52] – gthanos | java:byte_streams_to_data [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Μετασχηματισμός των ροών δεδομένων σε τύπους δεδομένων ====== | + | ====== Μετασχηματισμός των ροών δυαδικών δεδομένων σε βασικούς |
- | Ο προηγούμενος κώδικας δουλεύει εξαιρετικά με ροές από bytes, στην πραγματικότητα όμως τα δεδομένα που θέλουμε να αποθηκεύσουμε ή να διαβάσουμε μπορεί να είναι ακέραιοι, | + | Ο προηγούμενος κώδικας δουλεύει εξαιρετικά με ροές από bytes, στην πραγματικότητα όμως τα δεδομένα που θέλουμε να αποθηκεύσουμε ή να διαβάσουμε μπορεί να είναι ακέραιοι, |
Για παράδειγμα, | Για παράδειγμα, | ||
Line 10: | Line 10: | ||
Η διαδικασία ανάγνωσης είναι ακριβώς η αντίστροφή, | Η διαδικασία ανάγνωσης είναι ακριβώς η αντίστροφή, | ||
- διαβάζουμε από ένα [[https:// | - διαβάζουμε από ένα [[https:// | ||
- | - Από τον πίνακα αυτό δημιουργούμε ένα [[https:// | + | - από τον πίνακα αυτό δημιουργούμε ένα [[https:// |
- | - Από το [[https:// | + | - από το [[https:// |
- | Το παρακάτω πρόγραμμα καλεί αρχικά τη συνάρτηση '' | + | Το παρακάτω πρόγραμμα καλεί αρχικά τη συνάρτηση '' |
- | <code java BufferReadWriteTest.java> | + | <code java ByteBufferReadWriteTest.java> |
import java.nio.*; | import java.nio.*; | ||
import java.io.*; | import java.io.*; | ||
+ | import java.util.Arrays; | ||
public class ByteBufferReadWriteTest { | public class ByteBufferReadWriteTest { | ||
Line 35: | Line 36: | ||
| | ||
public static void main(String []args ) { | public static void main(String []args ) { | ||
- | File file = new File("my.bin" | + | File file = new File("file.bin" |
write(file); | write(file); | ||
read(file); | read(file); | ||
Line 43: | Line 44: | ||
int a = -159954; | int a = -159954; | ||
double b = 125.128953; | double b = 125.128953; | ||
- | char c = 'Θ'; | + | char c = 'θ'; |
String str = " | String str = " | ||
| | ||
- | ByteBuffer buffer = ByteBuffer.allocate(34); | + | ByteBuffer buffer = ByteBuffer.allocate(512); |
+ | buffer.order(ByteOrder.BIG_ENDIAN); | ||
buffer.putInt(a); | buffer.putInt(a); | ||
buffer.putDouble(b); | buffer.putDouble(b); | ||
buffer.putChar(c); | buffer.putChar(c); | ||
buffer.put(str.getBytes(java.nio.charset.StandardCharsets.UTF_8)); | buffer.put(str.getBytes(java.nio.charset.StandardCharsets.UTF_8)); | ||
+ | int buffer_size = buffer.position(); | ||
| | ||
try(FileOutputStream out = new FileOutputStream(file)) { | try(FileOutputStream out = new FileOutputStream(file)) { | ||
byte []array = buffer.array(); | byte []array = buffer.array(); | ||
+ | array = Arrays.copyOf(array, | ||
out.write(array); | out.write(array); | ||
// just for debugging purposes | // just for debugging purposes | ||
- | // print_array(array); | + | // |
} | } | ||
catch(IOException ex) { | catch(IOException ex) { | ||
Line 69: | Line 73: | ||
| | ||
byte array[] = new byte[512]; | byte array[] = new byte[512]; | ||
- | | + | |
try(FileInputStream in = new FileInputStream(file)) { | try(FileInputStream in = new FileInputStream(file)) { | ||
- | in.read(array); | + | |
+ | array = Arrays.copyOf(array, | ||
} | } | ||
catch(IOException ex) { | catch(IOException ex) { | ||
Line 77: | Line 82: | ||
} | } | ||
// just for debugging purposes | // just for debugging purposes | ||
- | // print_array(array); | + | // |
| | ||
ByteBuffer buffer = ByteBuffer.wrap(array); | ByteBuffer buffer = ByteBuffer.wrap(array); | ||
+ | buffer.order(ByteOrder.BIG_ENDIAN); | ||
System.out.println(buffer.getInt()); | System.out.println(buffer.getInt()); | ||
System.out.println(buffer.getDouble()); | System.out.println(buffer.getDouble()); | ||
- | System.out.println(buffer.getChar()); | + | System.out.println("'" |
- | byte [] str = new byte[18]; | + | int str_size = buffer.remaining(); |
- | buffer.get(str); | + | byte[] |
- | System.out.println(new String(str, java.nio.charset.StandardCharsets.UTF_8)); | + | buffer.get(bytes); |
- | | + | System.out.println(new String(bytes, java.nio.charset.StandardCharsets.UTF_8)); |
} | } | ||
} | } | ||
Line 92: | Line 98: | ||
<WRAP tip 80% center round> | <WRAP tip 80% center round> | ||
- | H //default// υλοποίηση ενός [[https:// | + | H //default// υλοποίηση ενός [[https:// |
- | Περισσότερες πληροφορίες για τις διαφορές μεταξύ big-endian και little-endian μπορείτε να βρείτε [[https:// | + | Πληροφορίες για τη διαφορά μεταξύ big-endian και little-endian μπορείτε να βρείτε [[https:// |
</ | </ | ||
<WRAP todo 80% center round> | <WRAP todo 80% center round> | ||
- Αλλάξτε το παραπάνω παράδειγμα, | - Αλλάξτε το παραπάνω παράδειγμα, | ||
- | - Βάλτε σε σχόλια τη στατική μέθοδο '' | + | - Βάλτε σε σχόλια τη στατική μέθοδο '' |
</ | </ | ||
Line 104: | Line 110: | ||
====== DataInputStream & DataOutputStream ====== | ====== DataInputStream & DataOutputStream ====== | ||
- | Στις περιπτώσεις που τα δεδομένα γνωρίζουμε ότι έχουν αποθηκευτεί κατά big-endian εναλλακτικά της χρήσης των παραπάνω κλάσεων μπορούμε να χρησιμοποιήσουμε τις απλούστερες κλάσεις [[DataInputStream|https:// | + | Στις περιπτώσεις που τα δεδομένα γνωρίζουμε ότι έχουν αποθηκευτεί κατά big-endian εναλλακτικά της χρήσης των παραπάνω κλάσεων μπορούμε να χρησιμοποιήσουμε τις απλούστερες κλάσεις [[https:// |
+ | |||
+ | Παρακάτω παρατίθεται το παραπάνω πρόγραμμα αλλαγμένο ώστε να χρησιμοποιεί τα [[https:// | ||
+ | |||
+ | <code java DataInputOutputStreamTest.java> | ||
+ | import java.nio.*; | ||
+ | import java.io.*; | ||
+ | |||
+ | public class DataInputOutputStreamTest { | ||
+ | |||
+ | /* this method is only for debugging. | ||
+ | * Comment out code, where method is called. | ||
+ | */ | ||
+ | public static void print_array(byte[] array) { | ||
+ | int i=0; | ||
+ | for(byte b: array) { | ||
+ | System.out.format(" | ||
+ | if(++i % 2 == 0) | ||
+ | System.out.print(" | ||
+ | } | ||
+ | System.out.println(); | ||
+ | } | ||
+ | |||
+ | public static void main(String []args ) { | ||
+ | File file = new File(" | ||
+ | write(file); | ||
+ | read(file); | ||
+ | } | ||
+ | |||
+ | public static void write(File file) { | ||
+ | int a = -159954; | ||
+ | double b = 125.128953; | ||
+ | char c = ' | ||
+ | String str = " | ||
+ | |||
+ | try(DataOutputStream out = new DataOutputStream(new FileOutputStream(file))) { | ||
+ | out.writeInt(a); | ||
+ | out.writeDouble(b); | ||
+ | out.writeChar(c); | ||
+ | byte [] bytes_str = str.getBytes(java.nio.charset.StandardCharsets.UTF_16); | ||
+ | out.write(bytes_str, | ||
+ | } | ||
+ | catch(IOException ex) { | ||
+ | System.out.println(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public static void read(File file) { | ||
+ | |||
+ | try(DataInputStream in = new DataInputStream(new FileInputStream(file))) { | ||
+ | int a = in.readInt(); | ||
+ | double b = in.readDouble(); | ||
+ | char c = in.readChar(); | ||
+ | byte [] bytes = new byte[512]; | ||
+ | int str_size = in.read(bytes); | ||
+ | |||
+ | System.out.println(a); | ||
+ | System.out.println(b); | ||
+ | System.out.println("'" | ||
+ | System.out.println(new String(bytes, | ||
+ | } | ||
+ | catch(IOException ex) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <WRAP tip 80% center round> | ||
+ | Η κλάσεις [[https:// | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP todo 80% center round> | ||
+ | Παρατηρήστε ότι και στις δύο περιπτώσεις μπορείτε να αλλάξετε την κωδικοποίηση των Strings που αποθηκεύονται μέσα στο stream. Στα παραπάνω παραδείγματα αλλάξτε την κωδικοποίηση σε UTF-8 από UTF-16. | ||
+ | </ | ||
+ | |Προηγούμενο: | ||
java/byte_streams_to_data.1583333573.txt.gz · Last modified: 2020/03/04 14:52 (external edit)