Disons que j'ai un fichier de 8 octets contenant uniquement des caractères ASCII : brownfox
.
Au lieu de charger le fichier entier et de travailler dessus, je veux charger un bloc de 2 octets. [UInt8]
et faire des opérations sur des blocs de 2 octets, donc les opérations sont les suivantes :
- charge
br
du fichier (et no l'ensemble du fichier) - effectuer des actions sur les données, par exemple inverser pour
rb
- enregistrer la sortie dans un autre fichier
- répéter pour :
ow
nf
ox
Le raisonnement derrière cela : De cette façon, si je traite un fichier de 1 Go de texte, je n'ai pas besoin d'avoir 1 Go de RAM libre (ou 2 Go pour les fichiers d'entrée et de sortie).
Cette méthode de traitement des fichiers est importante à mes yeux pour le cryptage et l'envoi vers des solutions en nuage.
J'utilise cette extension :
extension Data {
/**
Consumes the specified input stream, creating a new Data object
with its content.
- Parameter reading: The input stream to read data from.
- Note: Closes the specified stream.
*/
init(reading input: InputStream) {
self.init()
input.open()
let bufferSize = 1024
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
while input.hasBytesAvailable {
let read = input.read(buffer, maxLength: bufferSize)
self.append(buffer, count: read)
}
buffer.deallocate()
input.close()
}
/**
Consumes the specified input stream for up to `byteCount` bytes,
creating a new Data object with its content.
- Parameter reading: The input stream to read data from.
- Parameter byteCount: The maximum number of bytes to read from `reading`.
- Note: Does _not_ close the specified stream.
*/
init(reading input: InputStream, for byteCount: Int) {
self.init()
input.open()
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: byteCount)
let read = input.read(buffer, maxLength: byteCount)
self.append(buffer, count: read)
buffer.deallocate()
}
}
Pero init(reading input: InputStream, for byteCount: Int)
va toujours du premier octet. Comment puis-je lire par exemple du 16ème au 20ème octet ?
Documentation sur InputStream.read(_:maxLength:)
À partir de l'index de lecture actuel, prendre jusqu'au nombre d'octets spécifié dans le second paramètre et les place dans le tampon fourni par le client (premier paramètre). tampon fourni par le client (premier paramètre). Le tampon doit être de type taille spécifiée par le second paramètre. Retourne le nombre réel d'octets d'octets placés dans le tampon ; s'il ne reste rien dans le flux, retourne 0. Réinitialise l'index dans le flux pour la prochaine opération de lecture.
Que puis-je faire pour no réinitialiser l'index, et obtenir l'opération suivante à l'endroit où la précédente s'est terminée ?