1.6141.1JavaIO流原理及流量分类
1.I/O是Input/Output缩写,I/O技术是处理数据传输的非常实用的技术。如阅读/撰写文件、网络通信等。
2.在Java程序中,数据的输入/输出操作是流动的(stream)以“方式进行。
3.java.在io包下提供各种“流”类和接口,以获取不同类型的数据,并通过方法输入或输出数据
4.输入input:在程序(内存)中读取外部数据(磁盘、光盘等存储设备的数据)。
5.输出outputttutt:将程序(内存)数据输出到磁盘、光盘等存储设备中
1.2流的分类根据操作数据单位的不同,分为字节流(8bit)二进制文件、字符流(按字符)文本文件
根据数据流的不同流向,分为输入流和输出流
根据流的不同角色,分为节点流、处理流/包装流
Java的IO流涉及40多个类别,实际上是非常规则的,都是从以上4个抽象基类中衍生出来的。
2)这四类衍生出来的子类名称都是以其父类名为子类名的后缀。
2.IO流体系图-常用类6142.1IO流体系图2.2文件VS流3.InputStream:字节输入流6153.1InputStream抽象类是所有类字节输入流的超类3.1.Inputstream常用的子类615FileInputStream:文件输入流
BufferedInputStream:缓冲字节输入流
ObjectInputStream:对象字节输入流
4.FileinputstreamFileOutputStream4.1案例演示FileInputstreamm:文件输入流615请使用Fileinputstream阅读hellol.txt文件并在控制台上显示文件内容.
com中的代码.stulzl.inputstream_fileInputstream.包中FileInputStream_package com.stulzl.inputstream_fileInputstream;import org.junit.jupiter.api.Test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;//FileInputStream:文件输入流 615//请使用 FileInputStream 读取 hello.txt 文件,并在控制台上显示文件内容.public class FileInputStream_ { public static void main(String[] args) { } //演示 FileInputStream 使用(字节输入流 文件--> 程序) ///读取单个字节,效率比较低 @Test public void readFile01(){ String filePath = "e:\\hello.txt"; int readData = 0;////用于接收read()读取数据的返回值 FileInputStream fileInputStream = null; try { //创建 FileInputStream 文件输入流对象,用于读取文件 fileInputStream = new FileInputStream(filePath); ///从输入流读取字节数据。 如果没有可用的输入,这种方法将被阻止。 /如果返回-1 , 说明读完了 //解释循环读取,read()每次读取一个数据,都会返回一个int类型的值,读取后返回-1 //我们将返回值放入readdata,用作循环判断条件 while((readData = fileInputStream.read())!=-1){//read()一次读取字节数据的方法 System.out.print((char)readData);///类型转换 } } catch (IOException e) { e.printStackTrace(); }finally { ////关闭文件流释放资源 try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } //使用read(byte[] b)提高效率 @Test public void readFile02(){ String filePath = "e:\\hello.txt"; ///定义一个字节数组 byte[] buf = new byte[8];///可以一次读8个字节 int readLen = 0;//用于存储readad(buf)读取数据返回值的方法 FileInputStream fileInputStream = null; try { //创建 FileInputStream 对象,用于读取 文件 fileInputStream = new FileInputStream(filePath); ////从这个输入流读最多 b.length 字节数据到字节数组。 在某些输入可用之前,这种方法会阻塞它。 /如果返回-1 , 说明读完了 //如果读得正常, 返回实际读取的字节数(即要读取的数据) ///读取数据>buf数组的大小(8)最多返回8 //这个循环读取是在数组buf中读取数据,第一次读8个,第二次读3个数据 while((readLen = fileInputStream.read(buf))!=-1){//read()一次读取字节数据的方法 ///在这里解释new String(buf,0,readLen),String系统为String提供的构造器之一 //String s4 = new String(charD a,int startIndex,int count) //功能传输数组、位置、长度,然后将数组转换为字符串 System.out.print(new String(buf,0,readLen));//显示 } } catch (IOException e) { e.printStackTrace(); }finally { ////关闭文件流释放资源 try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }}
4.2案例演示Fileoutputstreamm:字节输出流616要求:请使用Fileoutstream.“txt文件”写在txt文件中hello,world”.如果文件不存在,将创建文件(注:前提是目录已经存在.)
com中的代码.stulzl.outputstream_fileoutputstream.包中FileOutputStream_01import org.junit.jupiter.api.Test;import java.io.FileOutputStream;import java.io.IOException;// 案例演示 FileOutputStream:字节输出流 616//要求: 请使用 FileOutputStream 在 a.txt 文件,中写入 “hello,world”.// 若文件不存在,会创建文件(注:前提是目录已经存在.)public class FileOutputStream_01 { public static void main(String[] args) { } //演示使用 FileOutputStream 在文件中写下数据 @Test public void writeFile(){ //创建Fileoutstream对象 String filePath = "e:\\a.txt"; FileOutputStream fileOutputStream = null;//定义Fileoutstream类型 try { ///获得Fileoutstream对象 //1. new FileOutputStream(filePath) 创建方式,当内容被写入时,它将覆盖原始内容 //2. new FileOutputStream(filePath, true) 当写入内容时,创建方法是,它被添加到文件后面 //fileOutputStream = new FileOutputStream(filePath); fileOutputStream = new FileOutputStream(filePath, true); ///写字节 //fileOutputStream.write('H'); ///写字符串 String str = "hello,world!"; ///这里解释一下str.getBytes()方法可以将字符串转换为字节数组,重点哦 //fileOutputStream.write(str.getBytes()); ///另一种写字符串的方法,写入想要长度的字符串 fileOutputStream.write(str.getBytes(),0,5);//即 只写hello } catch (IOException e) { e.printStackTrace(); } finally { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }}
4.3文件副本617编程完成图片的复制.
com中的代码.stulzl.filecopy_.包中FileCopy_package com.stulzl.filecopy_;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;//文件复制 617public class FileCopy_ { public static void main(String[] args) { //完成文件复制,将e:\\guidao.将jpg复制到d:\\ //思路 //1. 输入流创建文件 , 在程序中读取文件 //2. 输出流创建文件, 将读取的文件数据,写入指定文件 String srcFilePath = "e:\\guidao.jpg"; String destFilePath = "d:\\guidao.jpg"; //两种类型的定义者 FileInputStream fileInputStream = null; FileOutputStream fileOutputStream = null; try { fileInputStream = new FileInputStream(srcFilePath); fileOutputStream = new FileOutputStream(destFilePath); byte[] buf = new byte[1024];///创建临时字节数组 int readLen = 0; ///阅读文件资源,FileInputstream输入即将到来的图片资源-->程序 while((readLen=fileInputStream.read(buf))!=-1){///一次读1024个,不到1024个就读真实个数 //输出文件资源,即使用Fileoutstream输出流 程序-->目的地 //必须使用writete(buf,0,readLen)不能使用writeee的方法(buf)因为,可以读到最后真实 // 可能没有1024个文件资源,buf的使用意味着每次都有1024个 fileOutputStream.write(buf,0,readLen); } System.out.println(成功复制文件); } catch (IOException e) { e.printStackTrace(); } finally { try { ///关闭相应的流,释放资源 if(fileInputStream!=null){ fileInputStream.close(); } if(fileOutputStream!=null){ fileOutputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } }}