一、 填空題
1.Java IO流可以分為 節(jié)點(diǎn)流 和處理流兩大類路狮,其中前者處于IO操作的第一線步绸,所有操作必須通過他們進(jìn)行。
2.輸入流的唯一目的是提供通往數(shù)據(jù)的通道显拜,程序可以通過這個(gè)通道讀取數(shù)據(jù)衡奥, read
方法給程序提供了一個(gè)從輸入流中讀取數(shù)據(jù)的基本方法。
1.read方法從輸入流中順序讀取源中的單個(gè)字節(jié)數(shù)據(jù)远荠,該方法返回字節(jié)值(0-255之間的一個(gè)整數(shù))矮固,如果到達(dá)源的末尾,該方法返回 -1 譬淳。
2.Java系統(tǒng)的標(biāo)準(zhǔn)輸入對象是System.in档址,標(biāo)準(zhǔn)輸出對象有兩個(gè),分別是標(biāo)準(zhǔn)輸出System.out和標(biāo)準(zhǔn)錯(cuò)誤輸出____System.err__邻梆。
3.Java IO體系中守伸,___ ObjectInputStream 是字節(jié)輸入流,不僅提供了存取所有Java基礎(chǔ)類型數(shù)據(jù)(如:int浦妄,double 等)和String的方法,也提供了提供存取對象的方法尼摹。
4.Java IO體系中,____ DataOutputStream 是字節(jié)輸出流剂娄,提供了可以存取所有Java基礎(chǔ)類型數(shù)據(jù)(如:int蠢涝,double 等)和String的方法,但沒有提供存取對象的方法。
5.序列化_是指將Java對象轉(zhuǎn)換成字節(jié)序列阅懦,從而可以保存到磁盤上和二,也可以在網(wǎng)絡(luò)上傳輸,使得不同的計(jì)算機(jī)可以共享對象耳胎。
二惯吕、 選擇題
1.
使用Java IO流實(shí)現(xiàn)對文本文件的讀寫過程中,需要處理下列( B )異常怕午。(選擇一項(xiàng))
A
ClassNotFoundException
B.
IOException
C.
SQLException
D.
RemoteException
2.
在Java的IO操作中混埠,( D )方法可以用來刷新流的緩沖。(選擇兩項(xiàng))
A
void release()
B.
void close()
C.
void remove()
D.
void flush()
3.
在Java中诗轻,下列關(guān)于讀寫文件的描述錯(cuò)誤的是( B )钳宪。(選擇一項(xiàng))
A
Reader類的read()方法用來從源中讀取一個(gè)字符的數(shù)據(jù)
B.
Reader類的read(int n )方法用來從源中讀取一個(gè)字符的數(shù)據(jù)
C.
Writer類的write(int n)方法用來向輸出流寫入單個(gè)字符
D.
Writer類的write(String str)方法用來向輸出流寫入一個(gè)字符串
4.
閱讀下列文件定入的Java代碼,共有( C )處錯(cuò)誤。(選擇一項(xiàng))
import java.io.*;
public class TestIO {
public static void main(String []args){
String str ="文件寫入練習(xí)";
FileWriter fw = null; //1
try{
fw = new FileWriter("c:\mytext.txt"); //2
fw.writerToEnd(str); //3
}catch(IOException e){ //4
e.printStackTrace();
}finally{
//此處省略關(guān)閉流
}
}
}
A
0
B.
1
C.
2
D.
3
5.
分析如下Java代碼吏颖,有標(biāo)注的四行代碼中搔体,有錯(cuò)誤的是第( D )處。(選擇一項(xiàng))
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String[ ] args) {
String str = "Hello World";
FileWriter fw = null;
try {
fw = new FileWriter("c:\\hello.txt"); // 1
fw.write(str); // 2
} catch (IOException e) {
e.printStackTrace(); // 3
} finally {
fw.close(); // 4
}
}
}
A
1
B.
2
C.
3
D.
4
6.
以下選項(xiàng)中關(guān)于如下代碼的說法正確的是( AD )半醉。(選擇二項(xiàng))
public class TestBuffered {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new FileReader("d:/bjsxt1.txt"));
BufferedWriter bw =
new BufferedWriter(new FileWriter("d:/bjsxt2.txt"));
String str = br.readLine();
while(str !=null){
bw.write(str);
bw.newLine();
str = br.readLine();
}
br.close();
bw.close();
}
}
A.
該類使用字符流實(shí)現(xiàn)了文件復(fù)制疚俱,將d:/bjsxt1.txt復(fù)制為d:/bjsxt2.txt
B.
FileReader和FileWriter是處理流,直接從文件讀寫數(shù)據(jù)
C.
BufferedReader和BufferedWriter是節(jié)點(diǎn)流缩多,提供緩沖區(qū)功能呆奕,提高讀寫效率
D.
readLine()可以讀取一行數(shù)據(jù),返回值是字符串類型衬吆,簡化了操作
7.
InputStreamReader是轉(zhuǎn)換流梁钾,可以將字節(jié)流轉(zhuǎn)換成字符流,是字符流與字節(jié)流之間的橋梁逊抡。它的實(shí)現(xiàn)使用的設(shè)計(jì)模式是( C )姆泻。(選擇一項(xiàng))
A.
工廠模式
B.
裝飾模式
C.
適配器模式
D.
代理模式
三、 判斷題
1.假設(shè)文件”a.txt”的長度為100字節(jié)冒嫡,那么當(dāng)正常運(yùn)行語句”O(jiān)utputStream f=new FileOutputStream(new File(“a.txt”));”之后拇勃,文件”a.txt”的長度變?yōu)?字節(jié)。( T )
2.ByteArrayInutStream和ByteArrayOutputStream對內(nèi)存中的字節(jié)數(shù)組進(jìn)行讀寫操作孝凌,屬于字節(jié)流方咆,屬于處理流而不是節(jié)點(diǎn)流。 ( F )
3.實(shí)現(xiàn)Serializable接口的可以被序列化和反序列化蟀架。該接口中沒有定義抽象方法瓣赂,也沒有定義常量。( T )
4.序列化是指將字節(jié)序列轉(zhuǎn)換成Java對象辜窑,只有實(shí)現(xiàn)了Serializable接口的類的對象才可以被序列化。( F )
四寨躁、 簡答題
1.輸入流和輸出流的聯(lián)系和區(qū)別穆碎,字符流和字節(jié)流的聯(lián)系和區(qū)別
1.列舉常用的字節(jié)輸入流和字節(jié)輸出流并說明其特點(diǎn),至少5對职恳。
1.說明緩沖流的優(yōu)點(diǎn)和原理
1.序列化的定義所禀、實(shí)現(xiàn)和注意事項(xiàng)
五、 編碼題
1.實(shí)現(xiàn)字符串和字節(jié)數(shù)組之間的相互轉(zhuǎn)換放钦。必如將字符串“北京尚學(xué)堂bjsxt”轉(zhuǎn)換為字節(jié)數(shù)組色徘,并將字節(jié)數(shù)組再轉(zhuǎn)換回字符串。
public class TestConvert
{
public static void main(String[] args) throws IOException
{
//準(zhǔn)備一個(gè)字符串
String contents = " 近日操禀,北京尚學(xué)堂科技有限公司正式成為央視網(wǎng)廣告合作伙伴";
System.out.println(contents);
//String---byte []
byte[] buf = contents.getBytes();
//byte[]----String
String contents2 = new String(buf, 0, buf.length);
System.out.println(contents2);
}
}
2.實(shí)現(xiàn)字節(jié)數(shù)組和任何基本類型和引用類型執(zhí)行的相互轉(zhuǎn)換
提示:使用ByteArrayInutStream和ByteArrayOutputStream褂策。
public class TestByteArrayStream
{
public static void main(String[] args) throws IOException,
ClassNotFoundException
{
int num = 50;
boolean flag = true;
User user = new User("bjsxt", "bjsxt");
//使用數(shù)據(jù)包把數(shù)據(jù)封裝起來
//各種數(shù)據(jù)類型----->byte[] ByteArrayOutputStream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);//包裝流
oos.writeInt(num);
oos.writeBoolean(flag);
oos.writeObject(user);
byte[] buf = baos.toByteArray();
baos.close();
//byte[]----------->各種數(shù)據(jù)類型
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
ObjectInputStream ois = new ObjectInputStream(bais);
int num2 = ois.readInt();
boolean flag2 = ois.readBoolean();
User user2 = (User) ois.readObject();
System.out.println(num2);
System.out.println(flag2);
System.out.println(user2);
bais.close();
}
}
3.分別使用文件流和緩沖流復(fù)制一個(gè)長度大于100MB的視頻文件,并觀察效率的差異。
public class TestCopy4
{
public static void main(String[] args) throws IOException
{
//創(chuàng)建輸入流和輸出流
InputStream fis = new FileInputStream(new File("d:/1.mp4"));
OutputStream fos = new FileOutputStream("d:/2.mp4");
//使用輸入流和輸出流復(fù)制文件
byte[] buf = new byte[10];
int len = fis.read(buf);
while (len != -1)
{
//寫
fos.write(buf, 0, len);
//讀
len = fis.read(buf);
//System.out.println(len);
}
//關(guān)閉輸入流和輸出流
fis.close();
fos.close();
}
}
public class TestCopy
{
public static void main(String[] args) throws IOException
{
//創(chuàng)建輸入流和輸出流
InputStream fis = new FileInputStream(new File("d:/1.mp4"));
OutputStream fos = new FileOutputStream("d:/2.mp4");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
//使用輸入流和輸出流復(fù)制文件
byte[] buf = new byte[10];
int len = bis.read(buf);
while (len != -1)
{
//寫
bos.write(buf, 0, len);
//讀
len = bis.read(buf);
}
//關(guān)閉輸入流和輸出流
bis.close();
bos.close();
}
}
4.復(fù)制文件夾d:/sxtjava下面所有文件和子文件夾內(nèi)容到d:/sxtjava2斤寂。
提示:涉及單個(gè)文件復(fù)制耿焊、目錄的創(chuàng)建、遞歸的使用
public class CopyDir
{
/**
*
* 復(fù)制單個(gè)文件
*
* @param sourceFile 源文件
*
* @param targetFile 目標(biāo)文件
*
* @throws IOException
*
*/
public static void copyFile(File sourceFile, File targetFile) throws IOException
{
BufferedInputStream inBuff = null;
BufferedOutputStream outBuff = null;
try
{
// 新建文件輸入流
inBuff = new BufferedInputStream(new FileInputStream(sourceFile));
// 新建文件輸出流
outBuff = new BufferedOutputStream(new FileOutputStream(targetFile));
// 緩沖數(shù)組
byte[] b = new byte[1024 * 5];
int len;
while ((len = inBuff.read(b)) != -1)
{
outBuff.write(b, 0, len);
}
// 刷新此緩沖的輸出流
outBuff.flush();
} finally
{
// 關(guān)閉流
if (inBuff != null)
{
inBuff.close();
}
if (outBuff != null)
{
outBuff.close();
}
}
}
/**
*
* 復(fù)制目錄
*
* @param sourceDir 源目錄
*
* @param targetDir 目標(biāo)目錄
*
* @throws IOException
*
*/
public static void copyDirectiory(String sourceDir, String targetDir)
throws IOException
{
// 檢查源目錄
File fSourceDir = new File(sourceDir);
if (!fSourceDir.exists() || !fSourceDir.isDirectory())
{
System.out.println("源目錄不存在");
return;
}
//檢查目標(biāo)目錄遍搞,如不存在則創(chuàng)建
File fTargetDir = new File(targetDir);
if (!fTargetDir.exists())
{
fTargetDir.mkdirs();
}
// 遍歷源目錄下的文件或目錄
File[] file = fSourceDir.listFiles();
for (int i = 0; i < file.length; i++)
{
if (file[i].isFile())
{
// 源文件
File sourceFile = file[i];
// 目標(biāo)文件
File targetFile = new File(fTargetDir, file[i].getName());
copyFile(sourceFile, targetFile);
}
//遞歸復(fù)制子目錄
if (file[i].isDirectory())
{
// 準(zhǔn)備復(fù)制的源文件夾
String subSourceDir = sourceDir + File.separator + file[i].getName();
// 準(zhǔn)備復(fù)制的目標(biāo)文件夾
String subTargetDir = targetDir + File.separator + file[i].getName();
// 復(fù)制子目錄
copyDirectiory(subSourceDir, subTargetDir);
}
}
}
public static void main(String[] args) throws IOException
{
copyDirectiory("d:/sxtjava", "d:/sxtjava2");
}
}
可選題
1.使用IO包中的類讀取D盤上exam.txt文本文件的內(nèi)容罗侯,每次讀取一行內(nèi)容,將每行作為一個(gè)輸入放入ArrayList的泛型集合中并將集合中的內(nèi)容使用加強(qiáng)for進(jìn)行輸出顯示溪猿。
public class Test
{
public static void main(String[] args) throws IOException
{
String path = "D:\\exam.txt";
outputMethod(path);
}
public static void outputMethod(String path) throws IOException
{
List<String> list = new ArrayList<String>(); // 創(chuàng)建集合對象
// 創(chuàng)建緩沖區(qū)對象
BufferedReader br = new BufferedReader(new FileReader(path));
String line = br.readLine(); // 讀取數(shù)據(jù)每次讀一行
while (line != null)
{
list.add(line);
line = br.readLine();
}
br.close(); //關(guān)閉
for (String s : list)
{
System.out.println(s);
}
}
}
2.假設(shè)從入學(xué)開始所有書寫的Java類代碼都在d:/sxtjava文件夾下钩杰,包括多級子文件夾。使用IO流獲取從入學(xué)開始诊县,到目前為止已經(jīng)寫了多少行Java代碼讲弄。
提示:
其實(shí)就是獲取d:/sxtjava文件夾及其子文件夾下的所有.java文件,使用readLine()讀取其中每一行翎冲,每讀取一行垂睬,行數(shù)加1。所有的文件讀取完畢抗悍,得到總共已經(jīng)寫的Java代碼行數(shù)驹饺。需要結(jié)合遞歸實(shí)現(xiàn)。
public class TestCountDir
{
private int count;
/**
*
* 統(tǒng)計(jì)一個(gè)java文件的行數(shù)
*
*/
private void countLine(File sourceFile) throws IOException
{
BufferedReader br = null;
try
{
// 新建文件輸入流
br = new BufferedReader(new FileReader(sourceFile));
while (br.readLine() != null)
{
count++;
//System.out.println(count);
}
} finally
{
br.close();
}
}
/**
*
* 統(tǒng)計(jì)一個(gè)目錄下所有Java文件的行數(shù)
*
*/
private void countDir(String sourceDir) throws IOException
{
// 檢查源目錄
File fSourceDir = new File(sourceDir);
if (!fSourceDir.exists() || !fSourceDir.isDirectory())
{
System.out.println("源目錄不存在");
return;
}
// 遍歷目錄下的文件或目錄
File[] file = fSourceDir.listFiles();
for (int i = 0; i < file.length; i++)
{
if (file[i].isFile())
{
if (file[i].getName().toLowerCase().endsWith(".java"))
{
// System.out.println(file[i].getName());
countLine(file[i]);
}
}
//遞歸統(tǒng)計(jì)代碼行數(shù)
if (file[i].isDirectory())
{
// 準(zhǔn)備統(tǒng)計(jì)的文件夾
String subSourceDir = sourceDir + File.separator + file[i].getName();
// 統(tǒng)計(jì)子目錄
countDir(subSourceDir);
}
}
}
public static void main(String[] args) throws IOException
{
TestCountDir tcd = new TestCountDir();
tcd.countDir("d:/sxtjava");
System.out.println(tcd.count);
}
}
3.由控制臺按照固定格式輸入學(xué)生信息缴渊,包括學(xué)號赏壹,姓名,年齡信息衔沼,當(dāng)輸入的內(nèi)容為exit退出;將輸入的學(xué)生信息分別封裝到一個(gè)Student對象中指蚁,再將每個(gè)Student對象加入到一個(gè)集合中菩佑,要求集合中的元素按照年齡大小正序排序;最后遍歷集合凝化,將集合中學(xué)生信息寫入到記事本稍坯,每個(gè)學(xué)生數(shù)據(jù)占單獨(dú)一行。
public class Student implements Comparable<Student>
{
private Integer num;
private String name;
private Integer age;
//省略getter和setter方法
//省略構(gòu)造方法
public int compareTo(Student stu)
{
return this.age - stu.age;
}
public String toString()
{
return "Student [age=" + age + ", name=" + name
+ ", num=" + num + "]";
}
}
public class Test
{
public static void main(String[] args)
{
Set<Student> stuSet = saveStudentInfo();
outputInfo(stuSet);
}
private static Set<Student> saveStudentInfo()
{
Scanner input = new Scanner(System.in);
// 保存學(xué)生信息的TreeSet集合對象
Set<Student> stuSet = new TreeSet<Student>();
while (true)
{
// 輸入提示
System.out.println("請輸入學(xué)生信息:(學(xué)號#姓名#年齡)");
String inputData = input.nextLine();
// 判斷是否退出 inputData.equals("exit")
if ("exit".equals(inputData))
{
break;
}
// 將用戶輸入的學(xué)生信息分割為String[]
String[] info = inputData.split("#");
// 將輸入信息封裝到Student對象中
Student stu
= new Student(Integer.parseInt(info[0]), info[1],
Integer.parseInt(info[2]));
// 將學(xué)生對象加入集合
stuSet.add(stu);
}
return stuSet;
}
private static void outputInfo(Set<Student> stuSet)
{
File file = new File("e:/student.txt");
// 創(chuàng)建文件輸出流對象
FileWriter fw = null;
try
{
fw = new FileWriter(file);
Iterator<Student> it = stuSet.iterator();
while (it.hasNext())
{
String info = it.next().toString();
// 將info字符串搓劫,寫入記事本
fw.write(info);
// 完成換行功能
fw.write("\r\n");
}
} catch (Exception e)
{
e.printStackTrace();
} finally
{
try
{
fw.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
}