看情况吧
当然你心情好了可以一个字节一个字节的读;
为什么要用byte,其实java读写文件调用的依然是底层 *** 作系统的接口
在 *** 作系统层面数据时按照块来读的
申请byte数组的目的是在jvm中开辟一块空间,然后调用jvm *** 作指令,jvm根据指令告诉 *** 作系统,把这块数据给我填满 *** 作系统填满之后,java就返回了
为什么要用byte因为byte是数据存储的最小单位了
所以byte[]数组就是一次性读取多少个最小单位,然后返回
这只是简单的描述,要更详细的了解,建议读java language specification (jls),jls3好像是15,16的jls7是jdk17的还有就是 *** 作系统原理相关的书
只能回答这么多了,再深的我也不懂~
不会,你可以设定一个指定大小的数组,然后重复读写。
import javaio;
public class FileStreamDemo2 {
public static void main(String[] args) throws IOException {
//创建两个文件
File inFile = new File("tcty36rm");
File outFile = new File("newtcty36rm");
//最大的流为60Mb,当文件的容量大于60Mb的时候便分开流
final int MAX_BYTE = 60000000;
long streamTotal = 0; //接受流的容量
int streamNum = 0; //流需要分开的数量
int leave = 0; //文件剩下的字符数
byte[] inOutb; //byte数组接受文件的数据
//创建流文件读入与写出类
FileInputStream inStream = new FileInputStream(inFile);
FileOutputStream outStream = new FileOutputStream(outFile);
//通过available方法取得流的最大字符数
streamTotal = inStreamavailable();
//取得流文件需要分开的数量
streamNum = (int)Mathfloor(streamTotal/MAX_BYTE);
//分开文件之后,剩余的数量
leave = (int)streamTotal % MAX_BYTE;
//文件的容量大于60Mb时进入循环
if (streamNum > 0) {
for(int i = 0; i < streamNum; ++i){
inOutb = new byte[MAX_BYTE];
//读入流,保存在byte数组
inStreamread(inOutb, 0, MAX_BYTE);
outStreamwrite(inOutb); //写出流
outStreamflush(); //更新写出的结果
}
}
//写出剩下的流数据
inOutb = new byte[leave];
inStreamread(inOutb, 0, leave);
outStreamwrite(inOutb);
outStreamflush();
inStreamclose();
outStreamclose();
}
}
参数和返回值是两个概念。参数有两类,一类是仅仅作为读取的元素被引入,方法结束后不发生变化。一类则是参与到处理中,结束后发生变化。如果处理比较复杂,往往会使用第二类参数获取数据。
而返回值往往是处理的结果,最简单的往往是处理成功或失败。或者是没有结果就是成功,失败抛异常。
在inread中主要 *** 作是针对参数byt的,也就是把输入的数据存入到byt中。不过对于inread *** 作来说,用户输入了多少数据也是很重要的,所以返回值里就返回了输入的字节数。当然,也可以做个对象,同时返回byte数组和处理件数,或者返回一个新的byte数组,这取决于一开始对于inread的设计。java开发者选择了用户自申请缓冲区的做法,就是现在的作法了。
(顺便说一下, 让用户自己new一个byte数组当作缓冲区,然后传进来,可以比较好的适应低内存环境,例如早期电脑,例如嵌入式设备)
以上就是关于JAVA 读文件一定得创建byte数组为什么全部的内容,包括:JAVA 读文件一定得创建byte数组为什么、java的byte数组最多存储多少字节只用FileInputStream读取文件和只用FileOutputStream写入文件会出问题吗、byte[]数组的用法。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)