Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it L'avatar di daevy
    Registrato dal
    Apr 2012
    Messaggi
    10

    E' possibile creare un flusso generico di oggetti?

    Salve a tutti, sono nuovo di questo forum. Programmo in java da qualche mesetto e son venuto qua per chiedere un piccolo aiutino :

    codice:
    	ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(path)));
    		Scanner s = new Scanner(System.in);  
    		      
    		for (int i = 0; i<n; i++)
    			oos.writeObject(s.next());
    Queste istruzioni sono contenute nel costruttore della mia classe, quando viene istanziata voglio che riempia iterativamente un file di oggetti. Se si tratta di passare stringhe usando il flusso System.in scrivendo da console funziona...ma se volessi scrivere oggetti qualsiasi passati da un flusso esterno qualsiasi come posso fare? Sarebbe una cosa così:

    codice:
    	ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(path)));
    		Scanner s = new Scanner(/* flusso generico di oggetti*/);  
    		      
    		for (int i = 0; i<n; i++)
    			oos.writeObject(s.next());
    Cioè vorrei fare in modo che lo scanner si metta in attesa e scriva l'oggetto solo quando il flusso viene aggiornato esternamente. Mi è stato detto che posso risolvere con multithreading e ci ho pensato anche io, ma non l'ho mai usato e vorrei evitare di usarlo per ora. Esistono soluzioni semplici per realizzare questo flusso in modo analogo al System.in? Grazie dell'aiuto!
    java java java

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Cerchiamo di fare chiarezza, anche se argomenti di questo tipo, per una persona che programma in Java da qualche mesetto sono un po' ostici e, direi, troppo complessi.

    System.in è un InputStream collegato direttamente allo standard-in del programma (generalmente la tastiera, ma non è detto).

    Scanner è una classe che permette di trattare in maniera "leggermente più ad alto livello" uno stream di byte: fornisce una serie di metodi per poter ottenere dati di tipo diverso a partire da stringhe.

    La parte di codice che hai postato (che io mai e poi mai metterei dentro ad un costruttore), non fa altro che creare un file di dati binario (dati serializzati... e anche qui si aprirebbe un mondo) dove tu vai a serializzare le stringhe che digiti da tasitera.

    Se di ciò che ho detto finora hai capito tutto nel dettaglio, procediamo con le domande.

    Al di là dell'utilità di ciò che stai cercando di fare, che ancora mi sfugge, cos'è che vorresti ottenere? Parli genericamente di "flussi di oggetti"... che vuoi dire? Un flusso di oggetti (un Object-Stream) presuppone che vi sia una sorgente di questi oggetti (un file, una socket, un database, una risorsa, ecc) che permette di "leggere" gli oggetti attraverso un InputStream per poi deserializzarli e/o ri-serializzarli da qualche altra parte... di quali oggetti stiamo parlando? Da dove dovrebbero essere letti (visto che non vuoi leggerli da System.in e che comunque più che stringhe non potresti leggere da lì)? Cosa ne vuoi fare? Ovviamente, dovrai buttare via anche la classe Scanner, visto che non sarebbe più adatta allo scopo...

    Proviamo a delineare questi aspetti, al momento... il multithreading lasciamolo stare che, al momento, è solo una parola senza alcun significato.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di daevy
    Registrato dal
    Apr 2012
    Messaggi
    10
    Originariamente inviato da LeleFT
    Cerchiamo di fare chiarezza, anche se argomenti di questo tipo, per una persona che programma in Java da qualche mesetto sono un po' ostici e, direi, troppo complessi.

    System.in è un InputStream collegato direttamente allo standard-in del programma (generalmente la tastiera, ma non è detto).

    Scanner è una classe che permette di trattare in maniera "leggermente più ad alto livello" uno stream di byte: fornisce una serie di metodi per poter ottenere dati di tipo diverso a partire da stringhe.

    La parte di codice che hai postato (che io mai e poi mai metterei dentro ad un costruttore), non fa altro che creare un file di dati binario (dati serializzati... e anche qui si aprirebbe un mondo) dove tu vai a serializzare le stringhe che digiti da tasitera.

    Se di ciò che ho detto finora hai capito tutto nel dettaglio, procediamo con le domande.

    Al di là dell'utilità di ciò che stai cercando di fare, che ancora mi sfugge, cos'è che vorresti ottenere? Parli genericamente di "flussi di oggetti"... che vuoi dire? Un flusso di oggetti (un Object-Stream) presuppone che vi sia una sorgente di questi oggetti (un file, una socket, un database, una risorsa, ecc) che permette di "leggere" gli oggetti attraverso un InputStream per poi deserializzarli e/o ri-serializzarli da qualche altra parte... di quali oggetti stiamo parlando? Da dove dovrebbero essere letti (visto che non vuoi leggerli da System.in e che comunque più che stringhe non potresti leggere da lì)? Cosa ne vuoi fare? Ovviamente, dovrai buttare via anche la classe Scanner, visto che non sarebbe più adatta allo scopo...

    Proviamo a delineare questi aspetti, al momento... il multithreading lasciamolo stare che, al momento, è solo una parola senza alcun significato.


    Ciao.
    Ciao, grazie della risposta
    Allora, penso di volere una cosa un pò più generica rispetto a ciò che dici tu, io voglio solo predisporre la classe a ricevere questo flusso di oggetti generici che poi andrò a memorizzare in una struttura in maniera dinamica (ovvero : inizia il metodo, apri un flusso di input e memorizza i dati che vengono passati da un flusso di output finchè non chiudo il flusso o termino il metodo in qualche altra maniera ), non necessariamente da un file (quindi la serializzazione possiamo tralasciarla per ora). Questo codice comunque volevo metterlo nel costruttore semplicemente perchè volevo fare una classe unicamente atta a questo scopo, se è una cosa sbagliata posso semplicemente creare un metodo a parte...

    Vorrei qualcosa così insomma:
    codice:
    public void riempiStruttura(FlussoEsterno){        
                       finchè (FlussoEsterno è aperto)          
                           aggiungi alla struttura il prossimo elemento inserito nel flusso;  
    }
    java java java

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ancora non si sa cosa tu intenda per "flusso di oggetti", che può voler dire tante cose... un array di oggetti? Una lista di oggetti? Uno stream di oggetti? Queste sono tre possibili "implementazioni" di un "flusso di oggetti", tutte diverse tra loro... chiaramente non si può generalizzare il concetto di "flusso"... un metodo deve sapere con quali strutture dati deve lavorare perchè con strutture diverse si possono fare determinate cose, mentre altre non le si può fare.

    Supponendo che tu intenda uno Stream di oggetti, potresti avere una buona generalizzazione in questo modo:

    codice:
    public void riempiStruttura(ObjectInputStream ois) {
       Object obj = null;
       while((obj = ois.readObject()) != null) {
          // Finchè ci sono oggetti nello stream...
          ...   // riempi la tua struttura con l'oggetto "obj" letto dallo stream
       }
    }
    Capisci che più che scrivere "pseudo-codice" non si può fare, senza sapere esattamente cosa intendi fare.
    Generalizzare è possibile solo fino ad un certo punto... oltre quel punto si esce dal campo informatico e si entra nell'occulto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di daevy
    Registrato dal
    Apr 2012
    Messaggi
    10
    Originariamente inviato da LeleFT
    Ancora non si sa cosa tu intenda per "flusso di oggetti", che può voler dire tante cose... un array di oggetti? Una lista di oggetti? Uno stream di oggetti? Queste sono tre possibili "implementazioni" di un "flusso di oggetti", tutte diverse tra loro... chiaramente non si può generalizzare il concetto di "flusso"... un metodo deve sapere con quali strutture dati deve lavorare perchè con strutture diverse si possono fare determinate cose, mentre altre non le si può fare.

    Supponendo che tu intenda uno Stream di oggetti, potresti avere una buona generalizzazione in questo modo:

    codice:
    public void riempiStruttura(ObjectInputStream ois) {
       Object obj = null;
       while((obj = ois.readObject()) != null) {
          // Finchè ci sono oggetti nello stream...
          ...   // riempi la tua struttura con l'oggetto "obj" letto dallo stream
       }
    }
    Capisci che più che scrivere "pseudo-codice" non si può fare, senza sapere esattamente cosa intendi fare.
    Generalizzare è possibile solo fino ad un certo punto... oltre quel punto si esce dal campo informatico e si entra nell'occulto.


    Ciao.
    Il problema è esattamente che ObjectInputStream legge per forza da un file! O mi sbaglio? Io invece voglio riempire un buffer con un oggetto che può provenire da una qualsiasi sorgente. Per esempio : una JTextField contenente un testo che quando premo un bottone (una volta implementato correttamente l'actionlistener) mandi l'oggetto stringa a questo flusso e lo memorizzi nella struttura che deciderò di usare(vector o binarytree per esempio), e il tutto termina quando premo un'altro tasto che chiude il flusso. Ma vorrei che questo codice sia predisposto a ricevere anche oggetti di altro tipo da sorgenti differenti, anche se in questo momento non ho altri esempi in mente. Praticamente io voglio fare la stessa identica cosa che ho fatto con lo scanner, ma voglio il flusso si metta in attesa di un oggetto da una sorgente qualsiasi, che deciderò quando vorrò utilizzare questo codice per esempio, analogamente allo scanner che continua il ciclo in attesa di una stringa passata da System.in...
    java java java

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    tu colleghi ObjectInputStream ad un InputStream (come dicono le API ) da qui poi fai delle read, ma quello che realmente tu vedi sono sequenze di array, che vengano da file, da una textfield, da una tabella poco importa.

    Mi sa che stai bruciando tanti passi e reinventando la ruota, più generico di un flusso di byte non so cosa ci sia
    RTFM Read That F*** Manual!!!

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da daevy
    Il problema è esattamente che ObjectInputStream legge per forza da un file! O mi sbaglio?
    Premesso che, come ha detto anche valia, stai bruciando un po' le tappe... ObjectInputStream è un InputStream in grado di leggere oggetti serializzati... chi li ha serializzati (e dove) non ha alcuna importanza... l'InputStream sorgente può essere, appunto, un InputStream qualunque (per assurdo, anche System.in, se ci si vuole proprio fare del male!).

    Un ObjectInputStream lo posso collegare all'InputStream di una Socket, ad un ByteArrayInputStream, ad un FileInputStream, ad un PipedInputStream, ad uno StringBufferInputStream, ad un MioAreaInputStream (una ipotetica classe che posso aver sviluppato per leggere da una JTextArea)... a qualunque cosa mi fornisca un InputStream, con l'unico vincolo che l'InputStream fornisca un flusso di byte tale da costituire un insieme di oggetti serializzati (secondo le specifiche della serializzazione).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it L'avatar di daevy
    Registrato dal
    Apr 2012
    Messaggi
    10
    Grazie delle risposte. Nella mia mente sembrava un'idea semplice e lineare ma a quanto pare non lo è e non si può fare, o forse si può fare ma io ho spiegato male il mio intento. Riproverò tra qualche mesetto grazie lo stesso
    java java java

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    prova a spiegarti meglio, davvero quello che tu provi a fare già esiste, le interfacce sono pensate proprio per slegare le implementazioni dal tipo di input / output e fornire un comportamento che sia standard in quanto rispetta quanto dichiarato dall'interfaccia
    RTFM Read That F*** Manual!!!

  10. #10
    Utente di HTML.it L'avatar di daevy
    Registrato dal
    Apr 2012
    Messaggi
    10
    Allora spiego tutto dall'inizio. E' un'esercitazione per la scuola che riguarda alberi binari e files. Ma anche se il prof ci assegna dei compiti specifici io per cercare di fare cose un pò più "professionali" creo classi sempre atte a scopi generali e poi le uso in maniera specifica per l'esercitazione. Questa esercitazione prevedeva di salvare una lista di stringhe su un file di oggetti e subito dopo caricare le stringhe dal file ad un albero binario. Allora io ho fatto la classe albero e nodo in raw type ed esteso la classe albero. Voglio che questa classe ereditata faccia tutto ciò che ho detto prima semplicemente richiamandola. Potrei farlo passando come parametro un'array di stringhe ma voglio evitare. Voglio che ogni elemento sia passato singolarmente volta per volta da un'input esterno e non da un vettore o array. In pratica voglio fare tutto senza interfaccia utente, ma solo richiamando un metodo e se poi voglio riutilizzare la classe se voglio ci aggiungo un'interfaccia grafica.

    Non so se sono stato chiaro, anche se non credo. Forse è una gran cavolata, in tal caso perdonatemi e lasciatemi perdere
    java java java

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.