Java IO是面試中常問到的問題.
什么是IO流霞捡?
它是一種數(shù)據(jù)的流從源頭流到目的地。比如文件拷貝,輸入流和輸出流都包括了吱雏。輸入流從文件中讀取數(shù)據(jù)存儲到進(jìn)程(process)中,輸出流從進(jìn)程中讀取數(shù)據(jù)然后寫入到目標(biāo)文件瘾境。字節(jié)流和字符流的區(qū)別坎背。
字節(jié)流在JDK1.0中就被引進(jìn)了,用于操作包含ASCII字符的文件寄雀。JAVA也支持其他的字符如Unicode得滤,為了讀取包含Unicode字符的文件,JAVA語言設(shè)計(jì)者在JDK1.1中引入了字符流盒犹。ASCII作為Unicode的子集懂更,對于英語字符的文件,可以可以使用字節(jié)流也可以使用字符流急膀。Java中流類的超類主要由那些沮协?
- java.io.InputStream
- java.io.OutputStream
- java.io.Reader
- java.io.Writer
- FileInputStream和FileOutputStream是什么?
這是在拷貝文件操作的時(shí)候卓嫂,經(jīng)常用到的兩個(gè)類慷暂。在處理小文件的時(shí)候,它們性能表現(xiàn)還不錯(cuò)晨雳,在大文件的時(shí)候行瑞,最好使用BufferedInputStream (或 BufferedReader) 和 BufferedOutputStream (或 BufferedWriter)
案例:
public class InputAndOutputBuffering
{
public static void main(String args[]) throws IOException
{
FileInputStream fistream = new FileInputStream("pqr.txt"); BufferedInputStream bistream = new BufferedInputStream(fistream);
FileOutputStream fostream = new FileOutputStream("xyz.txt");
BufferedOutputStream bostream = new BufferedOutputStream(fostream);
int temp;
while( ( temp = bistream.read() ) != -1 )
{
bostream.write(temp);
System.out.print((char) temp);
}
bostream.close(); fostream.close();
bistream.close(); fistream.close();
}
}
字節(jié)流和字符流奸腺,你更喜歡使用拿一個(gè)?
個(gè)人來說血久,更喜歡使用字符流突照,因?yàn)樗麄兏乱恍TS多在字符流中存在的特性氧吐,字節(jié)流中不存在讹蘑。比如使用BufferedReader而不是BufferedInputStreams或DataInputStream,使用newLine()方法來讀取下一行筑舅,但是在字節(jié)流中我們需要做額外的操作座慰。System.out.println()
是什么?
println
是PrintStream的一個(gè)方法翠拣。out
是一個(gè)靜態(tài)PrintStream類型的成員變量版仔,System
是一個(gè)java.lang包中的類,用于和底層的操作系統(tǒng)進(jìn)行交互心剥。什么是Filter流邦尊?
Filter Stream是一種IO流主要作用是用來對存在的流增加一些額外的功能,像給目標(biāo)文件增加源文件中不存在的行數(shù)优烧,或者增加拷貝的性能蝉揍。有哪些可用的Filter流?
在java.io包中主要由4個(gè)可用的filter Stream畦娄。兩個(gè)字節(jié)filter stream又沾,兩個(gè)字符filter stream. 分別是FilterInputStream, FilterOutputStream, FilterReader and FilterWriter.這些類是抽象類,不能被實(shí)例化的熙卡。
有些Filter流的子類杖刷。
- LineNumberInputStream 給目標(biāo)文件增加行號
- DataInputStream 有些特殊的方法如
readInt()
,readDouble()
和readLine()
等可以讀取一個(gè) int, double和一個(gè)string一次性的, - BufferedInputStream 增加性能
- PushbackInputStream 推送要求的字節(jié)到系統(tǒng)中
- SequenceInputStream的作用?
在拷貝多個(gè)文件到一個(gè)目標(biāo)文件的時(shí)候是非常有用的驳癌』迹可用使用很少的代碼實(shí)現(xiàn)
案例:
public class TwoFiles {
public static void main(String args[]) throws IOException
{
FileInputStream fistream1 = new FileInputStream("/Users/aihe/Desktop/Songshu/code/java8source/src/main/resources/A.txt"); // first source file
FileInputStream fistream2 = new FileInputStream("/Users/aihe/Desktop/Songshu/code/java8source/src/main/resources/B.txt"); //second source file
SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);
FileOutputStream fostream = new FileOutputStream("C.txt"); // destination file
int temp;
while( ( temp = sistream.read() ) != -1)
{
System.out.print( (char) temp ); // to print at DOS prompt
fostream.write(temp); // to write to file
}
fostream.close();
sistream.close();
fistream1.close();
fistream2.close();
}
}
說說PrintStream和PrintWriter
他們兩個(gè)的功能相同,但是屬于不同的分類颓鲜。字節(jié)流和字符流表窘。他們都有println()方法。在文件拷貝的時(shí)候甜滨,那一種流可用提升更多的性能乐严?
在字節(jié)流的時(shí)候,使用BufferedInputStream和BufferedOutputStream衣摩。
在字符流的時(shí)候昂验,使用BufferedReader 和 BufferedWriter說說管道流(Piped Stream)
有四種管道流, PipedInputStream, PipedOutputStream, PipedReader 和 PipedWriter.在多個(gè)線程或進(jìn)程中傳遞數(shù)據(jù)的時(shí)候管道流非常有用。說說File類
它不屬于 IO流既琴,也不是用于文件操作的占婉,它主要用于知道一個(gè)文件的屬性,讀寫權(quán)限呛梆,大小等信息锐涯。說說RandomAccessFile?
它在java.io包中是一個(gè)特殊的類磕诊,既不是輸入流也不是輸出流填物,它兩者都可以做到。他是Object的直接子類霎终。通常來說滞磺,一個(gè)流只有一個(gè)功能,要么讀莱褒,要么寫击困。但是RandomAccessFile既可以讀文件,也可以寫文件广凸。 DataInputStream 和 DataOutStream有的方法阅茶,在RandomAccessFile中都存在。
最后
這篇文章是我從國外翻譯的谅海,看完之后覺得對Java IO理解的更多了一些脸哀,翻譯過來分享給大家。