目录
每日一讲
昨天是一张过期的支票,无法挽回,明天是一张尚未兑现的支票,你永远不知道能否兑现。而只有今天,是你手中流动的现金,可以买你喜欢的花和面包!
1.IO流简介
IO流:指的是Input流和Output流,也就是输入流和输出流。
1.1IO流的作用
所谓的流,可以指流动、传输。那么,是什么流动呢?答案是数据!数据的流动与传输,而IO流的主要目的就是用来处理设备之间数据传输的问题。
在JDK11API帮助文档中对于java.io软件包是如下解释:通过数据流、序列化和文件系统提供系统输入和输出。除非另有说明,否则将null参数传递给此包中任何类或接口中的构造函数或方法将导致抛出NullPointException。
1.2输入输出流应用
- 音乐串烧(用代码实现将多段音乐合成一段)
- 文件复制
- 图片处理
2. 应用代码实现
用几个简单的例子来更加深入的理解IO流。
2.1读取txt文件,将文件内容输出到控制台
读取txt文件中的内容,首先我们要明白输入输出流中的特点:
- Java中所有的输入流都有xxxInput或者xxxReader,数据从硬盘流向内存。
- Java中所有的输出流都有xxxOutput或者xxxWriter,数据从内存流向硬盘。
2.11代码实现
在代码实现之前我们也还需要知道两个概念:字节流和字符流
- 字符流:用记事本打开文件可以读懂里面的内容,有xxxReader或xxxWriter的特点。
- 字节流:用记事本打开文件,都是乱码,比如图片、音视频文件等;有xxxStream的特点。
1.单字符读取
public static void main(String[] args) throws IOException {
FileReader fileReader=new FileReader("D:/java/Test/myTest.txt");
int ch=0;
while((ch=fileReader.read())!=-1){
System.out.println((char)ch);
}
fileReader.close();//关闭流、释放资源(内存)
}
2. 整行读取
public static void main(String[] args) throws IOException {
FileReader fileReader=new FileReader("D:/java/Test/tem.txt");
BufferedReader bufferedReader =new BufferedReader(fileReader);
String line="";
while((line=bufferedReader.readLine())!=null)
{
System.out.println(line);
}
//关闭资源
bufferedReader.close();
}
我们可以发现两段代码中有差别的是以下一句代码:
BufferedReader bufferedReader =new BufferedReader(fileReader);
这句代码可以帮助我们实现整行读取,因为它具有bufferedReader.readLine()方法,用于读取整行字符。
2.12代码实现流程
首先,我们要使用FileReader读取txt文件,也就是数据从硬盘流向内存,然后使用BufferedReader包装流FileReader,最终将读取到的结果输出到控制台中。
其中,涉及到了两个重要的概念:包装流和流的末尾。
- 包装流: 在原始的字节流或者字符流的基础上,为了提高代码效率而再次处理的流。
- 流的末尾:简单的说,则是上面while循环中结束的条件。
2.2文件复制
2.21什么是文件复制
文件复制,顾名思义,就是Ctrl cv工程。这样听起来是不是十分的简单,easy~,同样的,在代码中,我们也能根据这个思路来写。Ctrl+c就是相当于读取文件,Ctrl+v相当于写文件。所以文件复制需要做的是先读后写,用到的是字节流。
2.22一次一字节代码实现
public static void main(String[] args) throws IOException {
//使用的字节流
FileInputStream fileInputStream=new FileInputStream("D:/java/Test/hi.txt");
FileOutputStream fileOutputStream=new FileOutputStream("D:/java/Test/hiCopy.txt");
//一次性读一个字节
int ch=0;
while((ch=fileInputStream.read())!=-1){
//写1次
fileOutputStream.write(ch);
}
//关闭资源
fileInputStream.close();
fileOutputStream.close();
}
结果显示原本文件夹中只有一个hi.txt文件。
文件的内容
运行代码后,我们发现文件夹中会多出一个hiCopy.txt文件。
文件内容显示,和hi.txt文件中一模一样。
我们发现如果类似于这个代码中的文件传输,是完全没有问题的,因为这个txt文件的内存大小只有1KB,如果文件大小是几百上千兆,那么这时候的传输效率则是非常低的,此时我们需要改善代码,使得每次写的字节更多。
2.23代码改进之一次写入多字节
public static void main(String[] args) throws IOException {
//使用的字节流
FileInputStream fileInputStream=new FileInputStream("D:/java/Test/hi.txt");
FileOutputStream fileOutputStream=new FileOutputStream("D:/java/Test/hiCopy.txt");
byte buff[]=new byte[1024];
int ch=0;
while((ch=fileInputStream.read(buff))!=-1){
//写1次,1次1024字节
fileOutputStream.write(buff,0,ch);
}
//关闭资源
fileInputStream.close();
fileOutputStream.close();
}
此时此刻,我们发现,我们传输几百兆的文件也只需要几秒钟的时间咯。
2.3音乐串烧
所谓的音乐串烧就是多个音频文件合成一个音频文件。
2.31代码实现
/*
需求分析:实现音乐串烧(将多个音乐文件合并成一个)
*/
public static void main(String[] args) throws IOException {
//建立一个String数组保存文件名
String fileName[]={
"D:/java/Test/败给爱情.mp3",
"D:/java/Test/最初的爱.mp3"
};
//创建
FileOutputStream fileOutputStream=new FileOutputStream("D:/java/Test/音乐串烧.mp3");
for (int i = 0; i<fileName.length; i++) {
//读取文件
FileInputStream fileInputStream=new FileInputStream(fileName[i]);
int ch=0;
byte buff[]=new byte[1024*4];
while((ch=fileInputStream.read(buff))!=-1) {
fileOutputStream.write(buff,0,ch);
}
fileInputStream.close();
}
fileOutputStream.close();
}
此时需要注意,如果按照我上面所写的代码只能合成MP3格式的音频文件,如果需要合成其他格式的代码在网上另寻文章。
2.32结果显示
我们可以看到文件内存大小正确,打开音频时长正常,播放正常。
此外,使用IO流还能够进行图片文件合成与拆分,视频文件处理等等,后续也会进行更新。
好咯,本期文章到此结束,希望对你有所帮助,加油陌生人,争取早日成为大佬!!!