《瘋狂Java講義》學習筆記(十一)輸入/輸出

1、File類

  • 訪問文件名相關的方法
String getName():返回此File對象所表示的文件名或路徑名
String getPath():返回此File對象的絕對路徑
File getAbsoluteFile():返回此File對象的絕對路徑
String getAbsoltePath():返回此File對象所對應的絕對路徑名
String getParent():返回此File對象所對應目錄的父目錄名
boolean renameTo(File newName):重命名此File對象所對應的文件或目錄,如果重命名成功返回true,可以用於移動文件
  • 文件檢測相關的方法
boolean exists():文件或目錄是否存在
boolean canWrite():文件或目錄是否可寫
boolean canRead():
boolean isFile():是否是文件,不是目錄
boolean isDirectory():是否是目錄,不是文件
boolean isAbsolute():文件或目錄是否是絕對路徑,跨平臺,UNIX/linux/BSD的絕對路徑以“/”開頭,windows則以盤符開頭
  • 獲取常規文件信息
long lastModified():返回文件的最後修改時間
long length():返回文件內容的長度
  • 文件操作相關的方法
boolean createNewFile():當此File對象所對應的文件不存在時,新建一個新文件,成功則返回true
boolean delete():刪除File對象所對應的文件或路徑
static File createTempFile(Strng prefix,String suffix):
static File createTempFile(String prefix,String suffix,File directory)
void deleteOnExit():註冊一個刪除鉤子,指定當Java虛擬機退出時,刪除File對象所對應的文件和目錄
  • 目錄操作相關的方法
boolean mkdir():創建文件夾,成功則返回true
String[] list():列出所有文件名和路徑名
File[] listFiles():列出所有子文件和路徑
static File[] listRoots():列出系統所有的根路徑
  • 文件過濾器
File file = new File("");
file.list((dir,name)->name.endsWith(".java")||new File(name).isDirectory());

2、流的分類

  • 輸入流和輸出流
    輸入流:只能從中讀取數據,不能寫入數據
    輸出流:只能向其寫入數據,不能讀取數據
  • 字節流和字符流
    字節流和字符流的用法幾乎完全一樣,區別在於兩者所操作的單元不同,字節流操作的數據單元是8位的字節,而字符流操作的數據單元是16位的字符
    字節流主要由InputStream和OutputStream作爲基類,而字符流則主要由Reader和Writer作爲基類
  • 節點流和處理流
    可以從/向一個特定的IO設備讀/寫數據的流,稱爲節點流,也叫低級流
    處理流用於對一個已存在的流進行連接或封裝,通過封裝後的流來實現數據讀/寫功能,也叫高級流

3、節點流和處理流(如果要輸入/輸出二進制內容使用字節流,如果輸入/輸出文本內容則是用字符流)

  • 字節流(最小數據單元是8位的字節byte)InputStream和OutputStream
int read()讀取單個字節
int read(byte[] b)讀取最多b.length個字節
int read(byte[] b,int offset,int len)讀取最多len個字節,從offset開始
void write(int i)指定字節/字符到輸出流
void write(byte[] b)讀取最多b.length個字節到輸出流
void write(byte[] b,int offset,int len)讀取最多len個字節到輸出流,從offset開始
  • 字符流(最小數據單元是16位的字符char)Reader和Writer
int read()讀取單個字節
int read(char[] c)讀取最多b.length個字符輸出流
int read(char[] c,int offset,int len)讀取最多len個字符,從offset開始
void write(int i)指定字節/字符到輸出流
void write(char[] c)讀取最多b.length個字符
void write(char[] c,int offset,int len)讀取最多len個字符到輸出流,從offset開始
  • 可以用字符串替代字符數組
void write(String str)
void write(String str,int offset,int len)
InputStream和Reader是抽象類,要用過FileInputStream和FileReader進行實例化
  • 可以通過判斷來識別以防阻塞:if(in.available()>0){in.read(new byte[in.available])}

4、節點流與處理流

節點流:程序和數據源之間的直接訪問讀寫,也稱爲低級流
處理流(包裝流):對已存在的流進行封裝,使得程序與數據源隔離,不會直接被訪問,更好進行插拔置換數據源,提高性能

5、轉換流(字節流轉成字符流)

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

6、推回流(推回緩衝區,重新再讀,優先讀取剛被退回的內容)

PushbackInputStream和PushbackReader

7、重定向標準輸入/輸出

平時使用System.out.println()會打印到屏幕
使用System.setOut(new PrintStream(new FileOutputStream(“out.txt”)))可以輸出到out.txt文件中

8、讀取大文件

// 文件流
Scanner sc = new Scanner(new FileInputStream("in.txt"),"utf-8");
while(sc.hasNextLine()){
   String line = sc.nextLine();
}
// Apache Commoms IO
LineIterator it = FileUtils.lineIterator(file,"utf-8");
while(it.hasNext()){
   String line = it.nextLine();
}

9、序列化(把對象編程二進制的過程)

序列化機制是JavaEE平臺的基礎,建議每個JavaBean類都序列化

new ObjectOutputStream(new FileOutputStream("")).writeObject(new Person());
Person per = (Person)new ObjectInputStream(new InputStream("")).readObject();

同一個對象只會序列化一次,如果已經被序列化過,則只會返回序列化編號
使用writeObject寫入一個對象,然後修改屬性,程序只認第一個對象

10、RandomAccessFile

可以任意位置訪問,raf.seed(位置)
mode
r代表只讀
rw代表讀取、寫入,如果文件不存在則嘗試創建
rws代表讀取、寫入,需要同步更新文件和元數據,一次寫入文件
rwd代表讀取、寫入,同步更新內容,不同步更新元數據

11、常用流組合

new BufferedInputStream(new FileInputStream(""));
new BufferedReader(new FileReader(""));
new BufferedRead(new InputStreamReader(new FileInputStream("")));

12、對象複製

淺複製:被引用對象只複製引用
深複製:被應用對象也被複制

13、NIO

Buffer0<=mark<=positon<=limit<=capacity)
容量capacity
界限limit
位置position
flip:從Buffer中取出數據做好準備
clear:向Buffer中裝入數據做好準備
Channel
Channel可以直接將指定文件的部分或全部映射成Buffer
程序不能直接訪問Channel,必須先用通過Buffer取出數據
獲取Channel
InputStream.getChannel()
OutputStream.getChannel()
RandomAccessFile.getChannel()

14、映射成Buffer

MappedByteBuffer buffer = new FileInputStream(new File("in.txt")).getChannel().map(FileChannel.MapMode.READ_ONLY,0,new File("in.txt").length)

15、文件鎖

非阻塞:FileLock lock = channel.tryLock();lock.release();
阻塞:FileLock lock = channel.lock();lock.release();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章