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

IO流字节流,字符流,学习笔记 ;基础入门,一看就懂,一篇文章解决字节流好吧

程序员文章站 2022-06-05 19:57:36
...

IO流总结而来就时数据的传输,当然有许多方法,杂七杂八的,整理大概也就是字符和字节流

字节流:InputStream和OutputStream是java中可以按照最小字节单位读取的流,即每次读写一个字节,字节流是直接连接到输入源的流。

字符流:是以字符为单位进行数据处理的IO流。本质其实就是基于字节流读取时,去查找指定的码表。

字节流与字符流之间的区别:

1.读写单位不同:字节流式以字节(8位2进制)为单位,字符流是以字符为单位,根据码表映射字符,一次可能读多个字节。

2.处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

3.一次读入或读出是8位二进制。

4.字符流:一次读入或读出是16位二进制。

结论:只要是纯文本数据优先使用字符流,除此之外都使用字节流。

一 .字节流

  1. InputStream流,所有输入字节流的父类
    首先进入最简单的InputStream读取流,这个流特别简单
  首先创建一个字符串   
                 String address = "src/_IO流基础_1/aa.txt";
                 为什么要先创建一个字符串呢,因为你IO流总不可能时一成不变的,要留有余地
                 
   然后直接new一个FileInputStream
                   FileInputStream input = null;
                  String address = "src/_IO流基础_1/aa.txt";
                   try {
	                    	input = new FileInputStream(address);
                       	} catch (FileNotFoundException e) {
	                     	// TODO Auto-generated catch block
	                         e.printStackTrace();
	                     	System.out.println("找不到文件位置!");
                                            		}
     然后,我们定义一个变量用于保存输出的字节流总数和一个int i
            int count = 0 ,i = 0;
            接着就是输出就OK了
                     try {
	                         	while((i=input.read())!=-1) {    //这里可能会有小伙伴感到迷惑了,实际上就是先给i进行赋值,然后
	                         	                                                在去用i是否等于-1,等于-1就没有值了嘛,
		                     	System.out.print((char)i);  //不了解为什么转化成char的话可以去了解一下ASCII值
	                                                                    	}
	                         nput.close();//运行完后关闭资源
	                    	System.out.println("传输字节总数:"+count);
                    	} catch (IOException e) {
	               	// TODO Auto-generated catch block
	             	e.printStackTrace();
		            System.out.println("读取文件错误!");
             		}

总结: 然后,大概这就是InputStream的输入了,获取了地址address,然后输出该txt的值,注意,这个方法只能一个字节一个字节的传输,也就是说,中文字母会乱码,下面有解决办法

  1. OutputStream流,所有输出流的父类
    这个与第一个InputStream对应,也属于很基础

         那么首先,我们先来创建一个字符串,用于输出,当然如果你是接着上面来的可以省略
           String output ="123123123";
         再创建一个地址,用于保存输出的内容!
            String address ="src/_IO流基础_1/基础1.txt";//这里注意声明你要保存的格式!
          然后,直接new一个FileOutputStream,格式与上面类似
             FileOutputStream out = null
             try {
                  out = new FileOutputStream(out);
                   } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                  	e.printStackTrace();
               	}
           最后就是直接输出了嘛!
           char[] shuchu = output.toCharArray();//将字符串转化成数组
            int len = shuchu.length;
            for(int i = 0;i<len;i++) {
                 try {
                  	out.write(chuanshu[i]);//用于输出值
              	} catch (IOException e) {
      	          // TODO Auto-generated catch block
      	          e.printStackTrace();
                 	System.out.println("传输失败!");
                }
                   }
    

总结 : InputStream和OutputStream可以说是一毛一样,注意两个搭配起来用,获取玩直接输出流保存就OK了

Reader和Writer
这个可以用来传输中文汉字,应为它并不是一个字节一个字节的传输的
直接上代码吧,与上述类似,知识把InputStream换成了Reader ,把OutputStream换成了Writer

import java.io.*;

public class FileReadWriter {

public static void main(String[] args) {
	File fi = new File("src/_IO流基础_1/aa.txt");
	File fis = new File("src/_IO流基础_1/基础1.txt");
	FileReader re = null;
	FileWriter wr = null;
	try {
		 re = new FileReader(fi);
		 wr = new FileWriter(fis);
		 int k = 0;
		 while((k = re.read())!=-1) {
			 wr.write(k);				 
		 }
		 re.close();
		 wr.close();
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}	
  }

总结 : 这里就是说我把输入和输出连接到了一起,等于复制了这一个文件,但是这个文件你可以保存任意地点

二 . 缓冲流
下一节下一节,不写了不写了