In order to simplify integration with existing libraries, most commonly Java libraries, Scala-IO provides a JavaConverters object with implicit methods that add as*** methods (asInput, asOutput, asSeekable, etc...) to several types of objects. It is the same pattern as in the scala.collection.JavaConverters object.
These methods can be used instead of the Resource.from*** methods to provide a slightly nicer appearing code.
There is one warning. When using JavaConverters, instead of Resource.from*** for creating Input/Output/Seekable/etc... objects, the chances of falling into the trap of creating non-reusable resources or causing a resource leak is increased. See: scala-io-core-reusable-resources for more details on this.
Showing posts with label input. Show all posts
Showing posts with label input. Show all posts
Wednesday, September 26, 2012
Thursday, September 13, 2012
Scala-IO Core: ReadChars and WriteChars
The Input and Output objects of Scala-IO assume that the underlying data is composed of bytes. However, another common pattern is to have the underlying data be composed of characters instead of bytes, for example java.io.Reader and java.io.Writer. While it is possible to decompose the output into Bytes and construct an Input object from the decorated object, ReadChars and WriteChars can be used in this situation to reduce the work needed to interact with such resources.
You will notice that the ReadChars method does not have the codec parameter because there translation is not required, unlike in Input which requires the characters to be created from raw bytes.
Not many examples are needed to explain these concepts but here are a few examples on how to create ReadChar and WriteChar objects:
ReadChars and WriteChars are traits that contain the character and string methods of Input and Output. The primary difference is that the Charset is defined by the underlying resource rather than supplied at the method invocation site.
Compare two methods:
Input:
def chars(implicit codec: Codec = Codec.default): LongTraversable[Char]ReadChars:
def chars: LongTraversable[Char]
Not many examples are needed to explain these concepts but here are a few examples on how to create ReadChar and WriteChar objects:
Labels:
daily-scala,
input,
Output,
readchars,
Scala,
scala-io,
scala-io core,
writechars
Thursday, August 2, 2012
Scala-IO Core: Resource, Input
Just a note: all these examples have been tested in REPL so go ahead and fire up the sbt console in the example project and try these out.
Resource is the fundamental component of Scala-IO. A Resource is essentially anything that has a simple open/close lifecycle. The Resource trait handles the lifecycle for the developer allowing him to focus on the IO logic.
In the typical use-case one of the Resource subclasses will be used. They are more useful in general because they will have one of higher level traits mixed in like Input or Output.
The most typical way to create a Resource is with the Resource object which is a factory method for creating Resource objects from various types of Java objects.
While Resource is the foundation Trait, Input and Output are the Traits most commonly used, The user-facing traits if you will.
Here are a few examples of creating Resources: There are advanced usages of Resource that we will get into in later posts. At the moment I want to focus on Input, Output and Seekable Traits. In later posts we will look at how to integrate with legacy Java APIs and how to access the underlying resource using the loan pattern.
The Input Trait provides methods for accessing the data of the underlying resource in various different way. As bytes, strings, lines, etc...
There are two basic types of methods. Methods that return LongTraversable objects and methods that load the entire Resource into memory. For example:
What is a LongTraversable? That will be the next post :-). Summarized, it is a specialized Lazy/non-strict Traversable.
Resource
Resource is the fundamental component of Scala-IO. A Resource is essentially anything that has a simple open/close lifecycle. The Resource trait handles the lifecycle for the developer allowing him to focus on the IO logic.
In the typical use-case one of the Resource subclasses will be used. They are more useful in general because they will have one of higher level traits mixed in like Input or Output.
The most typical way to create a Resource is with the Resource object which is a factory method for creating Resource objects from various types of Java objects.
While Resource is the foundation Trait, Input and Output are the Traits most commonly used, The user-facing traits if you will.
Here are a few examples of creating Resources: There are advanced usages of Resource that we will get into in later posts. At the moment I want to focus on Input, Output and Seekable Traits. In later posts we will look at how to integrate with legacy Java APIs and how to access the underlying resource using the loan pattern.
Input
The Input Trait provides methods for accessing the data of the underlying resource in various different way. As bytes, strings, lines, etc...
There are two basic types of methods. Methods that return LongTraversable objects and methods that load the entire Resource into memory. For example:
string and byteArray load the entire resource into memory while bytes and chars return a LongTraversable.What is a LongTraversable? That will be the next post :-). Summarized, it is a specialized Lazy/non-strict Traversable.
Labels:
daily-scala,
input,
longtraversable,
resource,
Scala,
scala-io,
scala-io core
Subscribe to:
Posts (Atom)