Quindi sto provando a scrivere messaggi da utenti su una rete di messaggistica su un file. Sto provando a costruire questo programma con buone pratiche java e una tecnica di file IO appropriata.È consigliabile archiviare un sacco di testo che viene acquisito periodicamente in una cache prima di salvarlo in un file?
Attualmente il mio programma riconosce che qualcuno ha pubblicato un messaggio, prende il messaggio e lo scrive immediatamente in un file. Creare l'oggetto file, creare l'oggetto writer, accodare il messaggio, quindi chiudere il file. Sembra una buona pratica se non ci sono molti messaggi in arrivo, ma se c'è un rapido flusso di conversazione questo sembra lento e richiede molto di azioni non necessarie perché il file verrà riaperto immediatamente.
Poi ho pensato a cosa succede se ho appena lasciato il file aperto e ho appena scritto i messaggi mentre arrivavano al file, quindi chiuso periodicamente. È una buona pratica? Lasciando un file aperto per lunghi periodi di tempo? Ad esempio, dopo un'ora o dopo che è stata scritta una certa quantità di dati?
Ora, penso che dovrei prendere i messaggi, archiviarli in una "cache" (come un array di stringhe), quindi salvare l'array di stringhe in un file quando la "cache" è piena. Questa è una pratica migliore?
Così ho due domande:
1) E 'buona norma lasciare un file aperto per un lungo periodo di tempo (pochi minuti ad alcune ore) se non si utilizza il file?
2) Che cosa è una buona pratica per una "cache" come sto parlando? Un array di stringhe è buono? C'è qualcosa di meglio che dovrei usare? Come andresti a conservare queste informazioni?
> la procedura migliore per i registri (e simili) nelle applicazioni server è decidere un ritardo accettabile e attenersi ad essa. Potresti approfondire come farlo? Oppure indicarmi la direzione per capire come farlo? Inoltre, alcune ulteriori informazioni su come usare BuffereOutputStream sarebbe bello. Sto cercando di usarlo nel modo giusto. Ci sono altre classi che dovrebbero essere coinvolte? Come apprendere l'utilizzo del metodo flush(). Anche questa è stata un'ottima risposta grazie. – Bnannerz
BufferedOutputStream è piuttosto semplice; come se fosse stato chiamato un FileOutputStream, basta fare un nuovo BufferedOutputStream (out) e usarlo come se fosse il FileOutputStream. C'è un BufferedWriter, se usi gli scrittori. Il secondo parametro è quanto grande è il buffer; l'impostazione predefinita è piuttosto piccola ma, per quanto ne so, potresti renderla 8KB o 64KB o qualsiasi altra cosa tu voglia. – sam
Informazioni su come eseguire la sincronizzazione: è abbastanza semplice ma implica la concorrenza, quindi è necessario utilizzare la parola chiave sincronizzata in alcuni punti! Fondamentalmente, avere la funzione 'scrivi su file' in modo che scriva sul flusso di output bufferizzato. Controlla se hai già un timer "scarico" in sospeso. Se ce n'è uno, non fare nulla; in caso contrario, avvia una nuova discussione che dorme solo per 5 secondi (o qualsiasi altra cosa), quindi chiama a livello del flusso. (Calling flush() cancellerà il buffer e lo scriverà effettivamente sul disco.) – sam