java基礎(chǔ)05IO流

五、IO流

1、IO流概述

(1)用來處理設(shè)備(硬盤,控制臺(tái),內(nèi)存)間的數(shù)據(jù)。
(2)java中對(duì)數(shù)據(jù)的操作都是通過流的方式。
(3)java用于操作流的類都在io包中。
(4)按照流操作的數(shù)據(jù)的類型不同:分為字節(jié)流和字符流。字符流是為了方便中文的操作而來的。
(5)按照流的流向不同分為:輸入流,輸出流

2、IO流常用基類:

(1)字節(jié)流

輸出字節(jié)流:OutputStream:字節(jié)寫入流抽象類
|--->FileOutputStream:
字節(jié)寫入流
|--->BufferedOutputStream:
字節(jié)寫入流緩沖區(qū)
|--->PrintStream:
打印流
輸入字節(jié)流:InputStream:字節(jié)讀取流抽象類
|--->FileInputStream:
字節(jié)讀取流
|--->BufferedInputStream:
字節(jié)讀取流緩沖區(qū)

(2)字符流

輸出字符流:Writer:字符寫入流的抽象
|--->FileWriter:
字符寫入流
|--->BufferedWriter:
字符寫入流緩沖區(qū)
|--->OutputStreamWriter:
字符通向字節(jié)的轉(zhuǎn)換流(涉及鍵盤錄入時(shí)用)
|--->OutputStreamWriter:
打印流,可處理各種類型的數(shù)據(jù)
輸入字符流:Reader: 字符讀取流的抽象類
|--->FileReader:
字符讀取流
|--->LineNumberReader:
跟蹤行號(hào)的緩沖字符讀取流
|--->BufferedReader:
字符讀取流緩沖區(qū)
|--->InputStreamReader:
字節(jié)通向字符的轉(zhuǎn)換流(涉及鍵盤錄入時(shí)用)

(3)IO流常用基類方法摘要:

**字節(jié)寫入流:OutputStream:
void close() 關(guān)閉此輸出流并釋放與此流有關(guān)的所有系統(tǒng)資源。
void flush()刷新此輸出流并強(qiáng)制寫出所有緩沖的輸出字節(jié)。
abstract void write(int b) 將指定的字節(jié)寫入此輸出流。
void write(byte[] b) 將 b.length 個(gè)字節(jié)從指定的 byte 數(shù)組寫入此輸出流。
void write(byte[] b, int off, int len)
將指定 byte 數(shù)組中從偏移量 off 開始的 len 個(gè)字節(jié)寫入此輸出流。
**字節(jié)讀取流:InputStream:
void close() 關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源。
int available() (特有方法!!)
返回此輸入流下一個(gè)方法調(diào)用可以不受阻塞地從此輸入流讀取(或跳過)的估計(jì)字節(jié)數(shù)。
abstract int read() 從輸入流中讀取數(shù)據(jù)的下一個(gè)字節(jié)。
int read(byte[] b) 從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組 b 中。
int read(byte[] b, int off, int len) 將輸入流中最多 len 個(gè)數(shù)據(jù)字節(jié)讀入 byte 數(shù)組。
long skip(long n) 跳過和丟棄此輸入流中數(shù)據(jù)的 n 個(gè)字節(jié)。

**字符寫入流:Writer:
abstract void close() 關(guān)閉此流,但要先刷新它。
abstract void flush() 刷新該流的緩沖。
void write(int c) 寫入單個(gè)字符。
void write(char[] cbuf) 寫入字符數(shù)組。
abstract void write(char[] cbuf, int off, int len) 寫入字符數(shù)組的某一部分。
void write(String str) 寫入字符串。
void write(String str, int off, int len) 寫入字符串的某一部分。

**字符讀取流:Reader:
abstract void close() 關(guān)閉該流并釋放與之關(guān)聯(lián)的所有資源。
int read() 讀取單個(gè)字符。
int read(char[] cbuf) 將字符讀入數(shù)組
abstract int read(char[] cbuf, int off, int len) 將字符讀入數(shù)組的某一部分。
long skip(long n) 跳過字符。

3、IO流常用字節(jié)流基類的子類:

**寫入流:

(1)FileOutputStream:
**構(gòu)造方法:
FileOutputStream(String name)
創(chuàng)建一個(gè)向具有指定名稱的文件中寫入數(shù)據(jù)的輸出文件流。
FileOutputStream(String name, boolean append)
創(chuàng)建一個(gè)向具有指定 name 的文件中寫入數(shù)據(jù)的輸出文件流。
FileOutputStream(File file)
創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫入數(shù)據(jù)的文件輸出流。
FileOutputStream(File file, boolean append)
創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫入數(shù)據(jù)的文件輸出流。
**方法摘要:
public void flush()
void close() 關(guān)閉此文件輸出流并釋放與此流有關(guān)的所有系統(tǒng)資源。
void write(int b) 將指定字節(jié)寫入此文件輸出流。
void write(byte[] b, int off, int len)
將指定 byte 數(shù)組中從偏移量 off 開始的 len 個(gè)字節(jié)寫入此文件輸出流。
void write(int b) 將指定字節(jié)寫入此文件輸出流。
(2)BufferedOutputStream:
**構(gòu)造方法:
BufferedOutputStream(OutputStream out)
創(chuàng)建一個(gè)新的緩沖輸出流,以將數(shù)據(jù)寫入指定的底層輸出流。
BufferedOutputStream(OutputStream out, int size)
創(chuàng)建一個(gè)新的緩沖輸出流,以將具有指定緩沖區(qū)大小的數(shù)據(jù)寫入指定的底層輸出流。
**方法摘要:
void flush() 刷新此緩沖的輸出流。
void write(byte[] b, int off, int len)
將指定 byte 數(shù)組中從偏移量 off 開始的 len 個(gè)字節(jié)寫入此緩沖的輸出流。
void write(int b) 將指定的字節(jié)寫入此緩沖的輸出流。
(3)PrintStream:打印流,可將各種類型的數(shù)據(jù)原樣打印,有自動(dòng)刷新功能
**構(gòu)造方法:
PrintStream(String fileName)
創(chuàng)建具有指定文件名稱且不帶自動(dòng)行刷新的新打印流。
PrintStream(File file)
創(chuàng)建具有指定文件且不帶自動(dòng)行刷新的新打印流。
PrintStream(OutputStream out)
創(chuàng)建新的打印流。
PrintStream(OutputStream out, boolean autoFlush) (當(dāng)autoFlush為true時(shí)具有自動(dòng)刷新功能)
創(chuàng)建新的打印流。
**方法摘要:
PrintStream append(char c)
將指定字符添加到此輸出流。
void close()
關(guān)閉流。
void flush()
刷新該流的緩沖。
void print(各種類型的數(shù)據(jù):)
打印各種類型的數(shù)據(jù)
void println(各種類型的數(shù)據(jù):):自動(dòng)換行
打印各種類型的數(shù)據(jù)
void write(byte[] buf, int off, int len)
將 len 字節(jié)從指定的初始偏移量為 off 的 byte 數(shù)組寫入此流。
void write(int b)
將指定的字節(jié)寫入此流。

**讀取流:

(1)FileInputStream:
**構(gòu)造方法:
FileInputStream(String name)
通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建一個(gè) FileInputStream,
該文件通過文件系統(tǒng)中的路徑名 name 指定。
FileInputStream(File file)
通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建一個(gè) FileInputStream,
該文件通過文件系統(tǒng)中的 File 對(duì)象 file 指定。
**方法摘要:
int available() (字節(jié)讀取流特有方法!!!)
返回下一次對(duì)此輸入流調(diào)用的方法可以不受阻塞地從此輸入流讀取(或跳過)的估計(jì)剩余字節(jié)數(shù)。
int read()
從此輸入流中讀取一個(gè)數(shù)據(jù)字節(jié)。
int read(byte[] b)
從此輸入流中將最多 b.length 個(gè)字節(jié)的數(shù)據(jù)讀入一個(gè) byte 數(shù)組中。
int read(byte[] b, int off, int len)
從此輸入流中將最多 len 個(gè)字節(jié)的數(shù)據(jù)讀入一個(gè) byte 數(shù)組中。
long skip(long n)
從輸入流中跳過并丟棄 n 個(gè)字節(jié)的數(shù)據(jù)。
(2)BufferedInputStream:
**構(gòu)造方法:
BufferedInputStream(InputStream in)
創(chuàng)建一個(gè) BufferedInputStream 并保存其參數(shù),即輸入流 in,以便將來使用。
BufferedInputStream(InputStream in, int size)
創(chuàng)建具有指定緩沖區(qū)大小的 BufferedInputStream 并保存其參數(shù),即輸入流 in,以便將來使用。
**方法摘要:
int available() (字節(jié)讀取流特有方法!!!)
返回可以從此輸入流讀取(或跳過)、且不受此輸入流接下來的方法調(diào)用阻塞的估計(jì)字節(jié)數(shù)。
int read()
參見 InputStream 的 read 方法的常規(guī)協(xié)定。
int read(byte[] b, int off, int len)
從此字節(jié)輸入流中給定偏移量處開始將各字節(jié)讀取到指定的 byte 數(shù)組中。
long skip(long n)
參見 InputStream 的 skip 方法的常規(guī)協(xié)定。

4、字符流常用基類的子類

**寫入流:

(1)FileWriter:
**構(gòu)造方法:
FileWriter(String fileName)
根據(jù)給定的文件名構(gòu)造一個(gè) FileWriter 對(duì)象。
FileWriter(String fileName, boolean append)
根據(jù)給定的文件名以及指示是否附加寫入數(shù)據(jù)的 boolean 值來構(gòu)造 FileWriter 對(duì)象。
FileWriter(File file)
根據(jù)給定的 File 對(duì)象構(gòu)造一個(gè) FileWriter 對(duì)象。
FileWriter(File file, boolean append)
根據(jù)給定的 File 對(duì)象構(gòu)造一個(gè) FileWriter 對(duì)象。
FileWriter(FileDescriptor fd)
構(gòu)造與某個(gè)文件描述符相關(guān)聯(lián)的 FileWriter 對(duì)象。
**方法摘要:跟Writer一樣
abstract void close() 關(guān)閉此流,但要先刷新它。
abstract void flush() 刷新該流的緩沖。
void write(int c) 寫入單個(gè)字符。
void write(char[] cbuf) 寫入字符數(shù)組。
abstract void write(char[] cbuf, int off, int len) 寫入字符數(shù)組的某一部分。
void write(String str) 寫入字符串。
void write(String str, int off, int len) 寫入字符串的某一部分。
(2)BufferedWriter:
**構(gòu)造方法:
BufferedWriter(Writer out)
創(chuàng)建一個(gè)使用默認(rèn)大小輸出緩沖區(qū)的緩沖字符輸出流。
BufferedWriter(Writer out, int sz)
創(chuàng)建一個(gè)使用給定大小輸出緩沖區(qū)的新緩沖字符輸出流。
**方法摘要:
void close()
關(guān)閉此流,但要先刷新它。
void flush()
刷新該流的緩沖。
void newLine()
寫入一個(gè)行分隔符。
void write(char[] cbuf, int off, int len)
寫入字符數(shù)組的某一部分。
void write(int c)
寫入單個(gè)字符。
void write(String s, int off, int len)
寫入字符串的某一部分。
(3)OutputStreamWriter:字節(jié)通向字符的轉(zhuǎn)換流
**構(gòu)造方法:
OutputStreamWriter(OutputStream out)
創(chuàng)建使用默認(rèn)字符編碼的 OutputStreamWriter。
**方法摘要:
void write(char[] cbuf, int off, int len)
寫入字符數(shù)組的某一部分。
void write(int c)
寫入單個(gè)字符。
void write(String str, int off, int len)
寫入字符串的某一部分。
(4)PrintWriter:
**構(gòu)造方法:
PrintWriter(String fileName)
創(chuàng)建具有指定文件名稱且不帶自動(dòng)行刷新的新 PrintWriter。
PrintWriter(File file)
使用指定文件創(chuàng)建不具有自動(dòng)行刷新的新 PrintWriter。
PrintWriter(Writer out)
創(chuàng)建不帶自動(dòng)行刷新的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush)
創(chuàng)建新 PrintWriter。
PrintWriter(OutputStream out)
根據(jù)現(xiàn)有的 OutputStream 創(chuàng)建不帶自動(dòng)行刷新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush)
通過現(xiàn)有的 OutputStream 創(chuàng)建新的 PrintWriter。

**方法摘要:
PrintWriter append(char c)
將指定字符添加到此 writer。
void print(各種類型的數(shù)據(jù):)
打印各種類型的數(shù)據(jù)
void println(各種類型的數(shù)據(jù):):自動(dòng)換行
打印各種類型的數(shù)據(jù)
void write(char[] buf)
寫入字符數(shù)組。
void write(char[] buf, int off, int len)
寫入字符數(shù)組的某一部分。
void write(int c)
寫入單個(gè)字符。
void write(String s)
寫入字符串。
void write(String s, int off, int len)
寫入字符串的某一部分。

**讀取流:

(1)FileReader:
**構(gòu)造方法:
FileReader(String fileName)
在給定從中讀取數(shù)據(jù)的文件名的情況下創(chuàng)建一個(gè)新 FileReader。
FileReader(File file)
在給定從中讀取數(shù)據(jù)的 File 的情況下創(chuàng)建一個(gè)新 FileReader。
FileReader(FileDescriptor fd)
在給定從中讀取數(shù)據(jù)的 FileDescriptor 的情況下創(chuàng)建一個(gè)新 FileReader。
**方法摘要:和Reader基類方法一致:
abstract void close() 關(guān)閉該流并釋放與之關(guān)聯(lián)的所有資源。
int read() 讀取單個(gè)字符。
int read(char[] cbuf) 將字符讀入數(shù)組
abstract int read(char[] cbuf, int off, int len) 將字符讀入數(shù)組的某一部分。
long skip(long n) 跳過字符。
(2)BufferedReader:
**構(gòu)造方法:
BufferedReader(Reader in)
創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流。
**方法摘要:
int read()
讀取單個(gè)字符。
int read(char[] cbuf, int off, int len)
將字符讀入數(shù)組的某一部分。
String readLine()
讀取一個(gè)文本行。
(3)InputStreamReader:字符通向字節(jié)的橋梁:
**構(gòu)造方法:
InputStreamReader(InputStream in)
創(chuàng)建一個(gè)使用默認(rèn)字符集的 InputStreamReader。
**方法摘要:
int read() 讀取單個(gè)字符。
int read(char[] cbuf) 將字符讀入數(shù)組
abstract int read(char[] cbuf, int off, int len) 將字符讀入數(shù)組的某一部分。
long skip(long n) 跳過字符。
(4)LineNumberReader:
**構(gòu)造方法:
LineNumberReader(Reader in)
使用默認(rèn)輸入緩沖區(qū)的大小創(chuàng)建新的行編號(hào) reader。
**方法摘要:
int read()
讀取單個(gè)字符。
int read(char[] cbuf, int off, int len)
將字符讀入數(shù)組中的某一部分。
String readLine()
讀取文本行。
long skip(long n)
跳過字符。
int getLineNumber()
獲得當(dāng)前行號(hào)。
void setLineNumber(int lineNumber)
設(shè)置當(dāng)前行號(hào)。

5、IO流常見需求:

****字符流:

(1)需求1:在硬盤上創(chuàng)建一個(gè)文件并寫入信息
用字符寫入流:FileWriter

FileWriter fw = new FileWriter("g:\\filewriter.txt");
fw.write("輸入信息");
fw.write("也可以寫入字符數(shù)組".toCharArray());
fw.flush();
fw.close();

(2)需求2:在原有文件上續(xù)寫數(shù)據(jù)

FileWriter fw = new FileWriter("g:\\filewriter.txt",true);
fw.write("還可以續(xù)寫信息");
fw.write("也可以寫入字符數(shù)組".toCharArray());
fw.flush();
fw.close();

(3)需求3:讀取硬盤上的文本文件,并將數(shù)據(jù)打印在控制臺(tái)
FileReader fr = new FileReader("g:\filewriter.txt");
**第一種讀取方法:一個(gè)一個(gè)字節(jié)的讀

int ch = 0;
ch = fr.read();
sop((char)ch);
fr.close();

**第二種讀取方法:利用數(shù)組來提高效率

char[] buf = new char[1024];
int len = 0;
while((len = fr.read(buf))!=-1)
{
sop(new String(buf,0,len));
}
fr.close();

(4)需求4:拷貝文本文件
利用緩沖區(qū)提高數(shù)據(jù)讀寫效率
(無緩沖區(qū)就相當(dāng)于一滴一滴的喝水,有緩沖區(qū)就相當(dāng)于一杯一杯的喝水)

BufferedReader bufr = new BufferedReader(new FileReader("g:\\filewriter.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("d:\\copyfilewriter.txt"));
String line = null;
while((line = bufr.readLine())!=null)
{
burw.write(line);
bufw.newLine();
bufw.flush();
}
bufr.close();
bufw.close();

****字節(jié)流:字節(jié)流寫入時(shí)沒有刷新

(1)需求1:在硬盤上創(chuàng)建一個(gè)文件并寫入信息(字節(jié)流寫入時(shí)沒有刷新)
FileOutputStream fos = new FileOutputStream("g:\filestream.txt");
fos.write(97);//寫入一個(gè)字節(jié),int:97代表寫入char:a
fos.write("也可以寫入字節(jié)數(shù)組".getBytes());//通常使用此種方式寫入,直觀!
fos.close();
(2)需求2:在硬盤已有文件上續(xù)寫數(shù)據(jù)(字節(jié)流寫入時(shí)沒有刷新)
FileOutputStream fos = new FileOutputStream("g:\filestream.txt",true);
fos.write("創(chuàng)建字節(jié)寫入流時(shí),傳進(jìn)去一個(gè)true參數(shù)就可以繼續(xù)寫入信息".getBytes());
fos.close();
(3)需求3:讀取硬盤上的文件
FileInputStream fis = new FileInputStream("g:\filestream.txt");
**第一種讀法:一個(gè)字節(jié)一個(gè)字節(jié)的讀(此種讀法慢)

int ch = 0;
while((ch = fis.read())!=-1)
{
sop((char)ch);
}

**第一種讀法:利用字節(jié)數(shù)組讀(此種讀法效率有一定提高)

byte[] buf = new byte[1024];
int len = 0;
while((len = fis.read())!=-1)
{
sop(new String(buf,0,len));
}

(4)需求4:拷貝字節(jié)文件,如圖片或者M(jìn)P3或者電影
**第一種拷貝:不帶緩沖區(qū)(慢,還是效率問題)

FileInputStream fis = new FileInputStream("g:\\1.mp3");
FileOutputStream fos = new FileOutputStream("g:\\copy1.mp3");
byte[] buf = new byte[1024];
int len = 0;
while((len = fis.read(buf))!=-1)
{
fos.(buf,0,len);//字節(jié)流寫入無需刷新
}
fis.close();
fos.close();

**第二種拷貝:帶緩沖區(qū),高效

BufferedInputStream bufi = new BufferedInputStream(new FileInputStream("g:\\1.mp3"));
BufferedOutputStream bufo = new BufferedOutputStream(new FileOutputStream("g:\\copy1.mp3"));
int ch = 0;
while((ch = bufi.read())!=-1)
{
bufo.write(ch);
}
bufi.close();
bufo.close();

****轉(zhuǎn)換流:

(1)需求1:讀取一個(gè)鍵盤錄入
InputStream in = System.in;//創(chuàng)建一個(gè)鍵盤錄入流,流不關(guān)則可以一直錄入
int by1 = in.read();//一次讀一個(gè)字節(jié)
int by2 = in.read();//一次讀一個(gè)字節(jié)
sop(by1);//假設(shè)鍵盤錄入的是abcd,則打印a
sop(by2);//假設(shè)鍵盤錄入的是abcd,則打印b
in.close();
(2)需求2:鍵盤錄入一行數(shù)據(jù)打印一行數(shù)據(jù),如果錄入的是over則結(jié)束錄入

InputStream in = System.in;
StringBuilder sb = new StringBuilder();
while(true)
{
int ch = in.read();
if(ch=='\r')
continue;
if(ch=='\n')
{
String line = sb.toString();
if("over".equals(line))
break;
sop(line.toUpperCase());//輸出大寫
sb.delete(0.sb.length());//清除上一行錄入的數(shù)據(jù)
}
else
sb.append((char)ch);
}
in.close();

(3)需求3:發(fā)現(xiàn)需求2中其實(shí)就是讀一行的原理,故引入字節(jié)通向字符的橋梁:InputStreamReader,為提高效率加入緩沖區(qū):

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bufr.readLine())!=null)
{
if("over".equals(line))
break;
sop(line.toUpperCase());//輸出大寫
}
bufr.close();

(4)需求4:鍵盤錄入數(shù)據(jù)并打印到控制臺(tái)

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(System.out));
String line = null;
while((line = bufr.readLine())!=null)
{    
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();    
}
bufr.close();
bufw.close();

(5)需求5:將鍵盤錄入的數(shù)據(jù)存儲(chǔ)到硬盤文件,則只需將(4)中的
BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(System.out));
改為:
BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(new FileWriter("g:\demo.txt")));
即:

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(new FileWriter("g:\\demo.txt")));
String line = null;
while((line = bufr.readLine())!=null)
{    
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();    
}
bufr.close();
bufw.close();

(6)需求6:將硬盤文件的數(shù)據(jù)打印到控制臺(tái)
則只需將(4)中的
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
改為:
BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileReader("g:\demo.txt")));
即:

BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileReader("g:\\demo.txt")));
BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(System.out));
String line = null;
while((line = bufr.readLine())!=null)
{    
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();    
}
bufr.close();
bufw.close();

6、流操作的規(guī)律:

****流操作的難點(diǎn):流對(duì)象很多,不知道具體用哪個(gè)
****規(guī)律:
(1)第一步:先明確源和目的
源:
文本:用Reader
字節(jié):用InputStream
目的:
文本:用Writer
字節(jié):用OutputStream
(2)第二步:明確是不是純文本
是:用字符流;
不是:用字節(jié)流
(3)第三步:明確流體系后,通過設(shè)備來明確具體使用哪個(gè)流對(duì)象
源設(shè)備:
鍵盤:System.in
硬盤:文件流File
內(nèi)存:數(shù)組流ArrayStream
目的設(shè)備:
鍵盤:System.out
硬盤:文件流File
內(nèi)存:數(shù)組流ArrayStream

7、File類

構(gòu)造方法:
File(String pathname)
通過將給定路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建一個(gè)新 File 實(shí)例。
File(String parent, String child)
根據(jù) parent 路徑名字符串和 child 路徑名字符串創(chuàng)建一個(gè)新 File 實(shí)例。
File(File parent, String child)
根據(jù) parent 抽象路徑名和 child 路徑名字符串創(chuàng)建一個(gè)新 File 實(shí)例。
方法摘要:
(1)創(chuàng)建:
boolean createNewFile()
當(dāng)且僅當(dāng)不存在具有此抽象路徑名指定名稱的文件時(shí),不可分地創(chuàng)建一個(gè)新的空文件。
boolean mkdir()
創(chuàng)建一級(jí)文件夾
boolean mkdirs()
創(chuàng)建多級(jí)文件夾
(判斷):
boolean canExecute()
測(cè)試應(yīng)用程序是否可以執(zhí)行此抽象路徑名表示的文件。
boolean canRead()
測(cè)試應(yīng)用程序是否可以讀取此抽象路徑名表示的文件。
boolean canWrite()
測(cè)試應(yīng)用程序是否可以修改此抽象路徑名表示的文件。
int compareTo(File pathname)
按字母順序比較兩個(gè)抽象路徑名。
boolean isAbsolute()
測(cè)試此抽象路徑名是否為絕對(duì)路徑名。
boolean isDirectory()
測(cè)試此抽象路徑名表示的文件是否是一個(gè)目錄。
boolean isFile()
測(cè)試此抽象路徑名表示的文件是否是一個(gè)標(biāo)準(zhǔn)文件。
boolean isHidden()
測(cè)試此抽象路徑名指定的文件是否是一個(gè)隱藏文件。
boolean exists()
測(cè)試此抽象路徑名表示的文件或目錄是否存在。
(3)獲取:
String getParent()
返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒有指定父目錄,則返回 null。
File getParentFile()
返回此抽象路徑名父目錄的抽象路徑名;如果此路徑名沒有指定父目錄,則返回 null。
String getName()
返回由此抽象路徑名表示的文件或目錄的名稱。
String getPath()
將此抽象路徑名轉(zhuǎn)換為一個(gè)路徑名字符串。
String getAbsolutePath()
返回此抽象路徑名的絕對(duì)路徑名字符串。
File getAbsoluteFile()
返回此抽象路徑名的絕對(duì)路徑名形式。
(4)刪除:
boolean delete()
刪除此抽象路徑名表示的文件或目錄。
oid deleteOnExit()
在虛擬機(jī)終止時(shí),請(qǐng)求刪除此抽象路徑名表示的文件或目錄。
(5)獲取全部:(非常重要!!!)
String[] list()
返回一個(gè)字符串?dāng)?shù)組,這些字符串指定此抽象路徑名表示的目錄中的文件和目錄。
String[] list(FilenameFilter filter)
返回一個(gè)字符串?dāng)?shù)組,這些字符串指定此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。
File[] listFiles()
返回一個(gè)抽象路徑名數(shù)組,這些路徑名表示此抽象路徑名表示的目錄中的文件。
File[] listFiles(FileFilter filter)
返回抽象路徑名數(shù)組,這些路徑名表示此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄。

****FilenameFilter接口只有一個(gè)方法:
boolean accept(File dir, String name)
測(cè)試指定文件是否應(yīng)該包含在某一文件列表中。
****FileFilter接口只有一個(gè)方法:
boolean accept(File dir, String name)
測(cè)試指定文件是否應(yīng)該包含在某一文件列表中。

8、File類常見需求:

(1)文件名過濾:列出給定目錄的所有.java文件

public void showFileName(File file)
{
String[] filenames = file.list(new FilenameFilter()//匿名內(nèi)部類
{
public boolean accept(File dir,String name)//復(fù)寫唯一方法
{
return name.endsWith(".java");//列出所有.java文件
}
});
}

(2)列出指定目錄下的所有文件和文件夾(遞歸)

**示例1:不帶層次遞歸:

public static void showDir(File dir)
{
File[] files = dir.listFile();
for(int i = 0;i<files.length;i++)
{
if(files[i].isDirectory&&!files[i].isHidden())
showDir(files[i]);
else
sop(files[i]);
}
}

**示例2:帶層次遞歸:

public static void showDir(File dir,int level)
{
sop(getLevel(level)+C);//進(jìn)來先打印層次和目錄
level++;
File[] files = dir.listFile();
for(int i = 0;i<files.length;i++)
{
if(files[i].isDirectory&&!files[i].isHidden())
showDir(files[i]);
else
sop(getLevel(level)+files[i]);//是文件就打印層次和目錄
}
}
 public static String getLevel(int level)
{
sop("|--");
StringBuilder sb = new StringBuilder();
for(int i=0;i<level;i++)
{
sb.inset(0."| ")
}
return sb.toString();
}

(3)需求:刪除帶內(nèi)容的目錄:

public static void removeDir(File dir)
{
File[] files = file.listFile();
for(int i = 0;i<files.length;i++)
{
if(files[i].isDirectory&&!files[i].isHidden())
removeDir(files[i]);//如果是文件夾則繼續(xù)調(diào)用函數(shù)
else//如果是文件則刪除。注意刪除的時(shí)候打印刪除的結(jié)果,防止誤刪或者重刪的情況
sop(files[i].toString()+"::"+files[i].delete());
}
sop(dir+"::"+dir.delete());
}

(4)需求:將制定目錄下的java文件的絕對(duì)路徑存儲(chǔ)到文本文件中。
思路:
**對(duì)指定目錄進(jìn)行遞歸
**獲取遞歸過程中所有java文件的路徑
**將這些路徑存儲(chǔ)到集合中
**將集合中的數(shù)據(jù)寫入文件中
//對(duì)指定目錄進(jìn)行遞歸并將所以Java文件存儲(chǔ)到集合中

public static void getFileName(File file,ArrayList<File> arraylist){
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if(files[i].isDirectory()&&!files[i].isHidden()){
getFileName(files[i],arraylist);
}else{
if(files[i].getName().endsWith(".java")){
arraylist.add(files[i]);
}
}
}
}
//將集合中所有數(shù)據(jù)存儲(chǔ)到新文件中
public static void saveFileToNewDir(ArrayList<File> arraylist,File newDir){
BufferedWriter bufw = null;
try {
bufw = new BufferedWriter(new FileWriter(newDir));
for (File file : arraylist) {
String fileAbsolutePath = file.getAbsolutePath();
bufw.write(fileAbsolutePath);
bufw.newLine();
bufw.flush();    
}
} catch (Exception e) {
System.out.println("文件寫入失敗");
}finally{
try {
if(bufw!=null)
bufw.close();
} catch (Exception e2) {
System.out.println("文件寫入流關(guān)閉失敗");
}
}
}

9、Properties

(1)Properties是HashTable的子類,具備Map集合的特點(diǎn),里面存儲(chǔ)的是鍵值對(duì)
(2)Properties是IO流合集合相結(jié)合的集合容器
(3)Properties的特點(diǎn)是可以用于存儲(chǔ)鍵值對(duì)形式的配置文件
(4)構(gòu)造方法:
Properties()
創(chuàng)建一個(gè)無默認(rèn)值的空屬性列表。
Properties(Properties defaults)
創(chuàng)建一個(gè)帶有指定默認(rèn)值的空屬性列表。
(5)方法摘要:
Object setProperty(String key, String value)
調(diào)用 Hashtable 的方法 put。
String getProperty(String key)
用指定的鍵在此屬性列表中搜索屬性。
void load(InputStream inStream)
從輸入流中讀取屬性列表(鍵和元素對(duì))。
void load(Reader reader)
按簡單的面向行的格式從輸入字符流中讀取屬性列表(鍵和元素對(duì))。
void list(PrintStream out)
將屬性列表輸出到指定的輸出流。
void list(PrintWriter out)
將屬性列表輸出到指定的輸出流。
void store(OutputStream out, String comments)
以適合使用 load(InputStream) 方法加載到 Properties 表中的格式,
將此 Properties 表中的屬性列表(鍵和元素對(duì))寫入輸出流。
void store(Writer writer, String comments)
以適合使用 load(Reader) 方法的格式,將此 Properties 表中的
屬性列表(鍵和元素對(duì))寫入輸出字符。
Set<String> stringPropertyNames()
返回此屬性列表中的鍵集,其中該鍵及其對(duì)應(yīng)值是字符串,如果在主屬性列表中
未找到同名的鍵,則還包括默認(rèn)屬性列表中不同的鍵
(6)Properties代碼示例:

public static void show()
{
Properties prop = new Properties();
prop.setProperty("張三","26");
prop.setProperty("李四","30");
prop.setProperty("王五","35");
sop(prop);
String value = prop.getProperty("張三");

Set<String> keys = prop.stringPropertyName();
for(String key : values)
{
sop(key+":"+prop.getPropety(key));
}
}

(7)需求:記錄應(yīng)用程序的使用次數(shù),如果使用次數(shù)已到,則提示用戶注冊(cè)。
思路:
**第一次使用時(shí)建立一個(gè)配置文件用于記錄使用次數(shù)
**每次使用都加載該配置文件,并先判斷已使用次數(shù)
**每次使用完使用次數(shù)加1,寫入配置文件

public static void main(String[] args) throws IOException{
Properties prop = new Properties();//定義Properties,用來和IO流結(jié)合
File file = new File("library\\time.ini");//配置文件
if(!file.exists())
file.createNewFile();//如果文件不存在則創(chuàng)建文件(用于第一次使用時(shí)創(chuàng)建文件)
FileInputStream fis = new FileInputStream(file);//定義字節(jié)讀取流,讀取配置文件中記錄的使用次數(shù)
prop.load(fis);//載入流,以獲取文件中配置的鍵值對(duì)
int count = 0;//定義使用次數(shù)
String countValue = prop.getProperty("time");//通過鍵獲取值
if(countValue!=null){//第一次時(shí)countValue為null
count = Integer.parseInt(countValue);//將字符串次數(shù)變成數(shù)字次數(shù)
if(count>3){
System.out.println("您使用次數(shù)已到,繼續(xù)使用請(qǐng)注冊(cè)!");
return;
}
}
count++;//如果使用次數(shù)未到則次數(shù)加1
prop.setProperty("time", count+"");//配置新的鍵值對(duì)
FileWriter fos = new FileWriter(file);
prop.store(fos, "這是應(yīng)用程序使用次數(shù)的配置文件");//將新的鍵值對(duì)寫入文件
fis.close();
fos.close();    
}

10、IO中的其他流:

(1)打印流:
**PrintWriter:字符打印流
****構(gòu)造方法:
PrintWriter(String fileName)
創(chuàng)建具有指定文件名稱且不帶自動(dòng)行刷新的新 PrintWriter。
PrintWriter(File file)
使用指定文件創(chuàng)建不具有自動(dòng)行刷新的新 PrintWriter。
PrintWriter(Writer out)
創(chuàng)建不帶自動(dòng)行刷新的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush)
自動(dòng)刷新
PrintWriter(OutputStream out)
根據(jù)現(xiàn)有的 OutputStream 創(chuàng)建不帶自動(dòng)行刷新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush)
自動(dòng)刷新
****方法摘要:
PrintWriter append(char c)
將指定字符添加到此 writer。
void close()
關(guān)閉該流并釋放與之關(guān)聯(lián)的所有系統(tǒng)資源。
void flush()
刷新該流的緩沖。
void print(Object obj)
打印對(duì)象。
void print(String s)
打印字符串。
void println()
通過寫入行分隔符字符串終止當(dāng)前行。
**PrintStream:字節(jié)打印流
****構(gòu)造方法:
PrintStream(String fileName)
創(chuàng)建具有指定文件名稱且不帶自動(dòng)行刷新的新打印流。
PrintStream(File file)
創(chuàng)建具有指定文件且不帶自動(dòng)行刷新的新打印流。
PrintStream(OutputStream out)
創(chuàng)建新的打印流。
PrintStream(OutputStream out, boolean autoFlush)
創(chuàng)建新的打印流。
****方法摘要:
PrintWriter append(char c)
將指定字符添加到此 writer。
void close()
關(guān)閉該流并釋放與之關(guān)聯(lián)的所有系統(tǒng)資源。
void flush()
刷新該流的緩沖。
void print(Object obj)
打印對(duì)象。
void print(String s)
打印字符串。
void println()
通過寫入行分隔符字符串終止當(dāng)前行。
(2)對(duì)象系列化:
**對(duì)象實(shí)體化:找一個(gè)介質(zhì),能長期的存儲(chǔ)對(duì)象。
**對(duì)象的屬性在Java程序中,都是存在于對(duì)內(nèi)存中,隨著對(duì)象的消失而消失,
而ObjectOutputStream可以將對(duì)象實(shí)體化
**Serializable接口沒有一個(gè)方法,也就是說其是一個(gè)標(biāo)記接口。比如蓋章的豬肉才是安全的。
**只有實(shí)現(xiàn)Serializable接口的子類才能被ObjectOutputStream系列化寫入流,當(dāng)某個(gè)
類實(shí)現(xiàn)該接口后,會(huì)被Java自動(dòng)分配UID號(hào),以便編譯器識(shí)別,區(qū)分不同對(duì)象。
**用ObjectOutputStream系列化的對(duì)象存儲(chǔ)到文件后,該文件是亂碼,也就是不可讀的
的用ObjectInputStream讀取該類對(duì)象的屬性。
**由于對(duì)象是有Java給對(duì)象分配相應(yīng)的UID號(hào),而UID號(hào)是根據(jù)對(duì)象的屬性不同而分配的。
當(dāng)一個(gè)類對(duì)象被系列化到文件后,如果該類改動(dòng)了對(duì)象的屬性,比如將某個(gè)成員變量變成私有
則該對(duì)象再用ObjectInputStream讀取時(shí)會(huì)報(bào)異常,也就是說該系列化到文件的對(duì)象不能再被使用了
那么,要想繼續(xù)使用屬性被改動(dòng)后的對(duì)象,我們可以自定義給對(duì)象分配UID號(hào),讓UID號(hào)不隨對(duì)象的屬性
變化而變化。
自定義對(duì)象分配UID方法如下:
public static final long serialVersion UID = 43L;
**注意:
靜態(tài)不能被系列化,因?yàn)殪o態(tài)成員變量實(shí)在內(nèi)存的方法區(qū),而ObjectOutputStream只能
對(duì)對(duì)內(nèi)存里面的數(shù)據(jù)進(jìn)行系列化
被transient修飾的非靜態(tài)成員變量也不能被系列化
被系列化的對(duì)象存儲(chǔ)到文件中,該文件是不可讀的,所以該文件的擴(kuò)展名一般
不寫成.txt,通常后綴名寫.object
**ObjectOutputStream
**ObjectInputStream
(3)管道流:
PipedInputStream
PipedOutputStream
(4)隨機(jī)訪問文件:RandomAccess(重要!!!)
**自身具備讀寫方法(很牛逼!又可以讀又可以寫)
**通過skipByte(int x)和seek(int x)來達(dá)到隨機(jī)訪問文件
**該類不是IO體系子類,而是直接繼承Object,但它是IO包中的成員,因?yàn)樗邆渥x寫方法
**該類內(nèi)部封裝了數(shù)組,而且通過指針對(duì)數(shù)組的元素進(jìn)行操作,可以通過getFilePoint獲取指針位置
同時(shí)可以通過seek改變指針位置
**該類完成讀寫的原理是內(nèi)部封裝了字節(jié)輸入輸出流
**通過該類的構(gòu)造看出,該類只能操作文件,而且操作的文件只能有固定模式:
"r":只讀
"rw":讀寫
"rws":
"red":
**構(gòu)造方法:
RandomAccessFile(File file, String mode)
創(chuàng)建從中讀取和向其中寫入(可選)的隨機(jī)訪問文件流,該文件由 File 參數(shù)指定。
RandomAccessFile(String name, String mode)
創(chuàng)建從中讀取和向其中寫入(可選)的隨機(jī)訪問文件流,該文件具有指定名稱。
**方法摘要:
void write(byte[] b)
將 b.length 個(gè)字節(jié)從指定 byte 數(shù)組寫入到此文件,并從當(dāng)前文件指針開始。
void write(byte[] b, int off, int len)
將 len 個(gè)字節(jié)從指定 byte 數(shù)組寫入到此文件,并從偏移量 off 處開始。
void write(int b)
向此文件寫入指定的字節(jié)。
int read()
從此文件中讀取一個(gè)數(shù)據(jù)字節(jié)。
int read(byte[] b)
將最多 b.length 個(gè)數(shù)據(jù)字節(jié)從此文件讀入 byte 數(shù)組。
int read(byte[] b, int off, int len)
將最多 len 個(gè)數(shù)據(jù)字節(jié)從此文件讀入 byte 數(shù)組。
String readLine()
從此文件讀取文本的下一行。
long getFilePointer()
返回此文件中的當(dāng)前偏移量。
long length()
返回此文件的長度。
void seek(long pos)
設(shè)置到此文件開頭測(cè)量到的文件指針偏移量,在該位置發(fā)生下一個(gè)讀取或?qū)懭氩僮鳌?br> (4)操作基本數(shù)據(jù)類型的流對(duì)象:DateStream
(5)操作字節(jié)數(shù)組流:
ByteArrayInputStream
ByteArrayOutputStream
11、IO流轉(zhuǎn)換流的字符編碼
(1)字符流的出現(xiàn)為了方便操作字符,更重要的是加入了編碼轉(zhuǎn)換
(2)通過子類轉(zhuǎn)換流來完成
InputStreamReander
OutputStreamWriter
(3)在兩個(gè)子類對(duì)象進(jìn)行構(gòu)造的時(shí)候可以加入編碼表
(4)編碼表:
將各個(gè)國家的文字用二進(jìn)制數(shù)字表示并一一對(duì)應(yīng),形成一張表,這就是編碼表
(5)常見的編碼表:
**ASCII:美國標(biāo)準(zhǔn)信息交換碼,用一個(gè)字節(jié)的七位表示
**ISO8859-1:拉丁碼表,歐洲碼表,用一個(gè)字節(jié)的八位表示
**GB2312:中文編碼表,用兩個(gè)字節(jié)表示
**GBK:中文編碼表升級(jí),融合錄入更多的中文字符,用兩個(gè)字節(jié)表示,為避免和老美重復(fù)
兩字節(jié)的最高位都是1,即漢字都是用負(fù)數(shù)表示
**Unicode:國際標(biāo)準(zhǔn)碼,融合了多種文字,所有文字都用兩個(gè)字節(jié)表示
**UTF-8:用一個(gè)字節(jié)到三個(gè)字節(jié)表示。
注:Unicode能識(shí)別中文,UTF-8也能識(shí)別中文,但兩種編碼表示一個(gè)漢字所用的字節(jié)數(shù)不同
Unicode用兩個(gè)字節(jié),UTF-8用三個(gè)字節(jié),故涉及到編碼轉(zhuǎn)換。
(6)在流中涉及編碼表的轉(zhuǎn)換只有轉(zhuǎn)換流:
InputStreamReander
OutputStreamWriter
(7)代碼示例:

public static void write() throws IOException
{
OutputStreamWriter osw1 = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"GBK");
osw1.write("你好");
osw1.close();

OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream("utf-8.txt"),"UTF-8");
osw2.write("你好");
osw2.close();
}
public static void read() throws IOException
{
InputStreamReader isr = new InputStreamReader(new FileInputStream("gbk.txt"),"GBK");
byte[] buf = new byte[1024];
int len = isr.read(buf);
sop(new String(buf,0,len));
}

(8)編碼解碼
編碼:字符串變成字節(jié)數(shù)組:String-->getBytes()-->byte
解碼:字節(jié)數(shù)組變成字符串:byte[]-->new String(byte[],0,len)-->String
(9)代碼示例:

public static void main(String[] args)
{
//編碼解碼1:默認(rèn)編碼
String str1 = "你好";
byte[] buf1 = str1.getBytes();//默認(rèn)解碼:Unicode,四個(gè)字節(jié)

//編碼解碼2:指定編碼
String str2 = "你好";
byte[] buf2 = str2.getBytes("UTF-8");//指定解碼:UTF-8,六個(gè)字節(jié)

//編碼解碼3:編碼正確解碼錯(cuò)誤
String str3 = "你好";
byte[] buf3 = str3.getBytes("GBK");//指定編碼:GBK,四個(gè)字節(jié)
String str3 = new String(buf3,"ISO8859-1");//錯(cuò)誤解碼

//編碼解碼4:錯(cuò)誤編碼正確解碼
String str4 = "你好";
byte[] buf4 = str4.getBytes("ISO8859-1");//錯(cuò)誤編碼
String str4 = new String(buf4,"GBK");//正確解碼,讀不出來

//編碼解碼5:編碼對(duì)了,但是解碼錯(cuò)誤了,怎么辦呢?
//此時(shí)可以將錯(cuò)誤的解碼再錯(cuò)編回去,載用正確編碼解碼
String str5 = "你好";
byte[] buf5 = str5.getBytes("GBK");//正確編碼
String str6 = new String(buf5,"ISO8859-1");//錯(cuò)誤解碼,讀不出來
byte[] buf6 = str6.getBytes("ISO8859-1");//再錯(cuò)誤編碼
String str7 = new String(buf6,"GBK");//再正確解碼,這樣就可以讀出來了
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,616評(píng)論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,727評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,928評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,165評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評(píng)論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,585評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,892評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容

  • 一、基礎(chǔ)知識(shí):1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,398評(píng)論 0 4
  • 概述 java.io 包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標(biāo)。java.io ...
    Steven1997閱讀 9,218評(píng)論 1 25
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,711評(píng)論 18 399
  • 一張桌子, 一把椅子, 三尺講臺(tái)。 他, 教書育人, 不求回報(bào), 鞠躬盡瘁, 只為人師。 他, 靈魂的工程師, 撫...
    vlvlan乖孩子閱讀 242評(píng)論 0 1
  • 最近關(guān)于星座我有著不能理解的執(zhí)著。 今天想聊一下我心中的射手座。 射手座,想對(duì)你好的時(shí)候你會(huì)感覺全世界的人都沒有他...
    尼小剎閱讀 578評(píng)論 1 2