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的位置。
- Java通道方法写文件中缓冲区建立的原则
- Java中重载方法的使用原则
- JAVA复制文件最快速的方法:用文件通道的方式来进行文件复制
- Java里清空缓冲区的方法
- 无缓冲区写文件
- 【Java】利用文件通道的方式改进Java复制单个文件的方法
- Java学习笔记——利用通道写文件
- java nio学习:缓冲区、通道和选择器
- 建立缓冲区的几个问题
- java 方法覆写与重载原则
- java nio中buffer缓冲区一些方法
- JAVA 写文件方法
- 向文件中写数据的方法
- Android|Java 写文件优化(使用缓冲区)
- java文件高速拷贝方法(文件通道)
- 收藏 java追加写文件的方法
- java 写文件的三种方法
- java写文件追加的方法
- 算法导论 最优搜索树
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来
- 黑马程序员--Java数组
- Java 排序实现
- vsftp功能分析及虚拟用户服务
- Java通道方法写文件中缓冲区建立的原则
- poj 3162(dfs+单调队列)
- Uva 562 背包DP
- c++命名空间三种实现文件的区别
- ViewPager例子//水平滑动
- C++标准模板库分析之二
- 六款优秀的Linux Web缓存开源软
- Ubuntu linux中怎么查看自己的串口连接情况
- 原码、反码、补码、移码