java输入输出流问题

时间:2021-04-17 10:55:55
图片很大,当buf满了以后,字节是怎么存进去的?将buf清空之后重新存?整个过程是怎么样的?

import java.io.*;

public class FileTest 
{
public static void main(String[] args)
{
FileInputStream fis = null;
FileOutputStream fos = null;

try 
{
fis = new FileInputStream("d:/1.jpg");
fos = new FileOutputStream("e:/1.jpg");

byte[] buf = new byte[1024];
int n = 0;

while ((n=fis.read(buf)) != -1)
{
fos.write(buf);
}
}
catch (Exception e) 
{
e.printStackTrace();
}
finally
{
try 
{
fis.close();
fos.close();

catch (IOException e) 
{
e.printStackTrace();
}
}
}
}

6 个解决方案

#1


n=fis.read(buf)
这一句的代码就应该是,把fis里的字节读出来,写到buf数组里,意思就是没一次循环都会用最新读到的内容覆盖掉上一次循环读到的内容,每次读到的数据只有数组定义的那么大,这个数组就起到了缓存的作用,不至于,一下子把原文件直接读到内存,若是个很大的文件,直接内存溢出了,所有用这个数组缓冲。

#2


恩,这个数组就相当于缓冲区的作用

#3


引用 1 楼 xiukongtiao 的回复:
n=fis.read(buf)
这一句的代码就应该是,把fis里的字节读出来,写到buf数组里,意思就是没一次循环都会用最新读到的内容覆盖掉上一次循环读到的内容,每次读到的数据只有数组定义的那么大,这个数组就起到了缓存的作用,不至于,一下子把原文件直接读到内存,若是个很大的文件,直接内存溢出了,所有用这个数组缓冲。

这个我知道,但我不明白的是,如果每一次用新读到的内容覆盖之前的内容的话,那假如文件大小不是buf大小的整数倍的话,最后一次写的内容不是会出错?

#4


引用 3 楼 yiwenjingren 的回复:
引用 1 楼 xiukongtiao 的回复:
n=fis.read(buf)
这一句的代码就应该是,把fis里的字节读出来,写到buf数组里,意思就是没一次循环都会用最新读到的内容覆盖掉上一次循环读到的内容,每次读到的数据只有数组定义的那么大,这个数组就起到了缓存的作用,不至于,一下子把原文件直接读到内存,若是个很大的文件,直接内存溢出了,所有用这个数组缓冲。

这个我知道,但我不明白……

不是整数倍的话,对多少算多少,buf不一定要装满的吧。然后再写出去,不会出错的吧。

#5


引用 4 楼 daijope 的回复:
引用 3 楼 yiwenjingren 的回复:

引用 1 楼 xiukongtiao 的回复:
n=fis.read(buf)
这一句的代码就应该是,把fis里的字节读出来,写到buf数组里,意思就是没一次循环都会用最新读到的内容覆盖掉上一次循环读到的内容,每次读到的数据只有数组定义的那么大,这个数组就起到了缓存的作用,不至于,一下子把原文件直接读到内存,若是个很大的文件,直接内存溢出……

我知道了,应该调用这个函数才对 fos.write(buf, 0, n);

#6


引用 5 楼 yiwenjingren 的回复:
引用 4 楼 daijope 的回复:
引用 3 楼 yiwenjingren 的回复:

引用 1 楼 xiukongtiao 的回复:
n=fis.read(buf)
这一句的代码就应该是,把fis里的字节读出来,写到buf数组里,意思就是没一次循环都会用最新读到的内容覆盖掉上一次循环读到的内容,每次读到的数据只有数组定义的那么大,这个数组就起到了缓存的作用,不至于,一下子把原文件直……

恭喜!!

#1


n=fis.read(buf)
这一句的代码就应该是,把fis里的字节读出来,写到buf数组里,意思就是没一次循环都会用最新读到的内容覆盖掉上一次循环读到的内容,每次读到的数据只有数组定义的那么大,这个数组就起到了缓存的作用,不至于,一下子把原文件直接读到内存,若是个很大的文件,直接内存溢出了,所有用这个数组缓冲。

#2


恩,这个数组就相当于缓冲区的作用

#3


引用 1 楼 xiukongtiao 的回复:
n=fis.read(buf)
这一句的代码就应该是,把fis里的字节读出来,写到buf数组里,意思就是没一次循环都会用最新读到的内容覆盖掉上一次循环读到的内容,每次读到的数据只有数组定义的那么大,这个数组就起到了缓存的作用,不至于,一下子把原文件直接读到内存,若是个很大的文件,直接内存溢出了,所有用这个数组缓冲。

这个我知道,但我不明白的是,如果每一次用新读到的内容覆盖之前的内容的话,那假如文件大小不是buf大小的整数倍的话,最后一次写的内容不是会出错?

#4


引用 3 楼 yiwenjingren 的回复:
引用 1 楼 xiukongtiao 的回复:
n=fis.read(buf)
这一句的代码就应该是,把fis里的字节读出来,写到buf数组里,意思就是没一次循环都会用最新读到的内容覆盖掉上一次循环读到的内容,每次读到的数据只有数组定义的那么大,这个数组就起到了缓存的作用,不至于,一下子把原文件直接读到内存,若是个很大的文件,直接内存溢出了,所有用这个数组缓冲。

这个我知道,但我不明白……

不是整数倍的话,对多少算多少,buf不一定要装满的吧。然后再写出去,不会出错的吧。

#5


引用 4 楼 daijope 的回复:
引用 3 楼 yiwenjingren 的回复:

引用 1 楼 xiukongtiao 的回复:
n=fis.read(buf)
这一句的代码就应该是,把fis里的字节读出来,写到buf数组里,意思就是没一次循环都会用最新读到的内容覆盖掉上一次循环读到的内容,每次读到的数据只有数组定义的那么大,这个数组就起到了缓存的作用,不至于,一下子把原文件直接读到内存,若是个很大的文件,直接内存溢出……

我知道了,应该调用这个函数才对 fos.write(buf, 0, n);

#6


引用 5 楼 yiwenjingren 的回复:
引用 4 楼 daijope 的回复:
引用 3 楼 yiwenjingren 的回复:

引用 1 楼 xiukongtiao 的回复:
n=fis.read(buf)
这一句的代码就应该是,把fis里的字节读出来,写到buf数组里,意思就是没一次循环都会用最新读到的内容覆盖掉上一次循环读到的内容,每次读到的数据只有数组定义的那么大,这个数组就起到了缓存的作用,不至于,一下子把原文件直……

恭喜!!