老师,问个问题

老师,问个问题

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整数值,至于为啥返回整数值,我去查了一下资料,也没看懂下面写的啥意思http://img1.sycdn.imooc.com//climg/6065d187098d88d012340808.jpg


3--byte数组可以放1024个字节,所以,我们就一次一次的取呗,取了一个字节他就放进数组里面,取了1024个字节之后了,我的理解是n的值也变成了1024了,这时,byte数组满了,就得把这个数组存的字节数据写进目标源了,(至于大家为啥都用1024来表示byte数组的长度,我的理解是1024个字节正好等于1kb,这样比较好换算把!),等数组中的数据都写进去了,重新把1024个字节写进去数组,依次类推。


4--等到了最后一次了,read()方法读不到字节了,他就返回-1,这时候数据源里面的字节数量不足1024个了,但是n也会记录实际读了多少个字节,在吧这些剩余的数据写进去目标源,最后一次写进去的数量也就是获得的数量字节,不会是1024个,也不会造成文件变大。


5--老师,我只能思考个大概,对于我这个学了十几天的Java的菜鸟说,理解不了深的东西,强行死抠,可能最后也看不懂,还浪费时间,因为现在自己还没到那个层次,我哪里理解错了,老师可以指点下,我好不容易写的总结,老师,请你好好看下。

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好

1、同学的第一点理解的是正确的

2、同学上面的第二点,read(byte[] b) 并不是一次获得一个字节,而是读取一定数量的字节,返回值n是读取的字节数

关于同学下面的第二点,文件图片是以二进制的形式进行存储的,但是老师也不能确定read()方法会不会把二进制变为十进制,但是read(byte[] b)方法读取的就是字节数据

3、

1)同学上面的第三点理解是正确的,返回的并不是十进制整数,而是读入缓冲区的字节总数

官方解释如下:

http://img1.sycdn.imooc.com//climg/60668d6009a5b3a308950359.jpg

可以理解为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个字节写入到文件。

http://img1.sycdn.imooc.com//climg/606691c309e4e7c505970356.jpg

​比如fos.write(b,0,n)是将字节数组b中前n个字节写入到文件。

4、同学的理解是正确的,具体解释可参考第三点

5、关于底层数据的处理及转换同学可以先不用深究,现阶段同学先会使用,然后等基础扎实后再来研究

祝学习愉快~

  • 阿山123 提问者 #1

    根据老师的回答,和我自己的发现,我发现一个有意思的问题,课程上老师也没有讲到的知识点。

    1--read()和read(byte[] b)这两个方法时重载方法,都是返回的int值。只是这个返回的int值不一样,这点老师也没讲。

    2--read()方法返回的应该是一个十进制的数,会把8位二进制的byte转成十进制0-255,他返回的是一个值且read()这个方法,也确实是一次只能获得一个字节,下图是我测试的。http://img1.sycdn.imooc.com//climg/60669a7b099ae02014920927.jpg

    3--read(byte[] b)这方法,调用read()方法,还是一次只是获得一个byte值,只是他这个重载方法,返回的int值,不是值了,是他获得的具体多少个字节数量了,所以write(b,0,n)要这样写


    2021-04-02 12:23:58
  • 好帮手慕阿园 回复 提问者 阿山123 #2

    同学你好

    1、同学的理解是正确的,老师在课程中虽然没有明确的讲到这两个方法的区别,但是老师用代码进行了演示

    2、不带参数的read()方法是从此输入流中读取一个字节数据

    3、同学整体理解是正确的,但是read(byte[] b)方法并不是调用的read()方法,如下

    http://img1.sycdn.imooc.com//climg/6066b8f1094a7c1c06290094.jpg

    祝学习愉快~

    2021-04-02 14:26:28
阿山123 提问者 2021-04-02 02:05:00

老师,我说错了。我改变下第二点和第三点的说法。
2--在计算机中,文件图片各种都是二进制存储的,,八位二进制可以换算成十进制的0-255之间的数字,一个byte子节转换成十进制也是0-255的整数,所以八位二进制确实他就是一个byte子节,而read()方法就是把二进制变成十进制,就是从数据源取出8位二进制换算成十进制整数返回!

为啥叫字节流了,现在我懂了,他就是取出一个又一个字节,其实从本质上来说,他取出的是八位的二进制!

3--所以我在第三点说错了,每次返回的是一个十进制的整数,并不是1024,我之前想成了是计数用的了,byte数组中存放的实际是一个个十进制0-255之间的数字。关于write(b,0,n)我的认为是从下标为0的值,到n这个值的下标,之间的数值都会被写进目标源。

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师