Java 映射缓冲区读取整数
我有两个简单的函数来编写int并从映射文件中读取它,但其中一个函数似乎是错误的Java 映射缓冲区读取整数,java,buffer,nio,Java,Buffer,Nio,我有两个简单的函数来编写int并从映射文件中读取它,但其中一个函数似乎是错误的 导入java.io.File; 导入java.io.FileNotFoundException; 导入java.io.IOException; 导入java.io.RandomAccessFile; 导入java.nio.MappedByteBuffer; 导入java.nio.channels.FileChannel; 导入java.util.Random; 公共类Memorimappedfileinjava{ /
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.io.IOException;
导入java.io.RandomAccessFile;
导入java.nio.MappedByteBuffer;
导入java.nio.channels.FileChannel;
导入java.util.Random;
公共类Memorimappedfileinjava{
//文件
文件;
//用于将文件内容连接到缓冲区的通道
文件通道;
//缓冲区
MappedByteBuffer缓冲区;
//缓冲区最大大小(字节)
最终整数缓冲区_MAX=32;
@抑制警告(“资源”)
MemoryMappedFileInJava(){
file=新文件(“file.txt”);
//创建用于写入和读取的通道
试一试{
通道=新的随机访问文件(文件,“rw”).getChannel();
}catch(filenotfounde异常){
e、 printStackTrace();
}
//将文件内容映射到缓冲区
试一试{
buffer=channel.map(FileChannel.MapMode.READ\u WRITE,0,buffer\u MAX);
}捕获(IOE异常){
e、 printStackTrace();
}
}
//从缓冲区读取值
int readInt(){
整数=0;
int c=buffer.getInt();
缓冲器位置(0);
而(c!='\0')
数字+=c;
返回号码;
}
//将消息发送到缓冲区
无效写入(整数){
缓冲器位置(0);
buffer.putInt(数字);
buffer.putChar('\0');
}
//关闭频道
void closeChannel(){
试一试{
channel.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
//让我们用随机数做一些测试
静态无效运行(){
随机r=新随机();
MemoryMappedFileInJava通信=新建MemoryMappedFileInJava();
整数=r.nextInt(5)+1;
通信、书写(编号);
String prefix=“缓冲区中的给定数字为-->”;
System.out.print(前缀+communication.readInt());
}
公共静态void main(字符串[]args)
{
run();
}
}
我用来运行此代码的完整代码也可以从这里编译和运行:
输出打印总是给出0,如果是在写函数或读函数中,我找不到哪里有问题。我不理解
数字变量或的原因,而readInt
方法中的循环。如果您只想从缓冲区开始读取int
,那么将readInt
方法更改为以下方法就可以了:
int readInt() {
buffer.position(0);
return buffer.getInt();
}
我怀疑这段代码是否给了您任何东西,因为由于主要的语法和编译错误,它无法运行。请发布您正在编译和运行的实际代码。@MarcoR。添加了我用来运行此代码的完整代码链接:在SO中,您的问题必须完整。会员不会在互联网上查询你问题的细节;因此,编辑您的问题并将来源发布在此处。这个问题的任何非必要细节都可以在这里找到必要的细节后链接。@MarcoR。你是对的,我已经在我的问题帖子中更新了代码。去掉处理NUL字符的部分。它们不是必需的,其中一些没有任何意义。实际上,您甚至不需要这些方法:直接调用getInt()
和putInt()
。我不明白你为什么要计算缓冲区。位置(0)
。真的只有一个号码吗?在文件的开头?注意:这些是二进制数,不应写入名为.txt的文件。