Java_IO流_字节流(一)

本文详细介绍了Java中的字节流,包括IO流的体系结构、概念分类、父类,以及FileInputStream和FileOutputStream的使用。讨论了read方法返回int的原因,并探讨了高效读写和异常处理。此外,还讲解了BufferedInputStream和BufferedOutputStream在提高性能方面的作用,以及close和flush方法的区别。
摘要由CSDN通过智能技术生成
1.前言:

又开始投放博客了,堆积了大半年的笔记又要开始整理整理发博客了!刺激

还有CSDN的代码模块真的让我很不爽,请复制到文本里面观看。。。。。

2.本文的主要内容是:
  • 2.0 IO流体系图
  • 2.1 IO流的概念,分类,父类
  • 2.2 IO流的读取-FileInputsileInputStream
  • 2.3 IO流的读取返回值为int的原因
  • 2.4 IO流的写-FileOutputStream
  • 2.5 文本的拷贝-FileInputStrem,FileOutputStream
  • 2.6 IO流的高效读取和高效写
  • 2.7 IO流的BufferedInputStream,BufferedOutputStream
  • 2.8 close和flush方法的区别
  • 2.9 1.7版本的IO流异常处理
3.正文开始咯~~~~~~~~~
3.0 IO流的体系图(用的别人的):


3.1 IO流的概念,分类,父类

* 1.概念
* IO流用来处理设备之间的数据传输
* Java对数据的操作是通过流的方式
* Java用于操作流的类都在IO包中
* 流按流向分为两种:输入流,输出流。
* 流按操作类型分为两种:
* 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
* 字符流 : 字符流只能操作纯字符数据,比较方便。(对于纯文本只读或者只写操作)
* 2.IO流常用父类
* 字节流的抽象父类:
* InputStream 
* OutputStream
* 字符流的抽象父类:
* Reader 
* Writer
* 3.IO程序书写
* 使用前,导入IO包中的类
* 使用时,进行IO异常处理
* 使用后,释放资源

* 遵循晚开早关的好习惯(关于流)

3.2 IO流的读取-FileInputStream

  • 首先你要在项目里面创建一个aaa.txt文本,在里面写入随意的非中文信息。如 I love you ,my mather!
  • 然后代码如下(使用read方法为一个字节一个字节的读):
public static void fileinputTest() throws IOException {
		FileInputStream fis = new FileInputStream("aaa.txt");//此处有文件找不到异常
		   int b ;
		   while((b=fis.read())!=-1){         //此处有文件不能读异常
			   System.out.print((char)b);
		   }
		   fis.close();
	}

值得注意的是:

* 需要抛出异常,但单纯的将异常抛给别人是一个不怎么道德的行为,所以下面会写如何自己处理异常。

* 这里的aaa.txt是可读的,且在本项目下,所有不需要加其他盘路径。如果不是在本项目下,请加上全路径。

如"E:\\project\\java\\SE\\aaa.txt"。windows的文件都是可读可写的,所以不需要担心,但是linux下就有所不同。


3.3 FileInputStream的read方法的返回值为int的原因:

  如果你注意到了fis.read()方法我用的是 int b 接收的。你需要想想文本的读取是如何结束的?以及为何要求aaa.txt里面是非中文?

    *  因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111。那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类。

    *  非中文是因为,中文在java中代表两个字节。就算是两个字节连着读,你中文总有空格吧,总有标点符号吧。稍微一点点移位,后面可能就全变样了。因为编码表里面,不同的二进制可是代表不同的字母或者中文。中文是由字符流来处理的。

3.4  IO流的写- FileOutputStream
public static void fileTest() throws FileNotFoundException, IOException {
	//1.创建文件:
	   FileOutputStream fos = new FileOutputStream("bbb.txt");//如果bbb没有则创建文件,有bbb.txt则清空存入
	   Scanner scanner = new Scanner(System.in);
	   System.out.println("请输入英文:");
	   //2.写入文件
	   while(true){
		   String line = scanner.nextLine();
		   if("quit".equals(line))   //遇到quit就停止写入
			   break;
		   fos.write(line.getBytes());
		   fos.write("\r\n".getBytes());//在windows下输入换行符
	   }
	   //3.读出文件(一个字节一个字节的读
	   FileInputStream fis = new FileInputStream("bbb.txt");//创建一个接受对象,并且关联bbb.txt
	   int b ;
	   while((b=fis.read())!=-1){
		   System.out.println(b);
	   }
}
3.5 文本的拷贝-FileInputStream,FileOutputStream
  public static void main(String[] args) throws IOException{
	  FileInputStream fis = new FileInputStream("aaa.txt");
	  FileOutputStream fos = new FileOutputStream("copyaaa.txt");
	  int b;
	  while((b=fis.read())!=-1){
		  fos.write(b);
	  }
	  fis.close();
	  fos.close();
	  
   }
3.6高效的读出或者写入-小数组

上面所用的都是小的文本,如果你考一个电影45M或者更多,效率是很慢的。下载电影过慢的软件你是绝对不会用的。

数组大小一般规定为1024的整数倍,不要太大咯(手动滑稽)因为会造成java的内存溢出哟~~~


代码;

        FileInputStream fis = new FileInputStream("aaa.txt");
	FileOutputStream fos = new FileOutputStream("copy.txt");
	   byte[] arr = new byte[3];
	   int len;
	   while((len = fis.read(arr))!=-1)
	   {
		   fos.write(arr);
	   }
	   System.out.println("拷贝完毕");
	   //4.关闭资源
	   fis.close();
	   fos.close();

值得注意的是java还给我们提供了write(b,0,len)这个方法,他存在的意义是啥?

采用上面代码执行的过程是这样的,我们姑且把aaa.txt里面的内容为:abcd


那么他存在的问题,就用红色的标识出来了。他只是覆盖arr数组,但是没有被覆盖到的也拷贝到copy.txt里面了。

所以我们需要用到write(b,0,len)这个方法。仅仅改变一下上面的代码就好了。

fos.write(arr,0,len);
3.7 IO流的BufferedInputStream,BufferedOutputStream

BufferedInputStream是java给你的,他是FileInputStream的子类。当然要比这个爸爸要强那么一点咯!强在哪里?


BufferedInputStrem 只能一个个赋值。然而他的好处是啥?他和我们之前说的小数组谁更快?

bufferedInputStream 是从硬盘上一次性拿8*1024的字节(形成一个缓冲区),然后在内存中一次次赋值。所以免去了内存从硬盘一次读一个然后进行赋值的工作。内存的速度总比硬盘上快吧。

当小数组的大小为8*1024时,定义小数组会略胜一筹,因为读和写操作的是同一个数组 ,而Buffered操作的是两个数组。

3.8 close和flush方法的区别

如果你足够细心,你可以尝试你没有关闭流的时候,你的拷贝是否都是完全一模一样的。有的时候总缺了啥。

* flush()方法
* 用来刷新缓冲区的,刷新后可以再次写出 
* close()方法

* 用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出 


3.9 1.7版本的IO流异常处理
public static void fileTry() throws IOException, FileNotFoundException {
	try(FileInputStream fis = new FileInputStream("aaa.txt");
		   FileOutputStream fos = new FileOutputStream("copygg.txt");
			){
		   int b;
		   while((b=fis.read())!=-1){
			   fos.write(b);
		   }
		   //在try()里面创建的流对象必须实现AutoCloseeable这个接口,
		   //如果实现了,在try后面的{}(读写代码)执行后就会自动调用,流对象的close方法将流关掉
	   }
}
4.后言:

好的这就是IO流的字节流的基础,革命尚未成功同志仍需努力!!!加油啊,xhy ^_^








 



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值