欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

09 IO 流之——深入了解字节流

程序员文章站 2022-05-14 13:29:24
...
一 :IO流用来处理设备之间的数据传输(手机-电脑   我电脑- 你电脑 能通信)

         上传文件和下载文件(Java程序操作硬盘数据)

二:IO流的分类

     IO流是进行数据间传输的
      流向(参照物 :程序)
       输入   读 Reader
       输出   写 write
   数据类型
       字节流  
          字节输入流      读取数据      InputStreame(抽象类)
          字节输出流      写入数据      OutPutStreame(抽象类)
       字符流  
         字符输入流      读取数据    Reader(抽象类)
       FileOutputStream(File file)

         字符输出流      写入数据     write(抽象类)

          若文本文件能读懂就用字符流,其中字符流是以字节流为基础的

    三:  FileOutputStream(字节输出流OutPutStreame的子类)的构造方法

       FileOutputStream(String name)

package io;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * IO流是进行数据间传输的
 * 流向(参照物 :程序)
 *    输入   读 Reader
 *    输出   写 write
 * 数据类型
 *     字节流  
 *        字节输入流      读取数据      InputStreame
 *        字节输出流      写入数据      OutPutStreame
 *     字符流  
 *        字符输入流      读取数据    Reader
 *        字符输出流      写入数据     write
 *        
 *    若文本文件能读懂就用字符流,其中字符流是以字节流为基础的。
 *    
 *     需求:需要往一个文本文件中输入一hello io;
 *     FileOutputStream的构造方法
 *     FileOutputStream(File file)
 *     FileOutputStream(String name)
 */
public class FileOutputStreamDemo {
	public static void main(String[] args) throws IOException {
		/*//第一种构造方法FileOutputStream(File file)
		File file = new File("file.txt");
		FileOutputStream fos = new FileOutputStream("file");*/
		//第二种构造方法
		FileOutputStream fos = new FileOutputStream("file.txt");
	/*
	 * 创建字节输出流对象做了几件事情
	 * A: 调用系统功能去创建文件
	 * B:创建fos对象
	 * C:把fos对象指向这个文件
	 * */
		fos.write("hello.io".getBytes());
		//释放资源
		//关闭此文件输出流并释放与此流有关的所有系统资源
		fos.close();
		//为什么要用close()那?
                //A:让流对象变成垃圾,因为这样就能被垃圾回收器回收啦。
		//B:通知系统去释放跟该文件相关的资源
	}
}

四:字节流写数据的三种方式

   public void write(int b) 写一个字节
   public void write(byte[] b) 写一个字节数组

   public void write(byte[] b,int off,int len) 写一个字节数组的一部分

五:字节流写数据常见的几个问题

    1)创建字节输出流到底做了哪些事情?
         A : 创建字节输出流对象  B:写数据 C:释放资源

    2)数据写成功后,为什么要close()?

           A:让流对象变成垃圾,因为这样就能被垃圾回收器回收啦 B:通知系统去释放跟该文件相关的资源

    3)如何实现数据的换行?

        windows:\r\n     linux:\n    Mac:\r   而一些高级记事本软件可以识别任意换行符号。

    4)如何实现数据的追加写入?

     用构造方法带第二个参数是true的情况即可。

     FileOutputStream fos  = new  FileOutputStream("fos.txt",ture);

六 字节输入流操作步骤
  A:创建字节输入流对象
  B:调用read()方法读取数据,并把数据显示在控制台

  C:释放资源

七 读取数据的方式

A: public int read() 一次读取一个字节
B: public int read(byte[] b) 一次读取一个字节数组


package io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 字节输入流操作步骤
 * A:创建字节输入流对象
 * B:调用read()方法读取数据,并把数据显示在控制台
 * C:释放资源
 * 读取的方法
 * public int read() 一次读取一个字节
 * public int read(byte[] b) 一次读取一个字节数组
 */
public class IoDemo04 {
	public static void main(String[] args) throws IOException  {
		//创建字节输入流对象
		FileInputStream  fis = new FileInputStream("fos.txt");
        //调用read()方法读取数据,并把数据显示在控制台
		int red = 0;
		//读取 赋值 判断
		while((red = fis.read())!= -1){
			System.out.print((char)red);
		}
		//释放资源
		fis.close();
	}
}

八 练习题

把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt
c:\\a.txt内容复制到d:\\b.txt
e:\\林青霞.jpg内容复制到当前项目目录下的mn.jpg
e:\\哥有老婆.mp4复制到当前项目目录下的copy.mp4


package io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 1 把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
 *            先读     FileInputStream       a.txt
 *            后写     FileoutputStream      b.txt
 * 2 把c:\\a.txt内容复制到h:\\b.txt中
 * 3 把f:\\华清宫.jpg内容复制到当前项目目录下的mn.jpg中
 * 4 把f:\\哥有老婆.mp4复制到当前项目目录下的copy.mp4中

 */
public class IoDemo05 {
	public static void main(String[] args) throws IOException  {
	/*	第一题
	           封装数据源
	   FileInputStream fis = new FileInputStream("a.txt");
	           封装目的地
	   FileOutputStream fos = new 	FileOutputStream("b.txt");
		//1 把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
		//先读取
		int red =0;
	    while ((red = fis.read())!= -1){
	    //再写入
	    	 fos.write(red);
	    }*/
		
       /**********************************************************************/
		/*第二题
		 把c:\\a.txt内容复制到h:\\b.txt中
		 封装数据源
		FileInputStream fis = new FileInputStream("c:\\a.txt");
		封装目的地
		FileOutputStream fos = new 	FileOutputStream("h:\\b.txt");
		//先读取
		int red =0;
	    while ((red = fis.read())!=-1){
	    //再写入
	    	 fos.write(red);
	    }*/
		
		/**********************************************************************/
		/*第三题
		把f:\\华清宫.jpg内容复制到当前项目目录下的mn.jpg中
		FileInputStream fis = new FileInputStream("f:\\华清宫.jpg");
		FileOutputStream fos = new 	FileOutputStream("mn.jpg");
		//先读取
		int red =0;
	    while ((red = fis.read())!=-1){
	    //再写入
	    	 fos.write(red);
	    }*/
		/**********************************************************************/
//		第四题
//		 把f:\\哥有老婆.mp4复制到当前项目目录下的copy.mp4中
		FileInputStream fis = new FileInputStream("f:\\哥有老婆.mp4");
		FileOutputStream fos = new 	FileOutputStream("copy.mp4");
		//先读取
		int red =0;
	    while ((red = fis.read())!=-1){
	    //再写入
	    	 fos.write(red);
	    }
	    //释放资源
	    fis.close();
	    fos.close();
	}
	
	

}

九:注意:计算机中中文的存储分两个字节

    第一个字节肯定是负数

    第二个字节常见的是负数,可能有正数,但是没影响

package io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 一次读取一个字节数组 int read(byte[] b) int是实际读取的数据个数
 */
public class IoDemo06 {
	public static void main(String[] args) throws IOException  {
	  FileInputStream fis = new FileInputStream("TransLog.java");
//		FileOutputStream fos = new 	FileOutputStream("zxx.txt");
	 /* //第一次读取
		byte[]  by = new  byte[5];
		int len = fis.read(by);
		System.out.println(len);
		System.out.println(new String(by));
		//第二次读取
		 len = fis.read(by);
		System.out.println(len);
		System.out.println(new String(by));
		//第三次读取
		 len = fis.read(by);
		System.out.println(len);
		System.out.println(new String(by));*/
	  //释放资源
	   byte[]  by = new  byte[1024];
	   int len = 0;
	  while((len = fis.read(by))!= -1){
		  System.out.print(new String(by, 0,len));
	  }
	    fis.close();
//	    fos.close();
	}
	
	

}
十 带缓冲区的字节类,这种类又被称为缓冲类(高效类)
   BufferedOutputStream 写数据
   BufferedInputStream  读数据
   构造方法可以指定缓冲区的大小,默认缓冲区的大小就足够了
   为什么不传递一个具体的文件或文件路径,而是传递OutputStream对象呢?
   原因很简单,字节缓冲区流仅仅提供缓冲区,为高效设计的,但是呢,真正的读写操作还是靠基本的流对象实现。


       

相关标签: 字节流