在計算機中文件的分類
- 二進制文件
- 文本文件
在java中流的分類
- 字節(jié)流:操作二進制文件
- 字符流: 操作文本文件
流: stream 系列的都是字節(jié)流
- InputStream 輸入字節(jié)流的超類
- OutPutStream 輸出字節(jié)流的超類
- FileInputStream 文件輸入流,用于從文件中獲得字節(jié)輸入流
- FileOutputStream 文件輸出流
- BufferedInputStream InputStream的子類,使用裝飾者模式對FileInputStream進行裝飾
- BufferedOutputStream
- DataInputStream:InputStream的子類,使用裝飾者模式對輸入輸出流進行裝飾,將變量輸出到流
- DataOutputStream: 將數(shù)據(jù)讀出,按照順序讀出
圖片.png
字節(jié)流使用
圖片.png
使用FIleInput/OutputStream
//使用FileInput / OutputStream
//一個字節(jié)一個字節(jié)搞,太慢,可以使用BufferedInputStream提高速度
@SuppressWarnings("resource")
public static void main(String[] args) {
try {
FileInputStream fileInputStream = new FileInputStream(new File("d:/img/1.mp4"));
FileOutputStream fileOutputStream = new FileOutputStream(new File("d:/img/2.mp4"));
int len = -1;
while ((len = fileInputStream.read())!=-1) {
fileOutputStream.write(len);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
拷貝一個100M的視頻所需時間(未使用緩存).png
使用BufferedInput/OutputStream ,這個類自帶buff 為8K
@SuppressWarnings("resource")
public static void main(String[] args) {
try {
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("d:/img/1.mp4"));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("d:/img/2.mp4"));
int len = -1;
while ((len=bufferedInputStream.read())!=-1) {
bufferedOutputStream.write(len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
使用自帶buff的流來拷貝.png
使用DataInput / OutStream
數(shù)據(jù)輸入流允許應用程序以與機器無關(guān)方式從底層輸入流中讀取基本 Java 數(shù)據(jù)類型小槐。應用程序可以使用數(shù)據(jù)輸出流寫入稍后由數(shù)據(jù)輸入流讀取的數(shù)據(jù)。
DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(new File("d:/img/1.txt")));
dataOutputStream.writeInt(132);
dataOutputStream.writeDouble(0.01);
dataOutputStream.writeUTF("這是一個字符串");
//讀取剛才通過DataOutputStream 寫入的數(shù)據(jù)
//要按照寫入的順序讀取
DataInputStream dataInputStream = new DataInputStream(new FileInputStream(new File("d:/img/1.txt")));
int readInt = dataInputStream.readInt();
double readDouble = dataInputStream.readDouble();
String readUTF = dataInputStream.readUTF();
System.out.println(readInt);
System.out.println(readDouble);
System.out.println(readUTF);
使用ObjectInput / OutputStrem 之前,需要將要寫入的對象的類序列化,不然會引發(fā)異常
圖片.png
//將一個student對象寫入
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Student() {
super();
}
public Student(String name, String address) {
super();
this.name = name;
this.address = address;
}
}
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("d:/img/1.abc")));
objectOutputStream.writeObject(student);
//嘗試將對象讀出來
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("d:/img/1.abc")));
Student student2 = (Student) objectInputStream.readObject();
System.out.println(student2);
字符流使用
通過字符流可以很方便的將字符寫入writer
圖片.png
使用BufferedWriter/Reader
使用完Buffered后如果沒有flush和close,數(shù)據(jù)將不會被寫入進文件
//bufferWriter 若目標文件不存在,會自動創(chuàng)建文件
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("d:/img/2.abc"))));
bufferedWriter.write("這個是一個字符串");
bufferedWriter.write("qweasd");
bufferedWriter.flush();
bufferedWriter.close();
//使用BufferedReader來將數(shù)據(jù)讀出
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("d:/img/2.abc")));
String string = null;
StringBuilder stringBuilder = new StringBuilder();
while ((string = bufferedReader.readLine())!=null) {
stringBuilder.append(string);
}
使用FileWriter/Reader
若文件不存在,將自動創(chuàng)建文件
FileWriter fileWriter = new FileWriter(new File("d:/img/2.txt"));
fileWriter.write("這是一個字符串");
fileWriter.write("\n");
fileWriter.write("這是一個字符串2哦");
fileWriter.flush();
fileWriter.close();
//讀取數(shù)據(jù)
FileReader fileReader = new FileReader(new File("d:/img/2.txt"));
int len = -1;
StringBuilder stringBuilder = new StringBuilder();
char[] buff = new char[512];
while ((len = fileReader.read(buff)) != -1) {
stringBuilder.append(buff, 0, len);
}
System.out.println(stringBuilder);
使用OutputStreamWriter/InputStreamReader
如果目標文件不存在,將會創(chuàng)建文件
圖片.png
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("d:/img/3.txt"));
outputStreamWriter.write("這是一個男字符串");
outputStreamWriter.write("這是一個女字符串");
outputStreamWriter.flush();
outputStreamWriter.close();
//讀取數(shù)據(jù)
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("d:/img/3.txt"));
int len = -1;
char[] buff = new char[512];
StringBuilder sBuilder = new StringBuilder();
while ((len = inputStreamReader.read(buff))!=-1) {
sBuilder.append(buff,0,len);
}
System.out.println(sBuilder);