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

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

Δημοσ.

Έχω την εξής εκφώνηση σε άσκηση της java:

 

Να γραφεί μια κλάση με όνομα Criophore και δημόσιο προσδιοριστή.
Η κλάση Criophore πρέπει να περιέχει δύο δημόσιες, στατικές μεθόδους
mMetaplasm και mOverskim.
Η πρώτη μέθοδος mMetaplasm θα πρέπει να δέχεται ως όρισμα μια
συμβολοσειρά (String). Η συμβολοσειρά αυτή θα περιέχει το όνομα
του αρχείου που πρέπει να δημιουργηθεί.
Προσοχή: Για το νέο αρχείο θα πρέπει να ορίσετε και το μονοπάτι
στο οποίο θα βρίσκεται (δηλ. στο φάκελο με τις απαντήσεις σας).
Το αρχείο  αυτό θα πρέπει να έχει τα εξής χαρακτηριστικά:
 
- Μέγεθος: 1229 bytes
- Λίστα επιτρεπόμενων bytes:
byte[] aWaxworker = {97, 98, 99, 100, 101, 102, 103}.
Η λίστα των επιτρεπόμενων bytes θα πρέπει να οριστεί ως στατικό
δημόσιο χαρακτηριστικό της κλάσης Criophore με όνομα aWaxworker.
Τα δεδομένα του αρχείου πρέπει να είναι τυχαία και να ακολουθούν
ομοιόμορφη κατανομή. (Όλα τα bytes να έχουν περίπου τον ίδιο αριθμό
εμφάνισης).
Η μέθοδος mMetaplasm θα πρέπει να επιστρέφει μια μεταβλητή τύπου
long που θα περιέχει το άθροισμα των τιμών των 500 πρώτων bytes.
 
Η δεύτερη μέθοδος mOverskim θα πρέπει να δέχεται ως όρισμα μία
συμβολοσειρά (String) η οποία θα περιέχει το όνομα ενός αρχείου.
Το αρχείο θα διαβάζεται στην μνήμη (ορίστε και το μονοπάτι όπως
παραπάνω) και θα καταγράφονται για αυτό οι παρακάτω μετρικές:
 
- Μέγεθος
- Αριθμός εμφανίσεων για κάθε byte που περιλαμβάνεται
 στον πίνακα που ορίστηκε στον πίνακα aWaxworker.
 
Τα δεδομένα θα πρέπει να επιστρέφονται ως πίνακας από ακεραίους
(int) από την mOverskim. Ο πίνακας αυτός στην θέση 1 (π.χ. a[0])
θα έχει το μεγεθος του αρχείου και στις υπόλοιπες των αριθμό εμφανίσεων
για κάθε byte (π.χ. στην θέση 2 τον αριθμό εμφανίσεων του πρώτου
byte κ.ο.κ.).
 
Συμβουλή: εξετάστε τις προδιαγραφές των κλάσεων java.io.DataInputStream,
java.io.FileInputStream java.io.FileOutputStream και java.io.DataOutputStream
 
 
 
και  ο κώδικας που έχω γράψει είναι ο εξής:
 
import java.util.Random;
import java.io.File;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
 
public class Criophore {
 
public static byte[] aWaxworker =
{97, 98, 99, 100, 101, 102, 103};
 
public static long mMetaplasm(String fileName) {
String path = "C:\\Users\\............................" + fileName;
File f = new File(path);
long size = f.length();
size = 1229;
BufferedOutputStream out = null;
try {
   out = new BufferedOutputStream(new FileOutputStream(f));
} catch (FileNotFoundException e) {
System.err.println("Unable to open file " + fileName);
}
long sum = 0;
try {
for (int i = 0; i < size; i++) {
int rand = new Random().nextInt(aWaxworker.length);
out.write(aWaxworker[rand]);
if (i < 500) {
sum += aWaxworker[rand];
}
}
out.close();
} catch (Exception e) {
System.err.println("Unable to open file " + fileName);
}
return sum;
}
 
public static int[] mOverskim(String fileName) {
String path = "C:\\Users\\................" + fileName;
BufferedInputStream in = null;
try {
   in = new BufferedInputStream(new FileInputStream(path));
} catch (FileNotFoundException e) {
   System.err.println("Unable to open file ");
        }
        int[] freq = new int[15];
       /* for (int i = 0; i < freq.length; i++) {
freq = 0;
}*/
        try {
            int b;
            while ((b = in.read()) != -1) {
                for (int i = 1; i < 15; i++) {
                if (b == aWaxworker[i - 1]) {
freq++;
}
}
}
freq[0] = 1475;
            in.close();
        } catch (Exception e) {
            System.err.println("Error reading byte ");
        }
        return freq;
}
}
 
 
 
Έχω κάνει πάρα πολλές αλλαγές αλλά συνέχεια μου βγάζει το μήνυμα ότι  "Δεν δημιουργήθηκε σωστά το αρχείο στην μέθοδο mMetaplasm (λάθος μέγεθος, έπρεπε να είναι 1229 bytes)"
 
 
Μήπως έχει κανείς κάποια ιδέα τι μπορεί να έχω κανει λάθος:
 
 
Ευχαριστώ εκ των προτέρων.

 

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

Τι java version χρησιμοποιείς?

Δεν είναι σωστός ο τρόπος που φτιάχνεις το αρχείο με τα bytes που θέλεις μάλλον

 

Φτιάξε ένα RandomAccessFile και κάλεσε την setLength(), το έγραψα αν και δεν το έχω ξανακάνει ποτέ μπορείς να το δοκιμάσεις

/**
			 * Διαβάζει ένα αρχείο σύμφωνα με συγκεκριμένο μέγεθος.
			 * 
			 * @param filename
			 * 		  Το όνομα του αρχείου
			 * @param sizeInBytes
			 * 	      Το μέγεθος του αρχείου
			 * 
			 * @throws FileNotFoundException
			 * @throws IOException
                         * @author tsofras
			 */
			private void readFile(String filename, int sizeInBytes) throws FileNotFoundException, IOException {
				File file = new File(filename);
				byte[] sizeByte = new byte[sizeInBytes];
				ByteBuffer byteBuffer = ByteBuffer.wrap(sizeByte);
				long size = byteBuffer.getLong();
				RandomAccessFile f = new RandomAccessFile(file, "w"); 
				f.setLength(size);
			}

Άλλος τρόπος είναι να περάσεις τα bytes στον InputStream , περίεργη άσκηση πάντως :S

Επεξ/σία από tsofras
  • 2 χρόνια αργότερα...
Δημοσ.
Στις 7/12/2016 στις 10:02 ΠΜ, MSS1 είπε

Έχω την εξής εκφώνηση σε άσκηση της java:

 

Να γραφεί μια κλάση με όνομα Criophore και δημόσιο προσδιοριστή.
Η κλάση Criophore πρέπει να περιέχει δύο δημόσιες, στατικές μεθόδους
mMetaplasm και mOverskim.
Η πρώτη μέθοδος mMetaplasm θα πρέπει να δέχεται ως όρισμα μια
συμβολοσειρά (String). Η συμβολοσειρά αυτή θα περιέχει το όνομα
του αρχείου που πρέπει να δημιουργηθεί.
Προσοχή: Για το νέο αρχείο θα πρέπει να ορίσετε και το μονοπάτι
στο οποίο θα βρίσκεται (δηλ. στο φάκελο με τις απαντήσεις σας).
Το αρχείο  αυτό θα πρέπει να έχει τα εξής χαρακτηριστικά:
 
- Μέγεθος: 1229 bytes
- Λίστα επιτρεπόμενων bytes:
byte[] aWaxworker = {97, 98, 99, 100, 101, 102, 103}.
Η λίστα των επιτρεπόμενων bytes θα πρέπει να οριστεί ως στατικό
δημόσιο χαρακτηριστικό της κλάσης Criophore με όνομα aWaxworker.
Τα δεδομένα του αρχείου πρέπει να είναι τυχαία και να ακολουθούν
ομοιόμορφη κατανομή. (Όλα τα bytes να έχουν περίπου τον ίδιο αριθμό
εμφάνισης).
Η μέθοδος mMetaplasm θα πρέπει να επιστρέφει μια μεταβλητή τύπου
long που θα περιέχει το άθροισμα των τιμών των 500 πρώτων bytes.
 
Η δεύτερη μέθοδος mOverskim θα πρέπει να δέχεται ως όρισμα μία
συμβολοσειρά (String) η οποία θα περιέχει το όνομα ενός αρχείου.
Το αρχείο θα διαβάζεται στην μνήμη (ορίστε και το μονοπάτι όπως
παραπάνω) και θα καταγράφονται για αυτό οι παρακάτω μετρικές:
 
- Μέγεθος
- Αριθμός εμφανίσεων για κάθε byte που περιλαμβάνεται
 στον πίνακα που ορίστηκε στον πίνακα aWaxworker.
 
Τα δεδομένα θα πρέπει να επιστρέφονται ως πίνακας από ακεραίους
(int) από την mOverskim. Ο πίνακας αυτός στην θέση 1 (π.χ. a[0])
θα έχει το μεγεθος του αρχείου και στις υπόλοιπες των αριθμό εμφανίσεων
για κάθε byte (π.χ. στην θέση 2 τον αριθμό εμφανίσεων του πρώτου
byte κ.ο.κ.).
 
Συμβουλή: εξετάστε τις προδιαγραφές των κλάσεων java.io.DataInputStream,
java.io.FileInputStream java.io.FileOutputStream και java.io.DataOutputStream
 
 
 
και  ο κώδικας που έχω γράψει είναι ο εξής:
 
import java.util.Random;
import java.io.File;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
 
public class Criophore {
 
public static byte[] aWaxworker =
{97, 98, 99, 100, 101, 102, 103};
 
public static long mMetaplasm(String fileName) {
String path = "C:\\Users\\............................" + fileName;
File f = new File(path);
long size = f.length();
size = 1229;
BufferedOutputStream out = null;
try {
   out = new BufferedOutputStream(new FileOutputStream(f));
} catch (FileNotFoundException e) {
System.err.println("Unable to open file " + fileName);
}
long sum = 0;
try {
for (int i = 0; i < size; i++) {
int rand = new Random().nextInt(aWaxworker.length);
out.write(aWaxworker[rand]);
if (i < 500) {
sum += aWaxworker[rand];
}
}
out.close();
} catch (Exception e) {
System.err.println("Unable to open file " + fileName);
}
return sum;
}
 
public static int[] mOverskim(String fileName) {
String path = "C:\\Users\\................" + fileName;
BufferedInputStream in = null;
try {
   in = new BufferedInputStream(new FileInputStream(path));
} catch (FileNotFoundException e) {
   System.err.println("Unable to open file ");
        }
        int[] freq = new int[15];
       /* for (int i = 0; i < freq.length; i++) {
freq = 0;
}*/
        try {
            int b;
            while ((b = in.read()) != -1) {
                for (int i = 1; i < 15; i++) {
                if (b == aWaxworker[i - 1]) {
freq++;
}
}
}
freq[0] = 1475;
            in.close();
        } catch (Exception e) {
            System.err.println("Error reading byte ");
        }
        return freq;
}
}
 
 
 
Έχω κάνει πάρα πολλές αλλαγές αλλά συνέχεια μου βγάζει το μήνυμα ότι  "Δεν δημιουργήθηκε σωστά το αρχείο στην μέθοδο mMetaplasm (λάθος μέγεθος, έπρεπε να είναι 1229 bytes)"
 
 
Μήπως έχει κανείς κάποια ιδέα τι μπορεί να έχω κανει λάθος:
 
 
Ευχαριστώ εκ των προτέρων.

 Τελικά βρήκες το σωστό προγράμμα γιατί αντιμετωπίζω το ίδιο πρόβλημα; 

Ευχαριστώ 

 

Δημοσ.
Αναφορά σε κείμενο

δημόσιο προσδιοριστή,να περιέχει δύο δημόσιες,συμβολοσειρά 

καπου πονεσαν τα ματια μας... Τα αγγλικα δεν ειναι απο hype και απο ψωνιο στον κλαδο αυτο,αλλα με αυτα τα keywords μπορεις να ψαχνεις στο internet.

και αυτο πρεπει να το περνανε απο την σχολη...

 

  • Like 1
Δημοσ.
    public static int[] mOverskim(String fileName) {
        String path = fileName;
        
        int[] freq = new int[aWaxworker.length + 1];
        try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(path))) {
            
            int character = in.read();
            while(character != -1) {
                freq[0]++;
                
                freq[character-96]++;
                b = in.read();
            }
            
        } catch (Exception e) {
            System.err.println("error");
        }
        
        return freq;
    }

Αυτός είναι ένας τρόπος να το πετύχεις.

Ο πινακας freq έχει την συχνότητα εμφανισης για καθε χαρακτήρα (εκτός απο την πρωτη θεση freq[0] που περιεχει το συνολο)
freq[1] αντιστοιχή στο aWaxworker[0] δηλαδή στο 97
freq[2] αντιστοιχή στο aWaxworker[1] δηλαδή στο 98 και παει λεγοντας
Εκμεταλευόμενος οτι ο aWaxworker είναι παντα ο ιδιος και περιεχει αυξανομενους αριθμούς σε σειρα μπορείς να πεις freq[character-96]++; αντι για να ψαχνεις την αντιστοιχία freq -> aWaxworker
Γιατί o μικρότερος χαρακτηρας σου ειναι το 97 και ο μεγαλύτερος το 103 άρα
97 - 96 = 1 δηλαδή στη θέση 1 (freq[1]) έχεις τη συχνότητα του 97
και 103 - 96 = 7 δηλαδή στη θέση 7 (freq[7]) έχεις τη συχνότητα του 103

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

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

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

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

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

Σύνδεση

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

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