二、IO流原理及流的分类
1.Java IO原理
①I/O 是 Input/Output 的缩写, I/O 技术是非常实用的技术,用于 处理设备之间的数据传输 。如读 / 写文件,网络通讯等。
②Java 程序中,对于数据的输入 / 输出操作以 “流 (stream) ” 的方式进行。
③java.io 包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过 标准的方法 输入或输出数据。
即输入输出都是基于程序(内存)
2.流的分类
3.IO 流体系
4.节点流和处理流
5.InputStream & Reader 和 OutputStream & Writer
流的体系结构
* 抽象基类 节点流(或文件流) 缓冲流(处理流的一种)
* InputStream FileInputStream BufferedInputStream
* OutputStream FileOutputStream BufferedOutputStream
* Reader FileReader BufferedReader
* Writer FileWriter BufferedWriter
测试FileInputStream和FileOutputStream的使用
/** * 测试FileInputStream和FileOutputStream的使用 * * 结论: * 1.对于文本文件(.txt,.java,.c,.cpp),使用字符流处理 * 2.对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt.........),使用字节流处理 * * * * @author wyyyyyk * @create 2022-08-12 11:551 */ public class FileInputOutputStreamTest { //使用字节流FileInputStream处理文本文件,可能出现乱码。 @Test public void test1() { FileInputStream fis = null; try { //1.造文件 File file = new File("hello.txt"); //2.造流 fis = new FileInputStream(file); //3.读数据 byte[] buffer = new byte[5]; int len;//记录每次读取的字结的个数 while ((len = fis.read(buffer)) != -1){ String str = new String(buffer,0,len); System.out.print(str); } } catch (IOException e) { throw new RuntimeException(e); } finally { //4.关闭资源 try { if (fis != null) fis.close(); } catch (IOException e) { throw new RuntimeException(e); } } } /* 实现对图片的复制操作 */ @Test public void testFileInputOutputStream() { FileInputStream fis = null; FileOutputStream fos = null; try { //造文件 File srcFile = new File("pucture.jpg"); File destFile = new File("pucture5.jpg"); //造流 fis = new FileInputStream(srcFile); fos = new FileOutputStream(destFile); //复制的过程 byte[] buffer = new byte[5]; int len; while ((len = fis.read(buffer)) != -1){ fos.write(buffer,0,len); } } catch (IOException e) { throw new RuntimeException(e); } finally { if (fos != null){ try { fos.close(); } catch (IOException e) { throw new RuntimeException(e); } } if (fis != null){ try { fis.close(); } catch (IOException e) { throw new RuntimeException(e); } } } } }
测试FileReader和FileWriter的使用
/* 说明点: 1.read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1 2.异常的处理:为例保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理 3.读入的文件一定要存在,否则就会报FileNotFoundException */ @Test public void test1(){ FileReader fr = null; try { //1.实例化File类的对象,指明要操作的文件 File file = new File("hello.txt");//相较于当前Module //2.提供具体的流 fr = new FileReader(file); //3.数据的读入 //read():返回读入的一个字符。如果达到文件末尾,返回-1 //方式一: // int data = fr.read(); // while (data != -1){ // System.out.print((char)data); // data = fr.read(); // } //方式二:语法上针对方式一的修改 int data; while ((data = fr.read()) != -1){ System.out.print((char)data); } } catch (IOException e) { throw new RuntimeException(e); } finally { //4.流的关闭操作 try { if (fr != null) fr.close(); } catch (IOException e) { e.printStackTrace(); } } } //对read()操作升级:使用read的重载方法 @Test public void test2() { FileReader fr = null; try { //1.File类的实例化 File file = new File("hello.txt"); //2.流的实例化 fr = new FileReader(file); //3.读入的操作 //char(char[] cbuf):返回每次读入cbuf数组中的字符个数。如果达到文件末尾,返回-1 char[] cbuf = new char[5]; int len; while ((len = fr.read(cbuf)) != -1){ //方式一: // for (int i = 0; i < len; i++) { // System.out.print(cbuf[i]); // } //方式二: String str = new String(cbuf,0,len); System.out.print(str); } } catch (IOException e) { e.printStackTrace(); } finally { //4.资源的关闭 try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } }
注意!!!:
从内存写出数据到硬盘文件里
说明:
1.输出操作,对应的File可以不存在,并不会报异常
2.File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件
File对应的硬盘中的文件如果存在:
如果流使用的构造器是:FileWriter(file,false)/FileWriter(file):对原有文件的覆盖
如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖,而是在原有文件基础上追加内容
@Test public void test3() { FileWriter fw = null; try { //1.提供File类的对象,指明写出到的文件 File file = new File("hello1.txt"); //2.提供FileWriter的对象,用于数据的写出 fw = new FileWriter(file,false); //3.写出的操作 fw.write("I have a dream!\n"); fw.write("you need to have a dream!"); } catch (IOException e) { throw new RuntimeException(e); } finally { //4.流资源的关闭 if (fw != null){ try { fw.close(); } catch (IOException e) { throw new RuntimeException(e); } } } }