read()跟write()读取文件的时候,i的作用是啥?代表着啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了read()跟write()读取文件的时候,i的作用是啥?代表着啥?相关的知识,希望对你有一定的参考价值。

如下代码是将一个文件的内容(hello,world.)copy到另一个文件中,首先main函数第一件事就是 声明了一个 int i=0;再后来在 do while 循环中,i = opin.read(); opin调用了read方法读取字节流,并且赋值给i , 这里我就没搞懂, read()方法的返回值为0~255的整数,为什么在outpt.write(i)的时候,照样可以写入hello,world.到 新文件里?read方法的返回值整数跟字节流的关系是什么样子的?求解答?不知道我描述的清不清楚,请大神支招。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyFile

public static void main(String[] args) throws IOException

int i = 0;
FileInputStream opin;
FileOutputStream outpt;
String path = "C:\\Users\\605922745\\ProjectWorkSpace\\";
// 查找原文件
try
opin = new FileInputStream(path + "old.txt");
catch (FileNotFoundException e)
System.out.println("Not found this old txt");
return;

// 查找输出文件
try
outpt = new FileOutputStream(path + "new.txt");
catch (FileNotFoundException e)
System.out.println("Not found this new txt");
return;

//copy file content;
do
i = opin.read();
if(i != -1)outpt.write(i);

while(i!=-1);
opin.close();
outpt.close();
System.out.print("运行结束");


首先 你的 i = opin.read(); 这行代码是以字节流的形式读取某文件,这里的i其实是一个标记,之所以定义为 int类型,是因为 .read()这个方法,如果读取已到达文件末尾,则返回 -1。
说到这里你应该明白了吧?这个i就是判断文件是否读到了文本的末尾,这里可以不用i,直接这样写也行: if(opin.read()!=-1).... 不知道我这样说能不能表达清楚,如果还不清楚请追问.谢谢

PS;你说的read()返回值在0~255之间没错,但是如果下一个字符没有了,到了文章末尾 是返回-1的

至于你问的为什么 if(i != -1)outpt.write(i); 有写进了write()中.这很好理解,如果i不为-1,则表示没有到末尾,那么就打印出当前的字节流,就是用write(i)追问

那就是说 opin.read() 这个代码只有读取到文件末尾了 ,才会跟 i 有一个交互判断?之前都一直是读取字节流?

追答

是的,你的do while循环,一直在走,每循环一次,就做一次判断

追问

读取的字节流存放到哪了? wirte又是怎么取写入这些字节流的? write(i)为甚麽加入i
这个参数呢?

追答

这个字节流放到了缓存里,这是虚拟机底层做的事, i = opin.read(); 读取了一个字节,返回一个int整型, .write(i);通过这个整型写出相应的字节,你可以用system.out.println

(i) 打印一下这个i,你会发现全是数字,这个数字虚拟机认识,所以在使用write()的时候就可以写出来

追问

那这个程序的实际操作是,read一个,然后就copy 然后写到new文件一个,read 一个再写一个。 不是一次性read了一句话,然后去一次性 write进去的?

追答

嗯是的,不是一次性写进去的,所以这样会增加磁盘的负担,效率不高,有缺陷,一般都使用Buffered这个类来充当缓存,这样就可以一次性写到磁盘里,再看几章就会介绍到这里了

追问

非常感谢你,我这自学java呢,新人! 你们有没有什么javaQQ群之类的,我可以加吗?学习学习

追答

这个我还真没入,我的java也是自学的,多买书看,看视频来的很慢的,除非真的看不懂书了,看视频或者网上搜答案,反正我是这样走来的,不过百度搜能搜一堆得java群吧?
祝你学习进步,一起努力,IT的道路就要不断学习!加油

追问

我也是看书,借的java书,书上的东西毕竟抽象,写起来才是真正的学习过程!那你还有什么好书推荐的吗,我现在看的是《java程序设计》实践教程,我是完全初学者,毛都不懂就开始学java,奋斗!

追答

Java经典的书太多了,多如牛毛,最近JDK8又出来了,有了一些新的语法规则,官方文档是一个很好的学习资料,买一些当当各大图书网站销售最多的java书,这些书都不错, 什么的.

参考技术A i 的作用是查看是否已经读到了文件的末尾,和C++ fread 返回值 EOF 是一个道理追问

为什么要 i=opin.read();? 又为什么把 i 作为参数写在write()方法里?

追答

write(i) 表示写入多少,i=read()返回读取到多少数据,write(i)表示将读到的数据都写入。

追问

i最后不是判断=-1了吗? 那么read()返回的读取到得数据怎么还会付给i?

追答i = opin.read();

if(i != -1)outpt.write(i);

第一句如果返回的是10.

第二句先判断if(10!=-1) outpt.write(i)

意思是如果10不等于-1,我就将这10个数据写进去

参考技术B 这里read的是字节流,你可以吧hello,world当成字节流来看待,这样read就一个字节一个字节的读,然后原原本本的把一个一个字节按照同样的顺序通过write写出去

以上是关于read()跟write()读取文件的时候,i的作用是啥?代表着啥?的主要内容,如果未能解决你的问题,请参考以下文章

read/write函数与(非)阻塞I/O的概念

文件操作

C: read/write

R语言读取excel文件实战(read.xlsx函数read_excel函数read.xlsx函数Write函数)

Read(),Write()

python read() readline() readlines() write() writelines()方法总结与区别