黑马程序员技术交流社区

标题: 关于I/O,提问完毕!!! [打印本页]

作者: OmbreAmant丶C    时间: 2016-6-13 19:30
标题: 关于I/O,提问完毕!!!
本帖最后由 OmbreAmant丶C 于 2016-6-23 00:04 编辑

如题,今天刚学I/O,有点搞不清 输入输出  还有Copy 原理 有大神可以指点下么?-----------------------------------------华丽的分割线---------------------------------------------
现在再说数据库了  有点搞不定 大牛们有没有好的建议 学好一点!!!!

作者: TCK8888    时间: 2016-6-13 20:01
input reader,表示把数据写到流中,比如从文件中读取数据到流中或者内存,output,writer,把数据从流中读或者写出来,比如保存在文件中,有个比喻,input reader就是拿个桶往水池里加水,output,writer把水池的水放到桶中
作者: OmbreAmant丶C    时间: 2016-6-13 20:13
TCK8888 发表于 2016-6-13 20:01
input reader,表示把数据写到流中,比如从文件中读取数据到流中或者内存,output,writer,把数据从流中读或 ...

谢谢你的解答 这个比喻很不错我记住了 再次感谢!!!
作者: lifeiwangyue    时间: 2016-6-13 23:01
相当于写的java代码,输出就是输出流 从外面向代码读就是输入流了
作者: OmbreAmant丶C    时间: 2016-6-14 21:43
lifeiwangyue 发表于 2016-6-13 23:01
相当于写的java代码,输出就是输出流 从外面向代码读就是输入流了

谢谢!!!
作者: haojingwei310    时间: 2016-6-14 22:12
输入和输出的主题都是相对于内存而言的,   内存往外部( 文件 ) 写内容是 输出,
内存从外部读入叫做输入流,   而所有流最根本的都是字节流,,  , 通过各种流架起的管道 实现数据 在内存和外部之间的信息交流
作者: jhyang    时间: 2016-6-14 22:39
关于Copy的原理,输入流FileInputStream创建对象关联一个文件(可以是相对路径,也可以使绝对路径),而输出流FileOutputStream创建对象关联另一个文件(FileOutputStream如果没有相对文件,内部会创建一个)。Copy也就是说将前者关联的文件内容Copy到后者关联的文件中。用while循环逐个字节读取,也就是说,从这里拿多少,就给那边多少。一直到结尾(返回-1)为止。(也可以使用Buffered或者小数组来提升效率)。
作者: 善良的死神达乐    时间: 2016-6-15 01:19
jhyang 发表于 2016-6-14 22:39
关于Copy的原理,输入流FileInputStream创建对象关联一个文件(可以是相对路径,也可以使绝对路径),而输 ...

快速回答....为什么-1是int类型,不是byte类型的
作者: OmbreAmant丶C    时间: 2016-6-15 12:25
haojingwei310 发表于 2016-6-14 22:12
输入和输出的主题都是相对于内存而言的,   内存往外部( 文件 ) 写内容是 输出,
内存从外部读入叫做输入流,  ...

谢谢你百忙之中给我的指点!!!!
作者: OmbreAmant丶C    时间: 2016-6-15 12:27
善良的死神达乐 发表于 2016-6-15 01:19
快速回答....为什么-1是int类型,不是byte类型的

我觉得应该是默认整数都是 int 吧!
作者: OmbreAmant丶C    时间: 2016-6-15 12:28
jhyang 发表于 2016-6-14 22:39
关于Copy的原理,输入流FileInputStream创建对象关联一个文件(可以是相对路径,也可以使绝对路径),而输 ...

谢谢你的回答!!!
作者: jhyang    时间: 2016-6-15 21:47
善良的死神达乐 发表于 2016-6-15 01:19
快速回答....为什么-1是int类型,不是byte类型的

因为read()方法的返回值是int
作者: 善良的死神达乐    时间: 2016-6-15 22:30
OmbreAmant丶C 发表于 2016-6-15 12:28
谢谢你的回答!!!

首先我们要知道,程序运行是以补码的形式存在的,当byte读到文件的中间时,很有可能出现11111111的情况,而且这8个1就是byte的-1.并且,程序规定是遇到-1就停止运行,这样问价读到一半就不读了,这不是八阿哥嘛?所以不能用byte.
但是int不一样,因为int会在前面默认加上24个0,也就是说,永远不会出现-1的情况,并且在写出的时候,系统也会自动砍去24个0.这...就是原因...
作者: 善良的死神达乐    时间: 2016-6-15 22:35
jhyang 发表于 2016-6-15 21:47
因为read()方法的返回值是int

首先我们要知道,程序运行是以补码的形式存在的,当byte读到文件的中间时,很有可能出现11111111的情况,而且这8个1就是byte的-1.并且,程序规定是遇到-1就停止运行,这样问价读到一半就不读了,这不是八阿哥嘛?所以不能用byte.
但是int不一样,因为int会在前面默认加上24个0,也就是说,永远不会出现-1的情况,并且在写出的时候,系统也会自动砍去24个0.这...就是原因...
作者: dubei1993    时间: 2016-6-16 00:34
善良的死神达乐 发表于 2016-6-15 01:19
快速回答....为什么-1是int类型,不是byte类型的

返回的是长度.无数据返回-1,好比是查数据索引,索引不存在。源码返回-1
作者: dubei1993    时间: 2016-6-16 00:47
善良的死神达乐 发表于 2016-6-15 22:30
首先我们要知道,程序运行是以补码的形式存在的,当byte读到文件的中间时,很有可能出现11111111的情况,而且 ...

我请问你在哪里看到的这些?感觉不太对,文本中存储的都是汉子或字符,都要编码后读入内存的。。怎么会有11111111这样的东西?如果文本文件中有-1,因为读取一般为1024字节。你说的read()一次读取一个字节时返回值是null才退出的。。
作者: OmbreAmant丶C    时间: 2016-6-16 21:58
善良的死神达乐 发表于 2016-6-15 22:35
首先我们要知道,程序运行是以补码的形式存在的,当byte读到文件的中间时,很有可能出现11111111的情况,而且 ...

呃。。。越说越懵~
作者: 善良的死神达乐    时间: 2016-6-16 22:23
dubei1993 发表于 2016-6-16 00:47
我请问你在哪里看到的这些?感觉不太对,文本中存储的都是汉子或字符,都要编码后读入内存的。。怎么会有 ...

a.int read(byte[] b)                                                                一次读取一个字节数组       
        (用 int 类型接收是因为 byte 类型中会出现-1的情况,导致后面无法继续读取,int 类型会在前面补上24个0,不会出现-1的情况)
        b.write(byte[] b)                                                                        一次写出一个字节数组
        c.available()                                                                                获取读的文件所有的字节个数
        弊端:有可能会内存溢出
read()方法读取的是一个字节,为什么返回是 int,而不是 byte
        a.因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回 byte,有可能在读到中间的时候遇到111111111
                那么这11111111是 byte 类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用 int 类型接收,如果11111111会在其前面补上
                        24个0凑足4个字节,那么byte类型的-1就变成 int 类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型
作者: 善良的死神达乐    时间: 2016-6-16 22:24
OmbreAmant丶C 发表于 2016-6-16 21:58
呃。。。越说越懵~

教材上就是这样说的啊!很好理解啊!为什么会懵????
作者: OmbreAmant丶C    时间: 2016-6-17 22:42
善良的死神达乐 发表于 2016-6-16 22:24
教材上就是这样说的啊!很好理解啊!为什么会懵????

教材是什么鬼?
作者: 善良的死神达乐    时间: 2016-6-17 22:54
OmbreAmant丶C 发表于 2016-6-17 22:42
教材是什么鬼?

我是黑马 双元安卓基础班,会有笔记,然后会将理论啊!你们没有?
作者: OmbreAmant丶C    时间: 2016-6-17 23:15
你在那个教室? 我是ee基础的
作者: 我是泽西哥    时间: 2016-6-17 23:23
比较通俗来说,FileInputStream就是把文件写入内存中,FileOutputStream相当于写出。这样理解你可能会比较舒服一点.至于Copy,字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
作者: OmbreAmant丶C    时间: 2016-6-17 23:46
我是泽西哥 发表于 2016-6-17 23:23
比较通俗来说,FileInputStream就是把文件写入内存中,FileOutputStream相当于写出。这样理解你可能会比较舒 ...

谢谢你百忙之中还浏览了我的帖子 非常感谢!
作者: 我是泽西哥    时间: 2016-6-18 00:26
OmbreAmant丶C 发表于 2016-6-17 23:46
谢谢你百忙之中还浏览了我的帖子 非常感谢!

不忙 我现在只是个大二的学生.你在黑马了吗. 早点休息 争分夺秒.
作者: OmbreAmant丶C    时间: 2016-6-18 00:29
我是泽西哥 发表于 2016-6-18 00:26
不忙 我现在只是个大二的学生.你在黑马了吗. 早点休息 争分夺秒.

好的 你也早点休息吧!
作者: tianzhu2725    时间: 2016-6-18 07:02
输入和输出是相对于内存说的而不是相对于硬盘,理解了这个就理解了.
作者: OmbreAmant丶C    时间: 2016-6-18 21:17
tianzhu2725 发表于 2016-6-18 07:02
输入和输出是相对于内存说的而不是相对于硬盘,理解了这个就理解了.

恩 谢谢
作者: OmbreAmant丶C    时间: 2016-6-19 22:21
MySQL  语句有点乱!!!!
作者: eyesee    时间: 2016-6-20 00:20
很快就要学I/O了,也进来学习下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2