2009-08-04 3 views
2

Dans java.io.FileInputStream, il existe une méthode int read(Byte[] buffer,int offset,int numBytes); comment nous pouvons utiliser cette fonction - existe-t-il une différence entre cette méthode et read(byte[] buffer)?Utilisation de FileInputStream Java

+5

Répondre à cette question nécessite seulement une réflexion critique. Étant donné que vous connaissez la différence dans les arguments de méthode entre les deux fonctions, que pensez-vous de la différence? Comparez votre estimation avec la documentation. –

Répondre

7

Comme le Javadoc indique (et les noms des paramètres indiquent), la méthode avec l'offset et numBytes utilise seulement une partie de la mémoire tampon pour mettre sa sortie.

public int read(byte[] b, 
      int off, 
      int len) 
    throws IOException 

Parameters: 
    b - the buffer into which the data is read. 
    off - the start offset of the data. 
    len - the maximum number of bytes read. 

Vous pouvez utiliser cette méthode si vous souhaitez réutiliser un tampon existant contenant déjà des données que vous ne voulez pas écraser (bien sûr, le numBytes commençant par offset sera écrasé).

En Java, presque toutes les opérations sur les tampons offrent ce type d'interface. Utilisé correctement, vous pouvez éviter de copier/mettre en mémoire tampon des données plus de fois que nécessaire.

+0

Cela est particulièrement intéressant si vous utilisez un tampon pour mettre en mémoire tampon et traiter simultanément les données d'un flux. Par exemple, un décodeur pour un format de support peut lire les données d'un flux dans un tampon et un autre thread prend les valeurs de ce tampon pour les traiter. Comme le tampon peut être rempli avant avec certaines valeurs, vous voulez commencer à remplir à un décalage donné (et donc utiliser le second paramètre). Si vous avez complètement rempli le tampon, vous commencerez au début, mais en utilisant uniquement l'espace déjà traité par l'autre thread et utilisez le paramètre len-param pour y parvenir. – Mnementh

1

Je viens d'obtenir ce de la javadoc.

Lit jusqu'à octets de données de ce flux d'entrée dans un tableau d'octets. Si len n'est pas nul, la méthode se bloque jusqu'à ce qu'une entrée soit disponible; sinon, aucun octet n'est lu et 0 est renvoyé.

Paramètres:

  • b - la mémoire tampon dans laquelle les données sont lues. Off - Décalage de début dans le tableau de destination b
  • len - le nombre maximal d'octets lus.

Renvoie: le nombre total d'octets lus dans la mémoire tampon, ou -1 s'il n'y a pas plus de données, car la fin du fichier a été atteinte.

http://java.sun.com/javase/6/docs/api/java/io/FileInputStream.html#read(byte[], int, int)

1

Cette fonction est très utile pour lire un fichier en mémoire. Voir cet exemple,

File = new File("/anywhere/anyfile"); 
InputStream is = new FileInputStream(file); 
long fileSize = file.length(); 
byte[] bytes = new byte[(int)fileSize]; 
int offset = 0; 
int count=0; 
while (offset < fileSize) { 
    count=is.read(bytes, offset, fileSize-offset)); 
    if (count >= 0) 
     offset += count; 
    else 
     throw new IOException("Can't read file "+file.getName()); 
} 
is.close(); 
// Now bytes has all the complete file. 
Questions connexes