write()只能写入右边低位的8位,要想把最左边的8位写进去就得把左边的移动到右边来,移动24位过后最左边的8位就到了最右边,就能写了
从你的输出看,你的代码应该是敲错了,i对应的4个字节是127,-1,-1,-1;一共写了两次i。“中”对应的是-42,-48;
高位是在左边,写入是优先写入低8位,也就是一个字节,为了保证连续4次写入之后,i被正确写入到文件中,应该先写高八位,也就是左边的8位,所以才进行了相关的移位操作!
高位低位,可以简单的理解为:大的为高位,小的为低位。
我是这么理解的:4个字节,1个字节是8位。所以第一次右移24位,把最前面8位(第25-32位)的移到第1-8位
File 类有两种构造器,一种构造器的参数是 FIle (String, String),还有一种就是File (File, String),你可以看一下Java的文档
需要一点大小端,高低位,位运算, 字节,字符,编码相关的基础知识
那你正常写就好了啊 char c='A';
raf.write(c);
System.out.println(c);
类似于这样
我这可以输出呀
1L说的很好 希望采纳一下 谢谢
因为默认gbk,你可以设置成utf-8试试
因为你的编码方式是默认的编码方式utf-16be 而在写入“中” 这个汉字是 转换为字节数组是 采用的是GBK编码方式 byte[] gbk=s.getBytes("gbk"); 所以在文件中 存在2个GBK编码方式的字节。而在后面的读时 用的是默认的编码方式将文件里的提取出所有的。而又2个不是这种了类型的 则会出现乱码. 个人理解
java中指针的概念是隐式的,指向文件中的某个字节,当打开文件时候,指针指在文件开头,pointer=0,每一次向文件中output字节,指针都会移动,Xxx.seek(0); 是让指针回到文件头部。
存储器是一个大集合,每一个元素为一个位,一个位存储一个0或者一个1。8个位为一个byte,即数据存储时以8位为一个有效数字,
Ctrl + 鼠标左键(如果提示找不到源码的话,可以在Windows-->Preferences-->Java-->Installed JREs里面设置)
可能是gbk编码本身的问题
writeInt()方法中的源码 每次读取字节信息 都是经过了一次无符号右移和位与操作。 而老师在写入一个字节的时候并没有写位与操作。 因此其实写不写都可以 因为每次读取的信息都是低八位。 但是源码中的位与操作 确实做到了“清零”。 这个清零意思指的是 将前面24高位均置为0.
举负数说明: 11111111 11111111 11101000 11110111
右移24位 00000000 00000000 00000000 11111111 位与0xff 后 结果 为0xff 读取 0xff
右移16位 00000000 00000000 11111111 11111111 位与0xff后 结果为 0xff 读取 0xff
右移8位 00000000 11111111 11111111 11101000 位与0xff后 结果为 0xe8 读取0xe8
右移0位 11111111 11111111 11101000 11110111 位与0xff后 结果为0xf7 读取0xf7
看资料说 读取字节信息 进行位与0xff操作 是为了保证二进制数据的一致性。 这样传输的二进制信息是安全的。
解决了,是我之前创建了RandomAccessFile这个类,所以不能弹出工具包里的RandomAccessFile类
i是int型的是四个字节,由于每次只能读写一个字节,所以把i写进去需要写四次
首先,gbk编码方式是中文占两个字节,英文占1个字节。但是,Java是双字节编码,采用的是utf-16be编码方式,而utf-16be编码是中文和英文都占两个字节。这里的write()写A、B、i 都是采用的Java默认的编码,只是后面的汉字“中”才采用的gbk编码,所以老师getBytes("gbk")传入了编码方式。
因为A是char 型,16位,本身是占两个字节。我猜你是上面这个知识点没弄明白。
这里老师就是想说明write()方法一次只能写一个字节,所以这里A只写了后8位,所以A是没有读写完的。但是后面能正常被read()读出来,是因为A本身后8位字节就表示它了(01000001),前8位都是0。
显示的写明File对象的编码方式即可
file创建的文件默认是ansi编码 后面的不清楚你想表达什么意思
buf中存的是整数的补码,String s2 = new String(buf)解码用的是项目默认的编码,所以会烂码
b和1111 1111 1111 1111相与前边位数为0
java 中的string 是不可变的,write的时候虽然右移了但是并没有改变 str1本身,而是重新创建了一个右移后的字节,因此不会有你说的问题。不知道这样讲明白么?
RandomAccessFile 一次只能写一个字节,"a"是个字符串,可以换成'a'或者"a".getBytes();
getBytes()方法可以设置编码类型如gbk,utf-8等