2017-06-21 5 views
0

Je crée une classe de liaison abstraite pour Reader et Writer où l'utilisateur n'a pas besoin de référencer chacun individuellement. Exemple: J'ai un FileStream qui contient FileReader et FileWriter.Quand les lecteurs/auteurs/flux sont-ils identifiés comme ouverts?

La question que j'ai se réfère à l'optimisation de la classe. Je sais que je ne peux pas avoir deux flux ouverts simultanément en raison de la simultanéité, mais j'ai besoin de les initialiser quelque part sans avoir de fuites de données partout.

Est-ce que les flux/lecteurs/graveurs sont ouverts, dès que vous les initialisez, ou bien les «tuyaux» ne sont-ils ouverts qu'une fois que la première lecture/écriture a commencé? Je regarde la JavaDoc et ne voient pas ouvrir quoi que ce soit ici quand les cours d'eau réellement ...

Pour ceux qui ne comprennent pas ce que je demande (sans tenir compte des blocs try-catch):

// does my reader become OPEN here? 
BufferedReader br = new BufferedReader(new FileReader("foobar.txt")); 

// or here, now that I have performed the first operation. 
br.readLine(); 
+1

les deux implémentent 'Closeable', donc si utilisé dans un' try-with' sera auto-fermable, voir https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html –

+0

_ "Je sais Je ne peux pas avoir deux flux ouverts simultanément en raison de la concurrence "_ - que voulez-vous dire par là? Voulez-vous dire entrée et sortie sur le même fichier? _ "sans avoir des fuites de données partout" _ - Pourquoi pensez-vous que cela se produira? S'il vous plaît montrer un code réel et expliquer un problème réel. En l'état, votre question semble reposer sur des idées fausses et est trop abstraite pour qu'on y réponde. –

+0

@JimGarrison Je n'ai pas d'exemples, mais je le fais sur un seul thread qui causera des problèmes de synchronisation si c'est fait en même temps. Pas besoin d'écrire dans un fichier et d'essayer ensuite de lire quand les tampons regardent des choses différentes. Ma question ne fait pas référence à un problème clair mais plutôt à la nature abstraite de (trois) classes et donc oui, j'écris une question abstraite. Il n'est toutefois pas ambigu et je suis sûr qu'une réponse est *** plus que probable *** pour pouvoir obtenir une réponse. – finnrayment

Répondre

2

Ils sont ouverts dès que vous les construisez. Il n'y a pas d'opération "ouverte", donc ils sont déjà ouverts.

Discussion:

new FileInputStream(...) et new FileOutputStream(...) ouvrir le fichier, car ils jettent IOExceptions à ce sujet. Pratiquement tous les autres flux d'entrée ou de sortie étendent FilterInput/OutputStream, avec un FileInput/OutputStream comme délégué (y compris les flux d'entrée/sortie de socket en fait). Le FileInput/OutputStream est créé d'abord dans une telle pile, ergo il est déjà ouvert avant le flux de décorateur, ergo ils sont déjà ouverts aussi.

ByteArrayInput/OutputStreams et StringReader/Writer n'ont pas besoin d'ouverture du tout.

+0

Alors c'est bon à savoir. Réponse simple et directe; que toi!+1 – finnrayment

+0

Je suis d'accord; bien que je pense qu'un petit morceau d'information/explication supplémentaire aiderait. A partir de maintenant, la seule chose qui fait de cette chose une "réponse crédible" est la connaissance du contexte (comme dans "quand EJP réclame quelque chose, il est habituellement sur place"). – GhostCat

+0

@GhostCat Tout cela est très bien, mais 'des informations/explications supplémentaires' comme quoi? C'est immédiatement apparent. Il n'y a pas d'opération "ouverte", donc ils sont déjà ouverts. QED. Je ne suis pas au courant d'une déclaration dans le Javadoc qui le dit, mais il n'a pas besoin d'être. – EJP

1

Solution alternative: oublier de réinventer la roue.

Java a une classe qui est spécifiquement conçu pour permettre la lecture et l'écriture dans le même fichier: java.io.RandomAcessFile

Donc, si vous devez enrouler autour ... Utilisez cette classe, au lieu de combiner deux autres choses qui n'ont jamais été destinés à être combinés!

+0

Merci d'avoir reconnu 'RandomAccessFile' mais je crée des classes ** abstract **, qui peuvent être utilisées pour n'importe quel type d'écrivain/lecteur. Fichiers, octets, etc. – finnrayment

+0

Oh, excusez-moi! Bien sûr, vous pouvez avoir mon upvote. Votre réponse est d'assurer la qualité. :) – finnrayment

+1

Merci beaucoup! – GhostCat