blob: 0653551074e20a0794d4a893de702b6e88d8f2c9 [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# Apache Fluo Bytes
[![Build Status][ti]][tl] [![Apache License][li]][ll] [![Maven Central][mi]][ml] [![Javadoc][ji]][jl]
**Apache Fluo Bytes is a simple library with the goal of providing an extremely
stable API for handling bytes, suitable for use in [Apache Fluo][fluo] and
other projects' APIs.**
## Features and Goals
This project aims to fill a void in Java, by providing convenient objects to
represent a sequence of bytes and associated utility classes for situations
when a raw byte array is not appropriate.
Specifically, it provides a `ByteSequence` interface, analogous to Java's
`CharSequence`, an immutable `Bytes` implementation analogous to Java's
`String`, and a corresponding `BytesBuilder` analogous to Java's
`StringBuilder`.
The provided classes have appropriate methods for serialization, and proper
equals and hashCode implementations, as well as a comparator for
`ByteSequence`, so they will be suitable for use in `Set`s and as keys in
`Map`s.
An immutable bytes implementation makes it possible to pass data between APIs
without the need for performance-killing protective copies. This benefit is
compounded if this library is used by multiple projects, as the need to make
protective copies while passing data between a project and its dependency's API
is eliminated.
This project aims to provide a fluent and intuitive API, with support for
conversions to/from other common types, such as `ByteBuffer`, `byte[]`, and
`CharSequence`/`String`.
This project requires at least Java 8, and supports `Stream` and functional
APIs where appropriate.
See this [blog post][blog] for some additional background.
## Safe for APIs
Using an external library in a project's API poses some risks to that project,
especially if it and its dependencies depend on different versions of that
library. This project attempts to mitigate those risks, so that it can be used
safely by other projects.
This project is made safe for reuse in other projects' APIs by adopting the
following principles:
* Using [Semantic Versioning 2.0.0][semver] to make strong declarations about
backwards-compatibility
* Strongly avoid breaking changes (avoid major version bumps), so that projects
can converge on the latest version of this library required by their code and
that of their dependencies, without risk of incompatibility
* No runtime dependencies itself, to eliminate any potential conflicts from
transitive dependencies if this library is used
* Use generic package naming scheme not tied to the Maven coordinates, in case
the project relocates or becomes independent of Fluo in the future
* Practice review-then-commit during development to protect against poor
initial design which is stuck with the project for the long-term
* Provide `@since` tags in Javadocs to communicate minimum required versions
for particular features
## Public API declaration for Semantic Versioning
This project's public API are all the publicly visible classes, methods, and
fields accessible outside the project's packages.
---
*Apache Fluo Bytes is an [Apache Fluo][fluo] project.*
[blog]: https://fluo.apache.org/blog/2016/11/10/immutable-bytes/
[semver]: http://semver.org/spec/v2.0.0.html
[fluo]: https://fluo.apache.org/
[ti]: https://github.com/apache/fluo-bytes/workflows/CI/badge.svg
[tl]: https://github.com/apache/fluo-bytes/actions
[li]: http://img.shields.io/badge/license-ASL-blue.svg
[ll]: https://github.com/apache/fluo-bytes/blob/main/LICENSE
[mi]: https://maven-badges.herokuapp.com/maven-central/org.apache.fluo/fluo-bytes/badge.svg
[ml]: https://maven-badges.herokuapp.com/maven-central/org.apache.fluo/fluo-bytes/
[ji]: https://javadoc-emblem.rhcloud.com/doc/org.apache.fluo/fluo-bytes/badge.svg
[jl]: http://www.javadoc.io/doc/org.apache.fluo/fluo-bytes