Java通道方法写文件中缓冲区建立的原则

来源:互联网 发布:优化实践技能 编辑:程序博客网 时间:2024/05/20 12:47

一、             字符串

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的位置。

原创粉丝点击