前言
在我心目中,能在操作系统中存储文件,读取文件一直是一个神秘的领域,能用编程完成文件的增删改查是我之前学编程时的动力之一,之前的C语言最多只会写入txt文档,并且读出来还非常费劲,Python因为各种包的存在,保存文件以及读取文件变得非常轻松,但是操作文件又是另一回事了,对于包不支持的文件类型就毫无办法(只是我不知道而已),现在来到了Java,这次在拉钩大数据课程的辅助下,我准备整理出文件操作的方法,以及配合多线程和网络编程,完成一些之前看来是不可能的任务。
正文
首先所有文件都可以用字节进行传输
但是读取字符的时候需要使用字符流(也可以把字节流转为字符流然后进行读取)
下图是所有的IO流结构
代码实际操作目录
接下来以几个小例子充分理解IO流的内容
1.txt文件输入,控制台字符输出
2.控制台字符输入,txt文件输出
3.任意文件输入,任意文件输出(复制操作)
4.遍历文件夹下所有文件并复制
5.保存类文件并读取
6.在网络程序中实现文件传输
代码实际操作
1.txt文件输入,控制台字符输出
package com.csdn.IO;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Work2 {
public static void main(String[] args) {
FileReader fr =null;
BufferedReader br = null;
try {
fr = new FileReader("d:/a.txt");
br=new BufferedReader(fr);
String str=null;
while ((str=br.readLine())!=null)
{
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(br!=null) {
br.close();
}
if(null!=fr) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.csdn.IO;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Work1 {
public static void main(String[] args) {
FileWriter fw= null;
BufferedWriter br = null;
try {
fw = null;
br = null;
//FileWriter是基础的文件写入类,可以理解为最底层搬砖的
//苦活累活都是他干,而且还特别蠢,需要很多额外操作来确保工作尽如人意
fw=new FileWriter("d:/a.txt");
//BufferedWriter是较为高层的操作流,对输入的民工流(FileWriter)进行操作
//并且提高民工流的可用性和效率
br= new BufferedWriter(fw);
char[] a = new char[]{'韩','b','c','d'};
br.write(a,0,4);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(null!=br)
{
br.close();
}
if(null!=fw) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
对文件进行写入操作时可以选择是否覆盖之前的内容,只需要在append参数这里选择true或者不填默认false
package com.csdn.IO;
import java.io.*;
public class Work3 {
public static void main(String[] args) {
FileInputStream fis=null;
BufferedInputStream bis=null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
fos = new FileOutputStream("d:/target.mkv");
bos = new BufferedOutputStream(fos);
fis= new FileInputStream("D:/美剧/末日孤舰 第1季/1.mkv");
bis= new BufferedInputStream(fis);
int len = 0;
byte[] temp= new byte[1024];
while((len=bis.read(temp))!=-1 )
{
bos.write(temp,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bos.close();
fos.close();
bis.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.csdn.IO;
import java.io.*;
public class Work4 {
public static void show(File[] files)
{
BufferedInputStream bis = null;
BufferedOutputStream bof =null;
for(File f :files)
{
if(f.isDirectory())
{
System.out.println("目录:" + f.getName());
Work4.show(f.listFiles());
}
else if(f.isFile())
{
try {
bis=new BufferedInputStream(new FileInputStream(f.getAbsoluteFile()));
bof=new BufferedOutputStream(new FileOutputStream("d:/test/"+f.getName()));
System.out.println("d:/test/"+f.getName());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
bof.close();
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
File a = new File("C:/Users/Administrator/Desktop/模块四 Java核心类库(下)/模块四 Java核心类库(下)/02任务二 IO流");
File[] files = a.listFiles();
Work4.show(files);
}
}
一点小理解
在数据流中,其实包括几个方面:
1.A->B,如果是B是文件字节,就用FileOutputtStream,如果是文件字符,就用FileWrite
2.A->B,如果A是非java内部的数据类型,就用BufferedOutputStream,如果A是java内部的数据类型,比如基本数据类型或者定义的类,那么就用Data
文件传输流并不关心你要传的具体数据,只是关心你要 传的数据类型与文件的位置