This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
java:byte_streams_to_data [2020/03/04 11:40] gthanos |
java:byte_streams_to_data [2021/04/04 15:44] (current) |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Μετασχηματισμός των ροών δεδομένων σε τύπους δεδομένων ====== | + | ====== Μετασχηματισμός των ροών δυαδικών δεδομένων σε βασικούς |
| - | Ο προηγούμενος κώδικας δουλεύει εξαιρετικά με ροές από bytes, στην πραγματικότητα όμως τα δεδομένα που θέλουμε να αποθηκεύσουμε ή να διαβάσουμε μπορεί να είναι ακέραιοι, | + | Ο προηγούμενος κώδικας δουλεύει εξαιρετικά με ροές από bytes, στην πραγματικότητα όμως τα δεδομένα που θέλουμε να αποθηκεύσουμε ή να διαβάσουμε μπορεί να είναι ακέραιοι, |
| Για παράδειγμα, | Για παράδειγμα, | ||
| Line 9: | Line 9: | ||
| Η διαδικασία ανάγνωσης είναι ακριβώς η αντίστροφή, | Η διαδικασία ανάγνωσης είναι ακριβώς η αντίστροφή, | ||
| - | - διαβάζουμε από ένα [https:// | + | - διαβάζουμε από ένα |
| - | - Από τον πίνακα αυτό δημιουργούμε ένα [[https:// | + | - από τον πίνακα αυτό δημιουργούμε ένα [[https:// |
| - | - Από το [[https:// | + | - από το [[https:// |
| - | Το παρακάτω πρόγραμμα αποθηκεύει έναν ακέραιο, | + | Το παρακάτω πρόγραμμα καλεί αρχικά τη συνάρτηση '' |
| + | |||
| + | <code java ByteBufferReadWriteTest.java> | ||
| + | import java.nio.*; | ||
| + | import java.io.*; | ||
| + | import java.util.Arrays; | ||
| + | |||
| + | public class ByteBufferReadWriteTest { | ||
| + | |||
| + | /* 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 = " | ||
| + | |||
| + | ByteBuffer buffer = ByteBuffer.allocate(512); | ||
| + | buffer.order(ByteOrder.BIG_ENDIAN); | ||
| + | buffer.putInt(a); | ||
| + | buffer.putDouble(b); | ||
| + | buffer.putChar(c); | ||
| + | buffer.put(str.getBytes(java.nio.charset.StandardCharsets.UTF_8)); | ||
| + | int buffer_size = buffer.position(); | ||
| + | |||
| + | try(FileOutputStream out = new FileOutputStream(file)) { | ||
| + | byte []array = buffer.array(); | ||
| + | array = Arrays.copyOf(array, | ||
| + | out.write(array); | ||
| + | // just for debugging purposes | ||
| + | // | ||
| + | } | ||
| + | catch(IOException ex) { | ||
| + | System.out.println(" | ||
| + | } | ||
| + | } | ||
| + | |||
| + | public static void read(File file) { | ||
| + | int a; | ||
| + | double b; | ||
| + | double c; | ||
| + | |||
| + | byte array[] = new byte[512]; | ||
| + | int read_size; | ||
| + | try(FileInputStream in = new FileInputStream(file)) { | ||
| + | read_size = in.read(array); | ||
| + | array = Arrays.copyOf(array, | ||
| + | } | ||
| + | catch(IOException ex) { | ||
| + | | ||
| + | } | ||
| + | // just for debugging purposes | ||
| + | // | ||
| + | |||
| + | ByteBuffer buffer = ByteBuffer.wrap(array); | ||
| + | buffer.order(ByteOrder.BIG_ENDIAN); | ||
| + | System.out.println(buffer.getInt()); | ||
| + | System.out.println(buffer.getDouble()); | ||
| + | System.out.println("'" | ||
| + | int str_size = buffer.remaining(); | ||
| + | byte[] bytes = new byte[str_size]; | ||
| + | buffer.get(bytes); | ||
| + | System.out.println(new String(bytes, | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <WRAP tip 80% center round> | ||
| + | H //default// υλοποίηση ενός [[https:// | ||
| + | Πληροφορίες για τη διαφορά μεταξύ big-endian και little-endian μπορείτε να βρείτε [[https:// | ||
| + | </ | ||
| + | |||
| + | <WRAP todo 80% center round> | ||
| + | - Αλλάξτε το παραπάνω παράδειγμα, | ||
| + | - Βάλτε σε σχόλια τη στατική μέθοδο '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | ====== DataInputStream & DataOutputStream ====== | ||
| + | |||
| + | Στις περιπτώσεις που τα δεδομένα γνωρίζουμε ότι έχουν αποθηκευτεί κατά 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. | ||
| + | </ | ||
| + | |||
| + | |Προηγούμενο: | ||