Java IO输入输出流
初识IO
IO,即是input和output,即输入和输入,指应用程序和外部设备之间的数据传递
流(Stream),是一个抽象的概念,指一连串的数据(字符或字节),以先入先出的方式发送信息的通道
当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接;当程序需要写入数据的时候,就会开启一个通向目的地的流。
流的几大特性
-
先入先出:最先写入输出流的数据,最先被输入流读取到
-
顺序存取:可以按顺序一个接一个往流中写入一串字节,读出时也将按顺序读取一串字节,但不允许随机访问其中数据(RandomAccessFile除外)
-
只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两种功能,输入流只能进行读,输出流只能进行写。
流的分类
- 按照流的方向分类(以内存为参照物)
- 往内存中去,叫做输入流,即读操作
- 从内容中出,叫做输出流,即写操作
- 按照读取数据方式的不同分类
- 按字节的方式读取,一次读取1个字节,可以读取任意类型的文件,如文本、图片、声音等
- 按字符的方式读取,一次读取1个字符,为方便读取文本文件而存在,只能读取纯文本文件
IO包下的重要流
- 文件专属
- FileInputStream
- FileOutputStream
- FileReader
- FileWriter
- 转换流
- InputStreamWriter
- OutputStreamReader
- 缓冲流专属
- BufferedReader
- BufferedWriter
- BuffertedInputStream
- BuffertedOutputStream
- 数据流专属
- DataInputStream
- DataOutputStream
- 标准输出流
- PrintWriter
- PrintStream
- 对象专属流
- ObjectInputStream
- ObjectOutputStream
对任意文件的读写
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class myFileCopy {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
//每次拷贝1MB
byte[] bytes = new byte[1024*1024];
int readCount = 0;
StringBuilder sb = new StringBuilder();
try {
fis = new FileInputStream("test.jpg");
fos = new FileOutputStream("test1.jpg");
//一边读一边写
while ((readCount = fis.read(bytes)) != -1){
fos.write(bytes,0,readCount);
}
//强制输出所有输出流
fos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//不分开写一个出问题就会影响到另一个流的关闭
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
目录的复制(递归)
import java.io.*;
public class FileTest {
//目标目录路径
public static String tempPath = "D:\\doc\\ideaDoc\\javaweb\\goodsTemp";
public static void main(String[] args) {
//源文件路径
File file = new File("D:\\doc\\ideaDoc\\javaweb\\goods");
copyAllFile(file,tempPath);
}
public static void copyAllFile(File file,String path){
//拼接出目标目录路径
path = path + "\\" + file.getName();
if(file.isFile()){
copyFile(file,path);
}
else if(file.isDirectory()){
File myFile = new File(path);
//递归到最后一级目录时创建到该目录下所有目录
myFile.mkdirs();
File[] files = file.listFiles();
for(File f : files){
//复制目录下文件到目标目录
copyAllFile(f,path);
}
}
}
public static void copyFile(File file,String path){
//使用缓冲字节流可以提高读写效率,这里用的文件字节流
FileInputStream fis = null;
FileOutputStream fos = null;
try {
int readCount = 0;
fis = new FileInputStream(file);
fos = new FileOutputStream(path);
byte[] bytes = new byte[1024];
while ((readCount = fis.read(bytes)) != -1)
fos.write(bytes,0,readCount);
fos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
} else if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}