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

一 : 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对象呢?
   原因很简单,字节缓冲区流仅仅提供缓冲区,为高效设计的,但是呢,真正的读写操作还是靠基本的流对象实现。


       

猜你喜欢

转载自blog.csdn.net/zhangxinxin1108/article/details/80000367
今日推荐