搞错了,图二是对图一的补充
System.out.print(Integer.toHexString(buf[i])+" ");
前面补了0 , 后面这里
nteger.toHexString(buf[i])+
没有去0
你的补0判断没有问题,只不过是因为你的读取文件中,包含了中文,而中文在字节数组中保存的数值是负值,
if(buf[i]<=0xf){
System.out.print("0");
}
所以但凡是中文 都会经由此补上0,而且看你输出的全是3位补0,应该是全文字内容,你再加入一点字母数字,就会发现有3位和两位并存的现象
字节数组不足以存放文件中的字节数据时,又想读完文件中的数据,这个时候,就要用到while循环了。
如果字节数组足够大,可以放下整个文件的数据时,就不需要用到while循环了,只读一次就行了。
但是,一般情况下,还是要用while循环,因为字节数组初始大小,无法保证适合所有的情况。
System.out.print(Integer.toHexString(buf[i] & 0xff)+" ");括号
好好复习基础,整形可以有二进制形式、8进制、16进制和10进制,那个tohexstring()就是16进制显示
一看那就知道没有好好听课,那是老师自定义的函数,你再回放看看
因为数据在计算机存储的时候用的是补码形式,如果最高位是1的话,会默认补1,4个1不就是f吗
数组中有负数,所有必须避免负数
十六进制让我们看起来更加简短,如果32位的0,1会让你看起来很难受,16进制就很好的解决了这个问题
那个bur[i]要&0xff 而且你前面那是bur[i]<0xff不是0xf,
Integer.toHexString() 类型你写错了,括号里不是string类型,去掉双引号
in.read(buf,0,buf.length),这个方法返回的是它读取到的字节个数!
正如你假设的,文件100字节,buf容量80字节:
第一次读取的时候是返回80;
第二次进入while的时候,文件读取的字节是从第81个字节开始(读取的时候文件有个指针一边读一边移动的,前面老师讲过),就是说文件还剩下20个字节可读,所以这时候返回的字节是20;
第三次进入while的时候,文件已经没有内容可读了,所以返回的是-1;
这时候就跳出了while!
纯手打!望采纳!
问题和代码无关,你只要输出System.out.println(0xffffffff)就会得到-1;原因是int 是有符号位,占4个字节,而0xffffffff是以int类型存储的,int是有符号的。即1111 1111 1111.......第一位被用来记录符号,所以这里就被解释为负号了,而Java在编码时,存储的是负数的补码,所以你的1111.....就成了1000......+1就是10000.....1就是-1啦。
所以16进制最大的数是0x7fffffff.
没关系的,转不转换没什么意义,这只是讲师的个人习惯
我跟你的感觉差不多,不过我是用两倍速率播放的,只要稍微不分神就会跟不上节奏.整理一下思路
io流的大致用途
文件访问/内存缓存访问/缓冲/过滤/解析/读写文本 (Readers / Writers)/读写基本类型数据 /读写对象
假设你黑进别人电脑,需要读写操控数据的时候..................你会发现,哇,这些东西好有用啊
最后,不懂多练多百度就行了,特别是百度,每个大神的不同经验不同的视角解读同一样东西,你用心学习会拥有你自己的领悟.
祝,一帆风树
以题主的代码为例:
我所理解题主的困惑在于,for循环中限制条件为什么是n而bytes.length。
首先我简要解释一下这个n与bytes.length的区别:
length是一个in类型的整数,用于记录bytes这个字节数组的长度。length表示这bytes的最大容量,是一个大小始终不变的固定值。
n是也一个int类型的整数,用于接受file的read方法的返回值。因为这个返回值表示一次读取从bytes数组中到的字节数,所以n就随着每次从bytes中读取的字节数的变化而变化。
看来这里题主可能会想,file的read方法每次从bytes中读取的字符数难道不都是length吗?这样n岂不是恒等于length吗?这样for有的限制条件不是选择n与length都行了吗?
上面一连串的推测似乎合情合理。其实题主请思考一下,while循环中的read方法真每次都能读到length个字节码?
题主是否考虑到read方法读到了文本末尾的情况呢?最后一次读取中,题主所选的文本是否还有足够的字节流入到bytes字节数组呢?到了这里,不知道题主是否明了。
如果您仍有疑问,可以私我,我会尽快回复。望采纳。
你好,
一开始read返回的是读取的字节数;当把内容都读完后,返回的数为-1
举个例子:
例如要读取的文件字节数是100,buf.length为60。
第一次read返回给bytes的是读取的字节数:大小为数组的长度60;
第二次read返回给bytes的还是读取的字节数,但大小为剩下的100-60=40了;
第三次由于到文件末尾,100个字节内容都读完了,read就返回-1给bytes
综上,文件没读完时,read返回的是读取的字节数;文件读完后,read返回的是-1,用于判断文件是否读取完成。
望采纳。
是向文件输出还是向集成环境控制台输出?
少读不少读,这个你看前面循环的需要,自己灵活运用哪一种,一般现实开发中do while 很少使用,因为前后逻辑都你写的
贴代码来看看呢
FileInputStream(file)是一个输入字节流,返回的是FileInputStream类型.可以直接用啊!不知道你为什么会这样问!
。。。
把在Eclipse 下面 Console关了(那个X)再重新运行就可以了。
因为Java重载了几个read方法 每个方法返回的值有所不同 你写的这个调用他返回的就是读取到的字节的长度 也就是实际读取到了多少个字节
以上是个人理解
就是通过while循环,read的指针不断往后移,开始是开足马力每次都length长度,只有可能到最后一次,read不足length。由此实现只需要开辟一个很小空间的byte[]就可以读入很多的字节
while条件里bytes是int类型,先执行bytes=in.read(buf,0,buf.length)对bytes赋值,再判断bytes是不是等于-1,bytes表示buf中读到数据的长度(<=buf.length),没读到返回-1,buf.length=0时返回0
0到buf.length的长度是你定义的byte数组的长度
你一次性最多读取的字节长度是byte数组长度,但是你的文件字节数往往是多于你定义的byte数组长度
所以就用到了for循环,0xff是取低八位,八位为一个字节!!!
望采纳QAQ