IO流
一.概述及分类
A:IO流概述
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中 java.io
B:IO流分类
a:按照数据流向 站在内存角度
输入流 读入数据
输出流 写出数据
b:按照数据类型
字节流 可以读写任何类型的文件 比如音频 视频 文本文件
字符流 只能读写文本文件
二、字节输入输出流
InputStream:字节输入流,输入流所关联的文件不存在,则会报错
OutputStream:字节输出流,输出流所关联的文件不存在,会自动创建
注意:流用完之后必须关闭以释放资源,否则可能出现内存泄漏
1、文件输入流(FileInputStream)
常用方法
构造方法:
FileInputStream(File|String file|name);
FileInputStream in=new FileInputStream("e.txt");
in.read();
in.read(new byte[1024]);
in.read(new byte[1024],起始索引,读取字节长度);
in.close();
2、文件输出流(FileOutputStream)
常用方法
FileOutputStream out=new FileOutputStream(file|name);
out.write(97);
out.write(字节数组);
out.write(字节数组,起始索引,写入字节个数);
out.write("\r\n".getBytes());
FileOutputStream(file|name,true);
out.close();
3、使用文件输入输出流进行文件的复制
方式一:一次读一个字节,写一个字节(效率低,一般不使用)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("e.txt");
FileOutputStream out = new FileOutputStream("ee.txt");
int len=0;
while ((len=in.read())!=-1){
out.write(len);
out.flush();
}
out.close();
in.close();
}
}
方式二:一次读写一个字节数组(效率高)
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyFile {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("e.txt");
FileOutputStream out = new FileOutputStream("ee.txt");
byte[] bytes=new byte[1024*1024];
int len=0;
long start = System.currentTimeMillis();
while ((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
long end = System.currentTimeMillis();
System.out.println((end-start)+"ms");
in.close();
out.flush();
}
}
4、流的异常处理
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) {
FileInputStream in=null;
FileOutputStream out=null;
try {
File file = new File("e.txt");
if(file.exists()){
in = new FileInputStream(file);
}
File file1 = new File("ee.txt");
if(file1.exists()){
out = new FileOutputStream(file1);
}
if(in!=null&&out!=null){
byte[] bytes=new byte[1024*1024];
int len=0;
long start = System.currentTimeMillis();
while ((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
long end = System.currentTimeMillis();
System.out.println((end-start)+"ms");
}
}catch (IOException e){
e.printStackTrace();
}finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (out != null) {
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
5、高效(通过内部缓冲区实现)的文件输入输出流
BufferedInputStream:高效的文件输入流
BufferedInputStream(InputStream in):
创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in, int size)
创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedOutputStream:高效的文件输出流
BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream(OutputStream out, int size)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
复制文件方式三 :使用高效的文件输入输出流
import java.io.*;
public class Demo {
public static void main(String[] args) throws IOException {
BufferedInputStream bufferIn = new BufferedInputStream(new FileInputStream("a.txt"));
BufferedOutputStream bufferOut = new BufferedOutputStream(new FileOutputStream("aa.txt"));
int len;
byte[] bytes=new byte[1024*8];
while ((len=bufferIn.read(bytes))!=-1){
bufferOut.write(bytes,0,len);
bufferOut.flush();
}
bufferIn.close();
bufferOut.close();
}
}
三、字符输入输出流
Reader:用于读取字符流的抽象类
Writer:写入字符流的抽象类
编码:把字符串转成字节数组,采用默认的码表进行编码,也可指定码表
解码:把字节数组转换成字符串,采用默认的码表进行解码,也可指定码表
注意:a、编解码使用码表要一致,否则会出现乱码
b、写入数据后必须刷新,否则数据写不过去
1、InputStreamReader(字符转换输入流)
InputStreamReader in=new InputStreamReader(new FileInputStream("a.txt"));
in.read();
in.read(new char[1024]);
in.read(new char[1024],0,3);
2、OutputStreamWriter(字符转换输出流)
OutputStreamWriter out=new OutputStreamWriter(new FileOutputStream("aa.txt",true));
out.write('你');
out.write("你好");
out.write("你好",0,1);
out.write(new byte[]{'a','你','好'});
out.write(new byte[]{'a','你','好'},1,2);
out.close();
3、FileWriter和FileReader
FileWriter和FileReader和InputStreamReader和OutputStreamWriter区别:
FileWriter和FileReader不可指定编码表编码。
4、高效字符流(缓冲区)
BufferedReader bin=new BufferedReader(new FileReader("a.txt"));
bin.readLine();
BufferedWriter bout=new BufferedWriter(new FileWriter("aa.txt"));
bout.newLine();
5、复制文本文件
方式一:读一个字符数组,写一个字符数组
import java.io.*;
public class Demo {
public static void main(String[] args) throws IOException {
InputStreamReader in = new InputStreamReader(new FileInputStream("a.txt"));
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("aaa.doc"));
char[] chars = new char[1000];
int len=0;
while ((len=in.read(chars))!=-1){
out.write(chars,0,len);
out.flush();
}
in.close();
out.close();
}
}
方式二:读一行写一行
import java.io.*;
public class MyTest2 {
public static void main(String[] args) throws IOException {
BufferedReader bin = new BufferedReader(new FileReader("MyTest1.java"));
BufferedWriter bout = new BufferedWriter(new FileWriter("Test.java"));
String line=null;
char[] chars = new char[1000];
while ((line=bin.readLine())!=null){
bout.write(line);
bout.newLine();
bout.flush();
}
bin.close();
bout.close();
}
}
6、第二种键盘录入方式
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test{
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入数据");
String s = reader.readLine();
System.out.println(s);
}
}
四、例题
1、将多级文件夹复制到指定目录下
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyFolder {
public static void main(String[] args)throws IOException {
File sourceFile = new File("C:\\Users\\Administrator\\Desktop\\新建文件夹");
File copyFile = new File("D:\\");
CopyMultistageFile(sourceFile,copyFile);
}
private static void CopyMultistageFile(File sourceFile, File copyFile) throws IOException {
File file = new File(copyFile, sourceFile.getName());
if(sourceFile.isFile()){
copyFile(sourceFile, file);
return;
}
if(!file.exists()){
file.mkdir();
}
File[] files = sourceFile.listFiles();
for (File f : files) {
if(f.isFile()){
File file1 = new File(file, f.getName());
copyFile(f, file1);
}else {
CopyMultistageFile(f,file);
}
}
}
private static void copyFile(File f, File f1) throws IOException {
FileInputStream in = new FileInputStream(f);
FileOutputStream out = new FileOutputStream(f1);
int len;
byte[] bytes=new byte[1024*1024];
while ((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
in.close();
out.close();
}
}
2、复制多级文件夹只保留其中的.txt文件并将其修改为.doc文件
import java.io.*;
public class CopyModify {
public static void main(String[] args) throws IOException {
File sourceFolder = new File("C:\\Users\\Administrator\\Desktop\\新建文件夹");
File targetPath = new File("D:\\");
copyModifyTheSuffixName(sourceFolder,targetPath);
}
private static void copyModifyTheSuffixName(File sourceFolder, File targetPath) throws IOException {
File file = new File(targetPath, sourceFolder.getName()+"(doc)");
if(!file.exists()){
file.mkdir();
}
File[] files = sourceFolder.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if(name.endsWith(".txt")||new File(dir,name).isDirectory()){
return true;
}
return false;
}
});
for (File f : files) {
if(f.isFile()){
copy(f,file);
}else {
copyModifyTheSuffixName(f,file);
}
}
}
private static void copy(File f, File f2) throws IOException {
FileInputStream in = new FileInputStream(f);
File file = new File(f2, f.getName().replace(".txt", ".doc"));
FileOutputStream out = new FileOutputStream(file);
int len=0;
byte[] bytes = new byte[1024 * 8];
while ((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
in.close();
out.close();
}
}
3、合并文件:将两首歌合并为一首
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
public class MyDemo1 {
public static void main(String[] args) throws IOException {
FileInputStream in1 = new FileInputStream("许巍 - 曾经的你.mp3");
FileInputStream in2 = new FileInputStream("许巍 - 蓝莲花.mp3");
FileOutputStream out = new FileOutputStream("许巍大合唱.mp3");
ArrayList<FileInputStream> list = new ArrayList<>();
list.add(in1);
list.add(in2);
int len=0;
byte[] bytes = new byte[1024 * 1024];
for (FileInputStream in : list) {
while ((len= in.read(bytes))!=-1){
out.write(bytes,0,len);
out.flush();
}
in.close();
}
out.close();
}
}