Hi henry I had problems to compare the two versions because they are probably on multiple mails. Could you email it? Because convenient methods are important but I do not see the point. Stef (in my constant quest for the better) On Tue, Jan 2, 2018 at 1:13 PM, Henrik Sperre Johansen <henrik.s.johansen@veloxit.no> wrote:
Stephane Ducasse-3 wrote
Hi Bernhard
Have a look at how guille started to implement File package. (Guille is actively converting all the image users of the old hierarchy but last time he losts a couple of hours because changing epicea and other users of positionable streams and sourceArray... at the same time was leading to complex situations :). But Guille told me that he learned and will come back to this.)
He is using ZnCharacterWriteStream and wrapper like ZnCrPortableWriteStream.
writeSourceCodeFrom: aStream baseName: baseName isSt: stOrCsFlag
| extension fileName outputStream | extension := stOrCsFlag ifTrue: ['.st'] ifFalse: ['.cs']. fileName := baseName, extension. fileName := FileSystem disk checkName: fileName fixErrors: true. outputStream := (File named: fileName) writeStream. (ZnCrPortableWriteStream on: (ZnCharacterWriteStream on: outputStream encoding: 'utf8')) nextPutAll: aStream contents.
outputStream close.
writeSourceCodeFrom: aStream toFileReference: aFileReference
aFileReference writeStreamDo: [ :outputStream | (ZnCrPortableWriteStream on: (ZnCharacterWriteStream on: outputStream encoding: 'utf8')) nextPutAll: aStream contents. ].
self inform: 'Filed out to: ', String cr, aFileReference basename
self inform: 'Filed out to: ', String cr, fileName.
I hope it helps.
Stef
On Sat, Dec 30, 2017 at 1:27 PM, Bernhard Pieber <
bernhard@
> wrote:
I just saw that the FileStream hierarchy including MultiByteFileStream is deprecated. However, I can't find what file stream class should be used to read a UTF-8 encoded file instead. FileReference>>#readStreamDo: also uses MultiByteFileStream.
Can someone please point me to the right code?
Bernhard
Maybe it's just me, but I'd a big fan of convenience methods over explicit stacking when it comes to multi-layer streams. - It documents the intended/valid ways to stack (such as which streams it makes sense to wrap in a ZnCrPortableWriteStream, or which streams one normally would want to #buffered:do:) - It makes the transition (in terms of conciseness) from "traditional" filestreams less jarring (provided convenience methods provide sensible defaults).
Say, for instance, a #withEncoding:do:* on read/writeStream, so instead of the above, one can do:
fileName := FileSystem disk checkName: fileName fixErrors: true. (outputStream :=(File named: fileName) writeStream) withEncoding: 'utf8' do: [:encodedWriteStream | encodedWriteStream nextPutAll: aStream contents]. outputStream close.
and aFileReference writeStreamDo: [ :outputStream | outputStream withEncoding: 'utf8' do: [:encodedStream | encodedStream nextPutAll: aStream contents. ]]. or input := aFileReference readStreamDo: [ :inputStream | inputStream withEncoding: 'utf8' do: [:decodingStream | decodingStream contents]]
It's more involved than the current multibytestreams, but takes away the burden of determining the correct stack of ZnStreams for the common case. For instance, you'd normally want file write streams to also be wrapped by a buffered stream, and have a single flush at end of withEncoding:do:, while the same isn't necessary for withEncoding:do: on the base WriteStream class.
Cheers, Henry
*Bad name, I know, but you get the point.
-- Sent from: http://forum.world.st/Pharo-Smalltalk-Developers-f1294837.html