3.文件和流
標籤(空格分隔): 6.2Java高級
一 文件
- 簡介
- 創建 + 屬性和方法
(1)實例化對象創建
//實例化的時候必須指定文件或文件夾(指定的文件夾是否存在不重要)
File file=new File("D:/book");
(2)屬性和方法
- 創建指定的文件夾
- 其他方法操作代碼
二 遞歸
-
特徵: 自己調用自己
-
寫一個方法 來實現階乘
- 5!=1x2x3x4x5=120
- 5!=1x2x3x4x5=120
-
相關練習:
- 顯示D:\文件\Java\0219-1 中的所有文件(文件內可能還會有文件)
- 篩選出這些文件中的".Java"文件
步驟:
1.判斷是文件還是文件夾,顯示出所有文件目錄(包括內部每個文件夾的的文件,使用遞歸)
2.判斷後綴是否是.Java
三 內置類和匿名類 (只做瞭解,不爲重點)
四 IO流
1. 流的簡介
2.輸入流的方法和框架
- 輸入流
- 寫流的框架
try/catch/finally
2-1. IO流1_單個讀取值
//構建文件輸入流
FileInputStream fis = null;
try {
fis = new FileInputStream(new File("文件目錄+文件名"));
int ch1 = fis.read(); //讀取到了第1個字母 以char類型的asc碼返回爲int類型
System.out.println((char)ch1);
int ch2 = fis.read(); //讀取第2個字母
System.out.println((char)ch2);
int ch3 = fis.read(); //讀取第3個字母
System.out.println((char)ch3);
int ch4 = fis.read(); //讀取第4個字母
System.out.println((char)ch4);
int ch5 = fis.read(); //讀取第5個字母 當沒有這個字母(讀取完畢了) 返回-1
System.out.println(ch5);
}catch(Exception e) {
e.printStackTrace();
}finally {
//記得要關閉流
if(fis!=null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2-2. IO流2_讀取多個值
//搭建框架try/catch(報錯信息)/finally(關流)
FileInputStream fis=null;//方便全局調用
try{
//實例化輸入流對象
fis=new FileInputStream("D:/JavaCode/123.txt");//file重新賦值
//讀取文件內容
//創建循環條件
int count=0;
while((count=fis.read())!=-1){//返回的數字數-1代表未找到
System.out.println((char)count);
}
}catch(Exception e){
//拋報錯信息
e.printStackTrace();
}finally{
//關流--try/catch
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2-3. IO流3_批量讀取值
FileInputStream fis=null;
try{
//創造入流實例化對象
fis=new FileInputStream("D:/JavaCode/123.txt");//有參
//批量讀取
byte[] buff=new byte[1024];//創建緩存的實例化對象(相當於緩存機)
//注意byte[]基本數據類型,Byte[]裝箱成爲一個對象
int c=0;
while((c=fis.read(buff))!=-1){
System.out.println(new String(buff));
}
}catch (Exception e) {
e.printStackTrace();
}finally {
//關流
//判斷非空,fis如果爲空會跳過try塊中的代碼,報錯--空指針異常
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3. 輸出流
- 輸出流-OutputStream
3-1. 字節輸出流
3-2. 實現文件的複製功能
FileInputStream fis=null;
FileOutputStream fos=null;
try{
//實例化對象
fis=new FileInputStream("D:/文件/Java/0219-1/One.java");//實例化需要複製的原文件(包含目錄)
fos=new FileOutputStream("C:/Users/Administrator/Desktop/One.java"); //實例化存放地址的複製文件
//批量寫入
byte[] buff=new byte[1024];//創造一個緩存機
int c=0;
while((c=fis.read(buff))!=-1){
//c爲返回的阿斯克碼,批量讀取的時候返回值不用太關心,但要知道它返回的是 讀取內容的最後位置,偏移會使用到
fos.write(buff,0,c);//寫入 將buff中的內容寫入fos中(字節空間未佔滿1024使用偏移,最後的位置就是)
}
fos.flush();//強制將緩衝區的文件放到輸入流中
}catch (Exception e) {
e.printStackTrace();
}finally {
//關流
try {
if(fis!=null){
fis.close();
}
if(fos!=null){
fos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3-3. 字符輸出流–讀/寫中文字符
FileReader fr=null;
FileWriter fw=null;
try{
//實例化對象
fr=new FileReader("D:/文件/222.txt ");//實例化需要複製的原文件(包含目錄)
fw=new FileWriter("C:/Users/Administrator/Desktop/222.txt ");//實例化存放地址的複製文件
//批量寫入
char[] buff=new char[1024];//創造一個緩存機(注意此處是char數組)
int c=0;
while((c=fr.read(buff))!=-1){
//控制檯輸出
System.out.println(new String(buff));
fw.write(buff,0,c);//寫入
}
fw.flush();//強制將緩衝區的文件放到輸入流中
}catch (Exception e) {
e.printStackTrace();
}finally {
//關流
try {
if(fr!=null){
fr.close();
}
if(fw!=null){
fw.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3-4 BufferedReader–緩衝字符流
- 緩衝字符流是對字符流的再次的封裝
* 作用: 提高字符流寫入文本的效率
(1) 代碼1: BufferedReader輸出流
BufferedReader br = null;
FileReader fr = null;
try {
fr = new FileReader("d:/hello.txt"); //字符流
br = new BufferedReader(fr); //字符緩衝流
//String line1 = br.readLine(); //一次讀取一行
//String line2 = br.readLine();
//System.out.println(line1);
//System.out.println(line2); //null
String line = "";
while((line=br.readLine())!=null) {
System.out.println(line);
}
}catch(Exception e) {
e.printStackTrace();
}finally{
// 關閉流的順序和創建相反
try {
if(br!=null) {
br.close();
}
if(fr!=null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
(2) 輸入流+輸出流
BufferedReader br=null;
BufferedWriter bw=null;
FileReader fr=null;
FileWriter fw=null;
try {
//實例化br對象
fr=new FileReader("D:/文件/Three");
br=new BufferedReader(fr);//BufferedReader的參數類型是字節流
fw=new FileWriter("C:/Users/Administrator/Desktop/Three");
bw=new BufferedWriter(fw);
//讀取並寫入
String line="";//readLine() 返回的是字符串類型
while((line=br.readLine())!=null){
//讀取
System.out.println(line);
//寫入
bw.write(line);//寫入,發現未換行
bw.newLine();//換行
}
bw.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {
//關流有一定的順序,fr-br-fw-bw
try {
if(fr!=null){
fr.close();
}br.close();
if(br!=null){
br.close();
}
if(fw!=null){
fw.close();
}
if(bw!=null){
bw.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
五 對象流
- 對象流創建
FileInputStream fis = null;//文件輸入流
ObjectInputStream ois = null;//對象輸入流
fis=new FileInputStream(“D:/文件/Three.bin”);
ois=new ObjectInputStream(fis);//實例化對象輸入流
1. 對象流讀取
FileInputStream fis = null;//文件輸入流
ObjectInputStream ois = null;//對象輸入流
try {
fis=new FileInputStream("D:/文件/Three.bin");
ois=new ObjectInputStream(fis);//實例化對象輸入流
//讀取
int readInt = ois.readInt();
String readUTF = ois.readUTF();
Object readObject = ois.readObject();
System.out.println(readInt+"\t"+readUTF+"\t"+readObject);
}catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(fis != null){
fis.close();
}
if(ois != null){
ois.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2. 對象流寫入
對象輸出流–ObjectOutputStream
就是將 內存中的對象 變爲2進制的文件進行保存 下次可以讀取出來
ObjectOutputStream oos = null;
FileOutputStream fos = null;
try {
fos = new FileOutputStream("D:/文件/Three.bin");//創建輸出流
oos = new ObjectOutputStream(fos);
oos.writeInt(12);
oos.writeUTF("helloworld"); //寫入字符串
oos.writeObject(new Student("jack",20));
oos.flush();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(oos!=null) {
oos.close();
}
if(fos!=null) {
fos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}