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();
}
}