Java(I/O流)之一 节点流(文件流)

一、Java I/O流整体框架说明介绍

在这里插入图片描述
注意:作为程序员是站在内存的角度看待输入和输出(即从文件读取数据到内存为输入,从内存将数据写入文件等持久化操作为输出,下面所述的输入流输出流均为此理解)
在这里插入图片描述

// I/O流分类
一、按照流向分
输入流:只能从中读取数据,而不能向其写入数据
输出流:只能向其写入数据,而不能从中读取数据

二、按照操作单元分
字节流:按照单个字节进行读取或者写入,适用于音频、视频、非文本文件等
字符流:按照单个字符进行读取或者写入,适用于文本文件

三、按照角色分
节点流(文件流):直接从/向一个特定的I/O设备(磁盘、网络)读/写数据的流
处理流(缓冲流):连接到已经存在的流(节点流或者处理流)之上通过对数据的处理为程序员提供更为强大的读写功能的流
	> 转换流:属于处理流的一种,主要用于将字节输入流转换为字符输入流读取以及将字符输出流转换为字节输出流
分类字节输入流字节输出流字符输入流字符输出流
抽象基类InputStreamOutputStreamReaderWriter
访问文件FileInputStreamFileOutputStreamFileReaderFileWriter
访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
访问字符串StringReaderStringWriter
缓冲流(处理)BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
操作对象ObjectInputStreamObjectOutputStream
二、File类的使用
2.1 File类的基本介绍
/*
File类的使用
1. File类的一个对象,代表一个文件或者一个目录(文件夹)
2. File类声明在java.io包下
3. File类中涉及到关于文件或者文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或者读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
4. 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点"
 */
 
/*
File类的常用三个构造器(第四个构造器待使用)
构造器1:File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建一个新的File实例
构造器2:File(String parent, String child):用父路径名字符串和子路径名字符串创建一个新的File实例。
构造器3:File(File parent, String child):从父抽象路径名和子路径名字符串创建一个新的File实例。
构造器4:File(URI uri):通过将给定的File: URI转换为抽象路径名来创建一个新的File实例。(待完善)
*/ 
// 1. 构造器1示例:
File f1 = new File("F:\\English\\word.txt");

// 2. 构造器2示例
File f2 = new File("F:\\English","word.txt");

// 3. 构造器3示例
File fParentPath = new File("F:\\English")
File f3 = new File(fParentPath, "word.txt")
2.2 File对象常用方法
File f1 = new File("hello.txt");
File f2 = new File("F:\\English\\hi.txt");
// getAbsolutePath():获取文件对象文件的绝对路径
System.out.println(f1.getAbsolutePath());
// getPath():获取当前对象的pathname属性
System.out.println(f1.getPath());
// getName():获取文件名
System.out.println(f1.getName());
// getParent():获取文件的路径名,不包含文件名本身
System.out.println(f1.getParent());
// length():获取文件内容的长度
System.out.println(f1.length());
// lastModified():获取文件的最后修改时间
System.out.println(f1.lastModified());

/*
 public booean renameTo(File dest);把文件重命名为指定的文件路径
 例如:file1.renameTo(file2);
 要想包装返回true,需要file1在硬盘中是存在的,且file2不能在硬盘中存在。

注意:这个方法类似于剪切 粘贴的效果,原来位置的文件会消失,是从一个路径将文件移动到另一个位置
*/
File file4 = new File("F:\\untitled\\jdbc.properties");
File file5 = new File("jdbc1.properties");

boolean flag = file5.renameTo(file4);
System.out.println(flag);

/*
如果文件或目录不存在则所有返回值均为默认值:false
public boolean isDirectory():判断是否是文件目录
public boolean isFile():判断是否是文件
public boolean exists():判断文件或目录是否存在(在磁盘中是否存在)
public boolean canRead():判断文件或目录是否可读
public boolean canWrite():判断文件或目录是否可写
public boolean isHidden():判断文件或目录是否隐藏
*/

/*
创建硬盘中对应的文件或文件夹
public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
public boolean mkdir():创建文件目录。如果此文件目录存在,则不创建。如果此文件目录的上层目录不存在,也不创建
public boolean mkdirs():创建文件目录。如果上层文件目录不存在,一并创建
*/
// 文件目录的创建
File file2 = new File("F:\\Math\\day01");
boolean isMk = file2.mkdir();
System.out.println(isMk);

File file3 = new File("F:\\Math\\day02");
boolean isMks = file3.mkdirs();
System.out.println(isMks);

/*
删除磁盘中的文件或文件目录
public boolean delete():删除文件或者文件夹
删除注意事项:Java中的删除不走回收站,即为永久删除,无法找回
*/
// 文件的创建和删除
File file1 = new File("hi.txt");
if (!file1.exists()) {
    file1.createNewFile();
    System.out.println("创建成功!");
} else {
    file1.delete();
    System.out.println("删除成功!");
}

三、节点流的使用案例以及说明

3.1 字符输入流和字符输出流
/*
一、字符输入流"FileReader"的使用
*/
@Test
public void FileReaderTest(){
	// 初始化FileReader流对象
	FileReader fr = null;
        try {
            // 使用File类创建源文件对象
            File inFile = new File("DataBaseDesc.txt");
            // 将文件对象和字符输入流进行连接绑定
            fr = new FileReader(inFile);
            // 局部变量,用于接收read的返回值,返回值为单次读取的字符个数,如果read的返回值为-1,则代表文件读取到了末尾
            int flag;
            
            // 写法一:单个字符读取
            // while ((flag = fr.read()) != -1) {
            	// 由于read返回值为int类型,因此输出的时候需要使用char进行强转
                // System.out.print((char)flag);
            // }
            
            // 写法二:创建字符数组,单次多字符读取
            char[] chs = new char[5];
            while((flag = fr.read(chs)) != -1){
            	// 使用字符数组读取,有两种输出到控制台的正确写法
				// 方法一
				String s = new String(chs, 0, flag);
				System.out.print(s);
				// 方法二
				for(int i = 0; i < flag; i++){
					System.out.print(chs[i]);
				}
			}
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fr != null){
                try {
                	// 关闭流资源
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
}

/*
二、字符输出流"FileWriter"的使用
说明:字符输出流的使用需要结合字符输出的读取后输出(即写入)到指定文件中,即在上面字符输入流的基础上进行修改得到,如下:
*/
@Test
public void fileReaderTest() {
    FileReader fr = null;
    // 第一处增加代码,初始化FileWriter流对象
    FileWriter fw = null;
    try {
        File inFile = new File("DataBaseDesc.txt");
        // 第二处增加代码,创建File输出的目标文件(可以不存在此文件,会自动创建)
        File outFile = new File("DataBaseDesc_1.txt");
        fr = new FileReader(inFile);
        // 第三处增加代码,初始化FileWriter对象连接和绑定输出目标文件对象
        fw = new FileWriter(outFile); 
        int flag;
        while ((flag = fr.read()) != -1) {
            // 使用单个字符读取的写入方式
            fw.write(flag);
        }
        char[] chs = new char[5];
        while ((flag = fr.read(chs)) != -1) {
        	// 第四处增加代码,使用字符输出流对象调用write方法将内容写入到文件中(这里使用的是字符数组,单词读取多个字符的方法读取,每次读取的内容存放在该数组中)
        	// 因此write方法第一个参数为该数组,0表示从字符数组的第一个元素开始写入,flag代表写入多少个字符(即单次读取了多少个字符就写入多少个字符)。
            fw.write(chs, 0, flag);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fr != null) {
            try {
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 第六处增加代码,关闭字符输出流资源
        if (fw != null) {
            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
3.2 字节输入流和字节输出流 (FileInputStream and FileOutputStream)
// 复制图片的操作(结合使用字节输入流和字节输出流)
@Test
public void testImageCopy(){
	// 创建字节输入流和字节输出流对象,初始赋值为null
    FileInputStream fileInputStream = null;
    FileOutputStream fileOutputStream = null;

    try {
        // 1. 提供输入和输出的图片文件对象
        File inputFile = new File("orange.jpg");
        File outputFile = new File("orange02.jpg");


        // 2. 提供字节输入和字节输出的流对象
        fileInputStream = new FileInputStream(inputFile);
        fileOutputStream = new FileOutputStream(outputFile);

        // 3. 读取和写入的操作(和字符输入输出流一样的套路)
        // 3.1 创建字节数组,大写为1024
        byte[] bytes = new byte[1024]; 
        // 3.2 创建int变量,用于接收read返回值
        int len;
        while ((len = fileInputStream.read(bytes)) != -1) {
        	// 将字节数组的内容按照每次读取的字节数从第一个字节开始写入到输出文件中
            fileOutputStream.write(bytes, 0, len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    // 关闭资源操作
    if (fileInputStream != null)
        try {
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    if (fileOutputStream != null)
        try {
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制程条件语句 if 条件语句 if...else 条件语句if...else if 多分支语句switch 多分支语句 循环语句 while 循环语句do...while 循环for 循环语句 跳转语句 break 语句 continue 语句面向对象 类也是-种对象对象的创建 属性和方法 构造方法 方法重载 方法的重写 初始化 类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 Throwable 常见的 Exception 与 Exception 有关的 Java 关键字 throws 和 throw try 、finally 、catch 什么是 Error 内部类 创建内部类集合 Iterable 接口顶层接口 ArrayList Vector LinkedList 类Stack HashSet TreeSet LinkedHashSet 类 PriorityQueue HashMap TreeMap 类 LinkedHashMap 类 Hashtable 类IdentityHashMap 类WeakHashMap 类 Collections 类集合实现类特征图 泛形 泛型的使用 用泛型表示类 用泛型表示接口泛型方法 泛型通配符 反射 Class 类Field 类Method 类ClassLoader 类 枚举 枚举特性 枚举和普通类-样枚举神秘之处 枚举类 I/O File 类 基础 IO 类和相关方法InputStream OutputStream Reader 类Writer 类 InputStream 及其子类 OutputStream 及其子类Reader 及其子类Writer 及其子类 注解 关于 null 的几种处理方式大小写敏感 null 是任何引用类型的初始值 null 只是-种特殊的值使用 Null-Safe 方法null 判断 关于思维导图 Java.IO Java.lang Java.math Java.net Java 基础核心总结 V2.0 IO 传统的 BIO BIO NIO 和 AIO 的区别什么是 的分类 节点和处理 Java IO 的核心类 File Java IO 对象 字节对象InputStream OutputStream 字符对象Reader Writer 字节与字符的转换新潮的 NIO 缓冲区(Buffer)通道(Channel) 示例:文件拷贝案例 BIO 和 NIO 拷贝文件的区别操作系统的零拷贝 选择器(Selectors) 选择键(SelectionKey) 示例:简易的客户端服务器通信 集合 集合框架总览 -、Iterator Iterable ListIterator 二、Map 和 Collection 接口Map 集合体系详解 HashMap LinkedHashMap TreeMap WeakHashMap Hashtable Collection 集合体系详解 Set 接口 AbstractSet 抽象类SortedSet 接口HashSet LinkedHashSet TreeSet List 接口 AbstractList 和 AbstractSequentialList Vector Stack ArrayList LinkedList Queue接口Deque 接口 AbstractQueue 抽象类LinkedList ArrayDeque PriorityQueue 反射的思想及作用 反射的基本使用 获取类的 Class 对象构造类的实例化对象获取-个类的所有信息 获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过反射调用方法反射的应用场景 Spring 的 IOC 容器反射 + 抽象工厂模式 JDBC 加载数据库驱动类反射的优势及缺陷 增加程序的灵活性破坏类的封装性 性能损耗 代理模式 静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量
内容简介 本书主要是冲着实际应用而来的,共分11章。在刚开始的第一章就详细地讲解了Java开发环境的搭建、反编译工具的使用、JDK文档资料的查阅,Java程序的编译、运行过程。在第二章中,全面地讲解Java的基本语法知识,对基本语法的讲解也不是泛泛而谈,而是在其中贯穿各种实际应用中的巧妙用法和注意事项。在第三章和第四章中,透彻系统地讲解了面向对象的思想和应用。在以后的章节中,用通俗易懂的手法,紧密联系实际应用的方式,深入浅出地讲解了多线程,常用Java类,Java中的I/O(输入输出)编程,GUI与Applet,网络编程等方面的知识。 本书许多内容都来源于程序员圈子里的非正式交,或源于某些成功的案例与作者的经验、心得,但这些东西对新手来说,是很难自学到的。作者从事了多年的软件开发和培训教学,非常清楚那些容易使新手困惑的问题,在学习过程中会碰到的拦路虎,作者结合了多年实际开发与教学经验,收集了众多学员在学习中常提到的问题,对平时讲课的内容进行了精心整理。读者从本书中不仅可以学习到Java本身方面的知识,还能学到了许多编程思想和实际操作手法,仿佛老手就在你面前进行现场演示一样。本书不仅全面的介绍了Java语言本身,最重要还交会读者去掌握编程思想,找到编程感觉,而不是死记硬背语言本身,书中涉及到的应用问题分析,远远超了一个Java程序员在学习和应用Java过程中所有可能碰到的问题。 本书不仅讲概念,讲怎么做,还告诉读者为什么;不仅讲操作技能,还贯穿一些系统的理论,这样读者才不至于不明不白,或是似乎明白,但不知道具体该怎么干。本书一步步引导读者深入,使读者轻松愉快、兴趣盎然、水到渠成、潜移默化地掌握Java编程及许多其他的软件开发思想。 本书语言畅,内容翔实,分析透彻,是一本适合广大计算机编程爱好者的优秀读物。本书结构合理,图文并茂,实用性强,适合于广大有经验的开发人员来迅速转换到Java语言,对广大初学计算机编程语言的爱好者来说,这本书就是非常好的切入点。本书基本理论知识完备,又紧密联系实际开发,也非常适合作为大专院校师生的教学与学习用书,将给广大师生带来一种革命性的教学方式与学习思路,令人耳目一新。 这不是一本参考资料和Java百科全书,不是什么"宝典"和"大全",但却可以让新手变为老手,相信学完此书,再看任何以前看不懂的Java书都会显得非常轻松。即使是很有经验的老手,也能从本书中有巨大收益。如果你想非常轻松就精通Java编程,并期望学完便能参加实际的开发工作,本书就是你非常好的一个选择。 目录: 第1章 Java开发前奏 1.1 Java虚拟机及Java的跨平台原理 1.2 Java开发环境的搭建 1.3 体验Java编程的过程 1.4 classpath的设置 1.5 有效利用Java的文档帮助 1.6 JVM(虚拟机)的运行过程 1.7 垃圾回收器 1.8 反编译工具的介绍 第2章 Java编程基础 2.1 Java基本语法格式 2.2 变量及变量的作用域 2.3 函数与函数的重载 2.4 Java中的运算符 2.5 程序的程控制 2.6 数组 第3章 面向对象(上) 3.1 面向对象的概念 3.2 类与对象 3.3 构造函数 3.4 this引用句柄 3.5 与垃圾回收有关的知识 3.6 函数的参数传递 3.7 Static关键字 3.8 内部类 3.9 使用Java的文档注释 第4章 面向对象(下) 4.1 类的继承 4.2 抽象类与接口 4.3 对象的多态性 4.4 异常 4.5 包 4.6 访问控制 4.7 使用jar文件 第5章 多线程 5.1 如何创建与理解线程 5.2 多线程的同步 5.3 线程间的通信 5.4 线程生命的控制 第6章 Java API 6.1 理解API的概念 6.2 工具软件的介绍与使用 6.3 String类和StringBuffer类 6.4 基本数据类型的对象包装类 6.5 集合类 6.6 Hashtable与Properties类 6.7 System类与Runtime类 6.8 Date与Calendar,DateFormat类 6.9 Math与Random类 6.10 学习API的方法 第7章 IO/输入输出 7.1 File类 7.2 RandomAccessFile类 7.3 节点 7.4 过滤与包装类 7.5 IO中的高级应用 第8章 图形用户界面GUI(一) 8.1 初识AWT 8.2 AWT线程 8.3 AWT事件处理 8.4 GUI组件上的图形操作 第9章 图形用户界面GUI(二) 9.1 常用AWT组件 9.2 布局管理器 9.3 Swing 第10章 Applet 10.1 浏览器怎样显示网页 10.2 浏览器处理网页脚本代码的过程 10.3 浏览器怎么处理Applet 10.4 Applet类及其方法 10.5 一个显示动画的Applet的程序 10.6 关于Java的一些细节 10.7 验证Applet对象在客户端如何存在 第11章 网络编程 11.1 网络编程的基础知识 11.2 Java编写UDP网络程序 11.3 Java编写TCP网络程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值