文件流:輸出流: package io; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** JAVA IO 輸入與輸出 Input和Output ...
文件流:輸出流:
package io;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
-
JAVA IO 輸入與輸出 Input和Output
-
java將讀寫功能按照方向劃分為輸入與輸出:
-
輸入負責讀取,是從外界進入到我們的程式的方向
-
輸出負責寫出,是從我們的程式到外界的方向
-
java將IO比喻為是"流",英文是:Stream
-
像水流一樣,我們向著同一側方向順序移動的過程,只不過在java io中我們的流是位元組流,流動的是
-
位元組。
-
而這裡JAVA的IO流可以想象為是連接我們程式與另一端的"管道",內部向著同一側方向順序移動位元組。
-
java.io.InputStream和OutputStream是所有位元組輸入與輸出流的超類,本身是抽象類,不可以
-
實例化,裡面定義了基本的讀寫位元組的相關方法。
-
文件流
-
java.io.FileInputStream和FileOutputStream
-
文件流是連接文件與程式的管道,負責對文件進行讀寫的流。
-
java.io.FileInputStream繼承自InputStream,裡面定義了讀取位元組的相關方法。
-
java.io.FileOutputStream繼承自OutputStream,裡面定義了寫出位元組的相關方法。
/
public class FOSDemo {
public static void main(String[] args) throws IOException {
//向當前項目目錄中的文件fos.dat中寫入位元組數據
//上述需求中的關鍵詞:文件,寫 應當使用文件輸出流。
FileOutputStream fos = new FileOutputStream("./fos.dat");//alt+回車 選擇Add exception....
/
java.io.OutputStream超類上定義了寫出一個位元組的方法:
void write(int d)
寫出一個位元組,寫出的是給定的int值對應的2進位的"低八位"文件流實現了上述方法,作用是向文件中寫入1個位元組。 */ /* int型的1對應的2進位:00000000 00000000 00000000 00000001 write(1):寫出的1對應2進位的"低八位" vvvvvvvv 00000000 00000000 00000000 00000001 寫出的位元組 write方法調用完畢後,fos.dat中的樣子: 00000001 */ fos.write(1); /* int型的3對應的2進位:00000000 00000000 00000000 00000011 write(3):寫出的3對應2進位的"低八位" vvvvvvvv 00000000 00000000 00000000 00000011 寫出的位元組 write方法調用完畢後,fos.dat中的樣子: 00000001 00000011 */ fos.write(3); System.out.println("寫出完畢!"); fos.close();//流使用完畢要關閉來釋放資源
}
}
文件流:讀取流:
package io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
-
文件輸入流,用於從文件中讀取位元組數據
/
public class FISDemo {
public static void main(String[] args) throws IOException {
//將當前項目目錄下的fos.dat文件讀取回來
FileInputStream fis = new FileInputStream("fos.dat");
/
java.io.InputStream超類上定義了讀取一個位元組的方法:
int read()
讀取1個位元組,並將對應的2進位存入返回的int值的"低八位"上,而高24位2進位全部
補0.
如果返回值為int型的整數-1,則表達讀取到了流的末尾
/
/
fos.dat中的樣子:
00000001 00000011第一次調用int d = fis.read() 讀取的是fos.dat文件第一個位元組: 00000001 00000011 ^^^^^^^^ 讀取的位元組 read方法返回的int值2進位的樣子:00000000 00000000 00000000 00000001 因此int d = fis.read()之後d的整數為:1 */ int d = fis.read(); System.out.println(d); /* fos.dat中的樣子: 00000001 00000011 第二次調用d = fis.read() 讀取的是fos.dat文件第二個位元組: 00000001 00000011 ^^^^^^^^ 讀取的位元組 read方法返回的int值2進位的樣子:00000000 00000000 00000000 00000011 因此d = fis.read()之後d的整數為:3 */ d = fis.read(); System.out.println(d); /* fos.dat中的樣子: 00000001 00000011 第三次調用d = fis.read() 讀取的是fos.dat文件第三個位元組: 00000001 00000011 ^^^^^^^^ 文件末尾! read方法返回的int值2進位的樣子:11111111 11111111 11111111 11111111 因此d = fis.read()之後d的整數為:-1 */ d = fis.read(); System.out.println(d);//-1 fis.close();
}
}
向文件中寫入文本數據:
package io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
-
向文件中寫入文本數據
/
public class WriteStringDemo {
public static void main(String[] args) throws IOException {
//向文件fos.txt中寫入字元串
/
文件流的兩個構造方法預設為覆蓋模式:
FileOutPutStream(String path)
FileOutputStream(File file)
上述兩個構造器創建時,如果指定的文件已經存在了,則會將該文件清空(變成0位元組),
之後通過當前流寫出的數據會陸續寫入文件中保存。文件流的兩個構造方法為追加模式: FileOutPutStream(String path,boolean append) FileOutputStream(File file,boolean append) 如果第二個參數為true,則文件流打開了追加模式。 當創建文件流時如果指定的文件已經存在,則文件原數據全部保留,通過當前流寫出的 數據會陸續的追加到文件末尾 */
// File file = new File("fos.txt");
// FileOutputStream fos = new FileOutputStream(file);
FileOutputStream fos = new FileOutputStream("fos.txt",true);
// String line = "愛你孤身走暗巷";
String line = "愛你~";
/*
String提供的方法:
byte[] getBytes(Charset charset)
將當前字元串按照指定的字元集轉換為一組位元組
*/
byte[] data = line.getBytes(StandardCharsets.UTF_8);
fos.write(data);
line = "如果你突然打了個噴嚏,啊~那一定是我在想你";
data = line.getBytes(StandardCharsets.UTF_8);
fos.write(data);
System.out.println("寫出完畢!");
fos.close();
}
}
從文件中讀取字元串:
package io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
-
從文件中讀取字元串
/
public class ReadStringDemo {
public static void main(String[] args) throws IOException {
//將fos.txt文件中所有字元讀取回來
File file = new File("fos.txt");
/
FileInputStream(String path)
FileInputStream(File file)
/
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int)file.length()];
fis.read(data);
/
String提供的構造器
String(byte[] data,Charset charset)
將給定的位元組數組data中所有的位元組按照給定的字元集charset轉換為一個字元串
*/
String line = new String(data, StandardCharsets.UTF_8);
System.out.println(line);fis.close();
}
}
用lambda表達式創建文件過濾器:
package lambda;
import java.io.File;
import java.io.FileFilter;
/**
- 用lambda表達式創建文件過濾器
- 獲取當前項目目錄下名字中含有字母o的所有子項
*/
public class Test {
public static void main(String[] args) {
File dir = new File(".");
File[] subs = dir.listFiles(file -> file.getName().contains("o"));
for(int i=0;i<subs.length;i++){
System.out.println(subs[i].getName());
}
}
}