老师,问个问题
package com.imooc.fileoutstream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class ImageDemo {
public static void main(String[] args) {
// 文件拷贝
try {
FileInputStream in=new FileInputStream("C:\\Users\\Administrator\\Desktop\\io\\\\2.jpg");
FileOutputStream out=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\io\\\\2copy.jpg");
int n=0;
byte[] b=new byte[1024];
while((n=in.read(b))!=-1) {
out.write(b,0,n);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
}
说句实话,视频上的讲的有点浅,我们新学的都是一脸懵逼。然后我去查了一些资料,才算是能有个大概明白这个几句代码的意思。
int n=0;
byte[] b=new byte[1024];
while((n=in.read(b))!=-1) {
out.write(b,0,n);
1--定义一个整型n,初始值为0;
2--定义一个长度为1024的字节的数组,里面可以存放1024个字节,这个数组就是个数据缓冲存放区,在计算机中,数据传输都是8个二进制位,也就是一个byte(字节),read方法的原理就是一次获得一个字节,然后返回一个int整数值,至于为啥返回整数值,我去查了一下资料,也没看懂下面写的啥意思
3--byte数组可以放1024个字节,所以,我们就一次一次的取呗,取了一个字节他就放进数组里面,取了1024个字节之后了,我的理解是n的值也变成了1024了,这时,byte数组满了,就得把这个数组存的字节数据写进目标源了,(至于大家为啥都用1024来表示byte数组的长度,我的理解是1024个字节正好等于1kb,这样比较好换算把!),等数组中的数据都写进去了,重新把1024个字节写进去数组,依次类推。
4--等到了最后一次了,read()方法读不到字节了,他就返回-1,这时候数据源里面的字节数量不足1024个了,但是n也会记录实际读了多少个字节,在吧这些剩余的数据写进去目标源,最后一次写进去的数量也就是获得的数量字节,不会是1024个,也不会造成文件变大。
5--老师,我只能思考个大概,对于我这个学了十几天的Java的菜鸟说,理解不了深的东西,强行死抠,可能最后也看不懂,还浪费时间,因为现在自己还没到那个层次,我哪里理解错了,老师可以指点下,我好不容易写的总结,老师,请你好好看下。
正在回答
同学你好
1、同学的第一点理解的是正确的
2、同学上面的第二点,read(byte[] b) 并不是一次获得一个字节,而是读取一定数量的字节,返回值n是读取的字节数
关于同学下面的第二点,文件图片是以二进制的形式进行存储的,但是老师也不能确定read()方法会不会把二进制变为十进制,但是read(byte[] b)方法读取的就是字节数据
3、
1)同学上面的第三点理解是正确的,返回的并不是十进制整数,而是读入缓冲区的字节总数
官方解释如下:
可以理解为read(byte[] b) 是 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。
给同学举个例子,比如字节数组b长度为10,那么如果文件中有12个字节数据,调用read(byte[] b)方法读取了10个字节,数组读满了,此时方法会返回10,代表读取10个字节。如果还想读取剩下的2个字节应该再调用一次read(byte[] b),这时方法会返回2,代表读取到2个字节。
2)关于write()方法同学理解的是正确的
write(byte[] b, int off, int len)方法是将指定byte数组中从off开始的len个字节写入到文件。
比如fos.write(b,0,n)是将字节数组b中前n个字节写入到文件。
4、同学的理解是正确的,具体解释可参考第三点
5、关于底层数据的处理及转换同学可以先不用深究,现阶段同学先会使用,然后等基础扎实后再来研究
祝学习愉快~
老师,我说错了。我改变下第二点和第三点的说法。
2--在计算机中,文件图片各种都是二进制存储的,,八位二进制可以换算成十进制的0-255之间的数字,一个byte子节转换成十进制也是0-255的整数,所以八位二进制确实他就是一个byte子节,而read()方法就是把二进制变成十进制,就是从数据源取出8位二进制换算成十进制整数返回!
为啥叫字节流了,现在我懂了,他就是取出一个又一个字节,其实从本质上来说,他取出的是八位的二进制!
3--所以我在第三点说错了,每次返回的是一个十进制的整数,并不是1024,我之前想成了是计数用的了,byte数组中存放的实际是一个个十进制0-255之间的数字。关于write(b,0,n)我的认为是从下标为0的值,到n这个值的下标,之间的数值都会被写进目标源。
- 参与学习 人
- 提交作业 9393 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星