Java Tutorial/File/CharBuffer
Версия от 17:44, 31 мая 2010; (обсуждение)
Содержание
- 1 Buffer Equality
- 2 Buffer slice
- 3 CharBuffer warps a ByteBuffer
- 4 Convert ByteBuffer to a CharBuffer
- 5 Convert ByteBuffer to CharBuffer
- 6 Create a CharBuffer and put in some string
- 7 Fill String to CharBuffer
- 8 Flip a CharBuffer
- 9 Get array out of CharBuffer
- 10 Save and read text using FileChannel with CharBuffer
- 11 Test buffer duplication
- 12 Test the effects of buffer flipping
- 13 Use CharBuffer
- 14 Use while loop to read a CharBuffer
- 15 Wrap a char array to a CharBuffer
Buffer Equality
import java.nio.CharBuffer;
public class MainClass {
public static void main(String[] args) {
CharBuffer cb1 = CharBuffer.allocate(5), cb2 = CharBuffer.allocate(5);
cb1.put("B").put("u").put("f").put("f").put("A");
cb2.put("B").put("u").put("f").put("f").put("B");
cb1.rewind();
cb2.rewind();
System.out.println(cb1.limit(4).equals(cb2.limit(4)));
}
}
//
true
Buffer slice
import java.nio.CharBuffer;
public class MainClass {
public static void main(String[] argv) throws Exception {
CharBuffer buffer = CharBuffer.allocate(8);
buffer.position(3).limit(5);
CharBuffer sliceBuffer = buffer.slice();
println(buffer);
println(sliceBuffer);
char[] myBuffer = new char[100];
CharBuffer cb = CharBuffer.wrap(myBuffer);
cb.position(12).limit(21);
CharBuffer sliced = cb.slice();
println(cb);
println(sliced);
}
private static void println(CharBuffer cb) {
System.out.println("pos=" + cb.position() + ", limit=" + cb.limit() + ", capacity="
+ cb.capacity() + ", arrayOffset=" + cb.arrayOffset());
}
}
/*
*/
pos=3, limit=5, capacity=8, arrayOffset=0 pos=0, limit=2, capacity=2, arrayOffset=3 pos=12, limit=21, capacity=100, arrayOffset=0 pos=0, limit=9, capacity=9, arrayOffset=12
CharBuffer warps a ByteBuffer
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
public class MainClass {
public static void main(String argv[]) {
ByteBuffer bb = ByteBuffer.allocate(100);
bb.mark();
bb.position(5);
bb.reset();
bb.mark().position(5).reset();
char[] myBuffer = new char[100];
CharBuffer cb = CharBuffer.wrap(myBuffer);
cb.position(12).limit(21);
CharBuffer sliced = cb.slice();
System.out
.println("Sliced: offset=" + sliced.arrayOffset() + ", capacity=" + sliced.capacity());
}
}
//
Sliced: offset=12, capacity=9
Convert ByteBuffer to a CharBuffer
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
public class MainClass {
public static void main(String[] args) {
ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, 0, 0, 0, 0, "a" });
bb.rewind();
CharBuffer cb = ((ByteBuffer) bb.rewind()).asCharBuffer();
System.out.println("Char Buffer");
while (cb.hasRemaining())
System.out.println(cb.position() + " -> " + cb.get());
}
}
Convert ByteBuffer to CharBuffer
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.CharBuffer;
/**
* Test asCharBuffer view.
*/
public class MainClass {
public static void main(String[] argv) throws Exception {
ByteBuffer byteBuffer = ByteBuffer.allocate(7).order(ByteOrder.BIG_ENDIAN);
CharBuffer charBuffer = byteBuffer.asCharBuffer();
byteBuffer.put(0, (byte) 0);
byteBuffer.put(1, (byte) "H");
byteBuffer.put(2, (byte) 0);
byteBuffer.put(3, (byte) "i");
byteBuffer.put(4, (byte) 0);
byteBuffer.put(5, (byte) "!");
byteBuffer.put(6, (byte) 0);
println(byteBuffer);
println(charBuffer);
// now slice it differently
byteBuffer.position(4);
charBuffer = byteBuffer.asCharBuffer();
println(byteBuffer);
println(charBuffer);
}
// Print info about a buffer
private static void println(Buffer buffer) {
System.out.println("pos=" + buffer.position() + ", limit=" + buffer.limit() + ", capacity="
+ buffer.capacity() + ": "" + buffer.toString() + """);
}
}
/*
*/
pos=0, limit=7, capacity=7: "java.nio.HeapByteBuffer[pos=0 lim=7 cap=7]" pos=0, limit=3, capacity=3: "Hi!" pos=4, limit=7, capacity=7: "java.nio.HeapByteBuffer[pos=4 lim=7 cap=7]" pos=0, limit=1, capacity=1: "!"
Create a CharBuffer and put in some string
import java.nio.CharBuffer;
public class MainClass {
public static void main(String[] argv) throws Exception {
CharBuffer cb = CharBuffer.allocate(100);
cb.put("This is a test String");
cb.flip();
// This throws an IllegalArgumentException
cb.put(cb);
System.out.println(cb);
}
}
Fill String to CharBuffer
import java.nio.CharBuffer;
/**
* Buffer fill/drain example. This code uses the simplest means of filling and
* draining a buffer: one element at a time.
*/
public class MainClass {
public static void main(String[] argv) throws Exception {
CharBuffer buffer = CharBuffer.allocate(100);
String string = "asdf";
for (int i = 0; i < string.length(); i++) {
buffer.put(string.charAt(i));
}
buffer.flip();
drainBuffer(buffer);
buffer.clear();
}
private static void drainBuffer(CharBuffer buffer) {
while (buffer.hasRemaining()) {
System.out.print(buffer.get());
}
System.out.println("");
}
}
Flip a CharBuffer
import java.nio.CharBuffer;
public class MainClass {
public static void main(String[] argv) throws Exception {
char[] chars = new char[60];
CharBuffer cb = CharBuffer.wrap(chars, 12, 42);
println(cb);
cb.put("This is a test String");
cb.flip();
println(cb);
cb.clear();
cb.put("Foobar");
println(cb);
for (int i = 0; i < 20; i++) {
System.out.println("[" + i + "] = " + chars[i]);
}
}
private static void println(CharBuffer cb) {
System.out.println("pos=" + cb.position() + ", limit=" + cb.limit() + ", capacity="
+ cb.capacity() + ", arrayOffset=" + cb.arrayOffset());
}
}
/*
*/
pos=12, limit=54, capacity=60, arrayOffset=0 pos=0, limit=33, capacity=60, arrayOffset=0 pos=6, limit=60, capacity=60, arrayOffset=0 [0] = F [1] = o [2] = o [3] = b [4] = a [5] = r ...
Get array out of CharBuffer
import java.nio.CharBuffer;
public class MainClass {
public static void main(String[] argv) throws Exception {
CharBuffer cb = CharBuffer.allocate(100);
cb.put("This is a test String");
cb.flip();
System.out.println("hasArray() = " + cb.hasArray());
char[] carray = cb.array();
System.out.print("array=");
for (int i = 0; i < carray.length; i++) {
System.out.print(carray[i]);
}
System.out.println("");
System.out.flush();
}
}
/**/
hasArray() = true array=This is a test String
Save and read text using FileChannel with CharBuffer
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class MainClass {
public static void main(String[] args) throws Exception {
FileChannel fc = new FileOutputStream("data2.txt").getChannel();
ByteBuffer buff = ByteBuffer.allocate(24); // More than needed
buff.asCharBuffer().put("Some text");
fc.write(buff);
fc.close();
fc = new FileInputStream("data2.txt").getChannel();
buff.clear();
fc.read(buff);
buff.flip();
System.out.println(buff.asCharBuffer());
}
}
/* */
Some text
Test buffer duplication
import java.nio.CharBuffer;
/**
* Test buffer duplication.
*/
public class MainClass {
public static void main(String[] argv) throws Exception {
CharBuffer buffer = CharBuffer.wrap("01234567");
buffer.position(3).limit(6).mark().position(5);
CharBuffer dupeBuffer = buffer.duplicate();
buffer.clear();
println(buffer);
println(dupeBuffer);
dupeBuffer.reset();
println(dupeBuffer);
dupeBuffer.clear();
println(dupeBuffer);
}
private static void println(CharBuffer cb) {
System.out.println("pos=" + cb.position() + ", limit=" + cb.limit() + ", capacity="
+ cb.capacity() + ": "" + cb + """);
}
}
/**/
pos=0, limit=8, capacity=8: "01234567" pos=5, limit=6, capacity=8: "5" pos=3, limit=6, capacity=8: "345" pos=0, limit=8, capacity=8: "01234567"
Test the effects of buffer flipping
import java.nio.CharBuffer;
/**
* Test the effects of buffer flipping.
*
*/
public class MainClass {
public static void main(String[] argv) throws Exception {
CharBuffer cb = CharBuffer.allocate(15);
cb.put("Hello World");
println(cb);
cb.flip();
println(cb);
cb.flip();
println(cb);
}
private static void println(CharBuffer cb) {
System.out.println("pos=" + cb.position() + ", limit=" + cb.limit() + ": "" + cb + """);
}
}
Use CharBuffer
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
public class MainClass {
private static void symmetricScramble(CharBuffer buffer) {
while (buffer.hasRemaining()) {
buffer.mark();
char c1 = buffer.get();
char c2 = buffer.get();
buffer.reset();
buffer.put(c2).put(c1);
}
}
public static void main(String[] args) {
char[] data = "UsingBuffers".toCharArray();
ByteBuffer bb = ByteBuffer.allocate(data.length * 2);
CharBuffer cb = bb.asCharBuffer();
cb.put(data);
System.out.println(cb.rewind());
symmetricScramble(cb);
System.out.println(cb.rewind());
symmetricScramble(cb);
System.out.println(cb.rewind());
}
}
/*
*/
UsingBuffers sUniBgfuefsr UsingBuffers
Use while loop to read a CharBuffer
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
public class MainClass {
public static void main(String[] args) {
ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 0, 0, 0, 0, 0, 0, "a" });
bb.rewind();
CharBuffer cb = ((ByteBuffer) bb.rewind()).asCharBuffer();
System.out.println("Char Buffer");
while (cb.hasRemaining())
System.out.println(cb.position() + " -> " + cb.get());
}
}
Wrap a char array to a CharBuffer
import java.nio.CharBuffer;
public class MainClass {
public static void main(String[] argv) throws Exception {
CharBuffer buffer = CharBuffer.allocate(8);
buffer.position(3).limit(5);
CharBuffer sliceBuffer = buffer.slice();
println(buffer);
println(sliceBuffer);
char[] myBuffer = new char[100];
CharBuffer cb = CharBuffer.wrap(myBuffer);
cb.position(12).limit(21);
CharBuffer sliced = cb.slice();
println(cb);
println(sliced);
}
private static void println(CharBuffer cb) {
System.out.println("pos=" + cb.position() + ", limit=" + cb.limit() + ", capacity="
+ cb.capacity() + ", arrayOffset=" + cb.arrayOffset());
}
}
/*
*/
pos=3, limit=5, capacity=8, arrayOffset=0 pos=0, limit=2, capacity=2, arrayOffset=3 pos=12, limit=21, capacity=100, arrayOffset=0 pos=0, limit=9, capacity=9, arrayOffset=12