一、 字符串
1、 单个字符串givenString
单个字符串已经给定
第一步:建立字节缓冲区大小
l 使用ByteBufferbuf=ByteBuffer.allocate(givenString.length());来新建字节缓冲区
l 直接使用ByteBufferbuf=ByteBuffer.allocate(1024);即缓冲区为1kB(如果字符串长度小于512个字符的话,如果字符串大于buf的长度的话,需要用while循环对字符串进行分段读取,这种情况很少发生。如果要增加程序的鲁棒性的话,可以使用:
int mark=0; //标志位
while(mark<givenString.length()*2){
buf.put(longArray.getBytes(),mark,min(buf, givenString.length()*2-mark))
//从mark开始,每次读取buf个到视图缓冲区,直到最后一场读取// givenString.length()*2-mark个到视//图缓冲区内,buf的位置自动位移。
channel.write(buf)
mark+=buf.position();
buf.clear();
}
)
第二步:将givenString写入buf
l 建立视图缓冲区CharBuffercharBuf=buf.asCharBuffer();将givenString放入视图缓冲区中:charBuf.put(givenString);
l 使用getBytes()方法将字符串转化为字节数组,buf.put(givenString.getBytes())。注意这种方式得到的是Unicode编码!
l 将givenString转化为字符数组,通过foreach循环来读取单个字符:
for(char ch: givenString.toCharArray()){
buf.putchar(ch);
}
二、字符串数组
字符串数组givenStrings已经给定
第一步:建立字节缓冲区大小
l foreach循环找到字符串givenStrings中字符的最长值maxLength,使用ByteBuffer buf=ByteBuffer.allocate(maxLength);来新建字节缓冲区
l 直接使用ByteBufferbuf=ByteBuffer.allocate(1024);即缓冲区为1kB(如果字符串长度小于512个字符的话)
第二步:将givenStrings写入buf
l 建立视图缓冲区CharBuffercharBuf=buf.asCharBuffer();利用foreach循环将givenStrings每个字符串放入视图缓冲区同时写入文件中;
l 利用foreach循环,使用getBytes()方法将字符串转化为字节buf.put(givenString.getBytes())放入字节缓冲区同时写入文件;注意这种方式得到的是Unicode编码!
l 利用foreach循环。将givenString转化为字符数组,通过foreach循环来读取单个字符:
for(char ch: givenString.toCharArray()){
buf.putchar(ch);
}
同时写入文件中;
☆另外一种比较有趣的方式是:
不初始化buf的大小,而是在foreach循环中动态的赋予大小,即将givenStrings中的每一个字符串调用getBytes()方法将字符串转化为字节数组之后封装到buf中.
ByteBuffer buf=null;
for(String chString: givenStrings){
buf=ByteBuffer.wrap(chString.getBytes())
channel.write(buf);
}
[1] 注意,这里的写入文件即通道channel中
PathfilePath=Paths.get(System.getProperty("user.home"))
i. .resolve("BeginningJava").resolve("Proverbs.txt");
WritableByteChannelchannel=Files.newByteChannel(filePath,
i. EnumSet.of(WRITE,CREATE,APPEND));
channel.write(buffer);
[2] 用到视图缓冲区的话,写文件之前需要更新buf的位置并调用buf.flip();
[3] 读取下一条字符串需要重用buf,需要调用buf.clear(),即位置置为0,限制设置为容量
三、单个基本数据类型
注意:这里指Long和Char,Int和Long类似
l 使用buf.putLong(),buf.putChar()
l 建立视图缓冲区,longBuf.put(),charBuf.put()
四、基本数据类型数组
建立视图缓冲区
Ø 当视图缓冲区大于数组长度的时候,使用for循环将数组全部写入视图缓冲区,读取完毕后将buf写入通道。
Ø 当视图缓冲区小于数组长度的时候(或者无法判断的时候),使用while循环将数组分段读取到视图缓冲区并写入到通道中。
例如,数组为longArray,字节缓冲区为buf,视图缓冲区为longBuf,通道为channel,
int mark=0; //标志位
while(mark<longArray.length){
longBuf.put(longArray,mark,min(longBuf, longArray.length-mark))
//从mark开始,每次读取longBuf个到视图缓冲区,直到最后一场读取//longArray.length-mark个到视//图缓冲区内,longBuf的位置自动位移,而buf不变。
buf.limit(8*longBuf.position());
channel.write(buf)
mark+= longBuf.position();
longBuf.clear();
buf.clear();
}
五、混合类型
混合类型比如,字符串、基本数据类型混合写入文件,比较复杂,不过方法仍然是建立视图缓冲区,注意每次添加视图缓冲区数据都要更新buf的位置。