Java---说说IO流中的一些小细节

最近一直在加班,所以更新没跟上。这两天又看了IO流,发现了好多自己以前不会或模糊的问题,今天在这里说一说,有哪里不对的希望各位指教。(列举的可能比较碎)
 
  • 细节一:(关于File的)
    • 如果在创建文件或文件夹时忘了写盘符路径,如:File file =newFile("a.txt") ,那么这个文件(夹)是默认在项目下的。
    • Java中的删除是不走回收站的。
    • 要删除一个文件夹的话,它里面是不能包含文件或文件夹的。
 
  • 细节二:(关于File的)
在指定绝对路径时,定义目录分隔符有两种方式:
    • 反线斜要写两个     ---     File("c:\\a.txt")
    • 斜线写一个就行     ---     File("c:/a.txt")
 
  • 细节三:(关于递归的)
    • 递归次数不能太多,否则就会内存溢出。原因:用debug可以发现,每调用一次方法,就会在栈中开辟一个栈帧,所以递归次数太多的话就会内存溢出。
 
  • 细节四:(到IO流了)
    • 什么情况下使用哪种流?
如果数据所在的文件通过windows自带的记事本打开能够看懂里面的内容,就用字符流,其他就用字节流。(实在不知道用哪个就用字节流)
 
  • 细节五:
    • 想实现数据的追加写入怎么办?(字节流举例)
在FileOutputStream的构造方法中有一个带两个参数的:
FileOutputStream fos = new FileOutputStream("fos.txt", true);
 
  • 细节六:
    • 计算机是如何识别什么时候该把两个字节转换为中文的呢?
在计算机中,中文的存储分两个字节:                                   
第一个肯定是负数,
第二个常见的是负数,也可能是正数,但不影响
String s = "我爱你中国";
		//[-50, -46, -80, -82, -60, -29, -42, -48, -71, -6]
  • 细节七:
//BufferedOutputStream(OutputStream out)
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));
    • 如上面所示,在缓冲区类BufferedOutputStream构造方法中为什么不传一个具体的文件或文件路径,而是传一个OutputStream对象呢?
原因是字节缓冲区仅仅只是提供缓冲区而已,真正的读写操作还是要靠基本的流对象实现。
 
  • 细节八:
    • 编解码问题:UTF-8在解码时是三个三个一组来解,而GBK是两个一组来解。编码同理,如下图(同时也发现Java默认是GBK):
    • 同时需要注意的问题是:在读写文件的时候,用什么格式读就用什么格式写(读写一致),否则就会出现乱码问题。
    •  
String s = "中国";
		//编码
		//byte[] bys = s.getBytes();//[-42, -48, -71, -6]
		byte[] bys = s.getBytes("gbk");//[-42, -48, -71, -6]
		//byte[] bys = s.getBytes("utf-8");//[-28, -72, -83, -27, -101, -67]
		System.out.println(Arrays.toString(bys));

 
  • 细节九:
    • close()和flush()的区别?
      • close()是关闭流对象并释放资源,在关闭前会先去刷新一次缓冲区,关闭之后,流对象就不能再使用了;
      • flush()仅仅是刷新缓冲区,刷新之后流对象还能继续使用。
 
  • 细节十:
    • 如果一个流对象在不使用后将其置为null,那么对应的资源会释放吗?
答案是:不会
 
  • 细节十一:(关于资源问题,这个困扰了我很久,个人认为很有必要搞清楚)
    • 在学习IO的时候,一直见书上或别人提到在最后的时候释放资源,可是到底释放的是什么资源呢?
 
这里把资源分为两种:内存资源和非内存资源(比如硬盘上的文件资源)。原来一直以为流对象在close()之后就是把流对象回收掉,释放资源也就是释放流对象所占用的内存资源,后来在查阅了资料和咨询了大神之后才明白,所谓的释放资源指的是:普通的文件流,访问的都是硬盘上的一些资源,在使用结束后应该断开,释放资源。虽然不释放的话一般也不影响其他流对该文件的读写操作,但是当开得线程多了之后,很多个流同时对一个文件进行写操作时就会出现问题(具体什么问题还没遇到过),所以在每一个流对象不使用之后就需要去调用close()去释放资源。
 
 
 
(毕竟现在还是小白,如果觉得哪里说错了,欢迎大家斧正,不胜感激!!!)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值