新来的实习生连文件操作都不会,被老师傅骂了,有点委屈~

简介: 今天,是鸭哥面试系列的第 4 篇。工作时,你的项目需要操作文件吗?

一个程序运行时,变量、数组和对象中存储的数据都是存在于内存条中的,当程序运行结束,或者计算机断电时,它们就会消失。而现在的项目工程,往往涉及到大量需要长时间保存的数据,而磁盘文件能够永久保存数据,所以数据处理和文件操作知识就密切相关了。


掌握文件操作,能够大大提高我们对数据的处理能力。所以今天鸭哥想和大家一起,聊聊文件操作那些事儿~



# 基本概念


流是一组有序的数据序列,分为输入流和输出流。输入流表示从一个源读取数据,输出流表示向一个目的地写数据。虽然流通常与文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口。


InputStream 类


InputStream 类是字节输入流的抽象类,是所有字节输入流的父类。该类中所有方法遇到错误都会引发 IOException 异常。


Reader 类


InputStream 是用来处理字节的,并不适合用来处理字符文本,Java 为字符文本的输入专门提供了单独的类 Reader,Reader 类是字符输入流的抽象类,所有字符输入流的实现都是它的子类。


OutputStream 类


OutputStream 类是字节输出流的抽象类,类中的所有方法均返回void,在遇到错误时会引发 IOException。


Writer 类


同样,Java 提供了字符输出流的抽象类 Writer,所有字符输出类的实现都是它的子类。为了让大家一目了然,贴心的鸭哥特意整理了一张描述I/O(Input/Output)流的类层次图(建议收藏保存)


image.png


案例演示:文件的简单复制


我们最常用的两个流就是 FileInputStream 和 FileOutputStream。FileInputStream 用于从文件读取数据,它的对象可以用关键字 new 来创建。FileOutputStream 用来创建一个文件并向文件中写数据。如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。


下面的代码实现了文件的简单复制功能,


import java.io.*;
public class IOTest {
    public static void main(String[] args) {
        //创建源文件及复制文件的对象
        File sourcefile = new File("E:/duckAndJava/IO/testFile.txt");
        File copyfile = new File("E:/duckAndJava/IO/copiedTestFile.txt");
        FileInputStream fileInputStream = null;    // 从文件中读数据
        FileOutputStream fileOutputStream = null;    // 用于把数据写入文件
        BufferedWriter bufferedWriter = null;    // 用于把数据写入文件
        try {
            if (!sourcefile.exists()) {
                sourcefile.createNewFile();
                bufferedWriter = new BufferedWriter(new FileWriter(sourcefile));
                // bufferedwriter 自动追加数据
                String s = new String(" I love duckAndJava.");
                char bchar[] = s.toCharArray();
                for (int i = 0; i < 3; i++) {
                    // 往文件中写数据
                    bufferedWriter.write(bchar, 0, bchar.length);
                    bufferedWriter.write("\n");
                }
                // 写完之后,才能关闭流
                bufferedWriter.flush();
                bufferedWriter.close();
            }
            //复制文件
            copyfile.createNewFile();
            fileInputStream = new FileInputStream(sourcefile);  
            //另一种创建方法:InputStream fileInputStream = new FileInputStream("E:/duckAndJava/IO/testFile.txt");
            fileOutputStream = new FileOutputStream(copyfile);
            //另一种创建方法:OutputStream fileOutputStream = new FileOutputStream("E:/duckAndJava/IO/copiedTestFile.txt")
            byte b[] = new byte[1024];
            int len = b.length;
            while ((len = fileInputStream.read(b, 0, len)) > 0) {//到达流末尾时,返回-1,跳出循环
                fileOutputStream.write(b, 0, len);
                fileOutputStream.flush();
            }
            System.out.println("复制文件完成");
            fileInputStream.close();
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


上面代码的功能实现可以分为三个部分:

  1. 如果源文件不存在,我们就创建源文件,并向文件中写入数据;
  2. 从源文件中读取输入流到字节数组中;
  3. 将字节数组中通过输出流写入到复制文件中


image.png



# 拓展


细心的读者可能已经发现了,鸭哥在文件复制的代码中,除了使用FileInputStream类 和 FileOutputStream类,还使用了 File 类。File 类是 java.io 包中唯一代表磁盘文件本身的对象。我们可以通过File类的方法,实现创建。删除和重命名文件等操作,而且这些操作与平台无关。建议大家多多学习相关操作~


在源文件不存在,创建源文件写数据时,鸭哥使用了 BufferedWriter ,它是 Writer 的子类,是以字符流的形式写入了源文件的数据。


而复制源文件时,鸭哥使用的则是 FileInputStream 的 read() 方法,和 FileOutputStream 的 write() 方法,它们都属于字节流操作。


一个样例,两类数据流(字符和字节),三个 I/O 类。本文的样例包含了很多值得细细品味的内容,你体会到鸭哥样例设计的用心良苦了吗?




相关文章
|
8月前
|
存储 缓存 安全
面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!
面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!
56 1
|
存储 安全 Python
python多线程------>这个玩意很哇塞,你不来看看吗
python多线程------>这个玩意很哇塞,你不来看看吗
|
消息中间件 JavaScript 小程序
新来个阿里 P7,仅花 2 小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!
新来个阿里 P7,仅花 2 小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!
满地坑!细数IO操作的几个坑
IO是我们日常开发中经常使用到的技能,但是一不小心我们就会踩坑,今天梳理了我在工作中遇到的一些问题
|
Web App开发 前端开发 JavaScript
冬奥快结束了还没有抢到冰墩墩?程序员一招让你不用排队不用愁!
随着“2022北京冬奥会”的盛大开幕,冰墩墩的热度与日俱增,线上被抢空,线下排长龙,为购买冰墩墩苦恼的竟少了几根秀发!如今冬奥马上就要拉下帷幕,还没抢到“冰墩墩”不要紧,这款程序来帮忙,国内一位程序员dragonir用前端+建模的方式自己就实现了线上拥有“冰墩墩”,同时将代码开源到了GitHub上,不得不感叹科技的力量,程序员的伟大,让拥有“冰墩墩”变得如此简单!
冬奥快结束了还没有抢到冰墩墩?程序员一招让你不用排队不用愁!
|
人工智能 安全 数据挖掘
这么一搞,再也不怕线程打架了
假如我们需要处理一个文本文件,里面有 100万行数据,需要对每条数据做处理,比如将每行数据的数字做一个运算,放入到另一个文件里。
151 0
这么一搞,再也不怕线程打架了
|
Java
六道热门多线程面试题,你学废了吗?
六道热门多线程面试题,你学废了吗?
116 0
六道热门多线程面试题,你学废了吗?
|
SQL 安全 前端开发
来来来开小灶了,年后求职和跳槽的看过来,悄悄的看悄悄的收藏
面试官,您好我叫(XXX),今天来公司面试 JAVA开发工程师,之前在(XXX 公司)任职,从事这一行已经有(几)个年头了。这几年开发,主要接触的项目包括(你做过的项目!)等。在开发过程中,也用过好些框架,比如∶ springboot、springcloud、springmvc、spring、Mybatis等技术框架。熟练掌握框架之间的整合技术。有时候因为项目需求或是为了开发的高效性,自己我会研究一些技术,使用一些常用的主流 Java技术,例如∶(吹!用没用过不重要,主要是就是英文的!)。前端的技术也研究过一些。如(原生的、框架啊都往上整!)
211 0
来来来开小灶了,年后求职和跳槽的看过来,悄悄的看悄悄的收藏
万万没想到,线程居然被饿死了!
万万没想到,线程居然被饿死了!
|
SQL 监控 安全
7年未痒蚂蚁路:给了我工作,还给了我老婆
蚂蚁社招正式向你抛出橄榄枝~
1463 0
7年未痒蚂蚁路:给了我工作,还给了我老婆

相关实验场景

更多