一、實(shí)驗(yàn)?zāi)康?
1.?理解數(shù)據(jù)流的概念
2.?理解Java流的層次結(jié)構(gòu)
3.?理解文件的概念
二、實(shí)驗(yàn)要求
1.?掌握字節(jié)流的基本使用方法
2.?掌握字符流的基本使用方法
3.?能夠創(chuàng)建、讀寫、更新文件???
三、實(shí)驗(yàn)內(nèi)容
(一)使用標(biāo)準(zhǔn)數(shù)據(jù)流的應(yīng)用程序
標(biāo)準(zhǔn)數(shù)據(jù)流指在字符方式下(如DOS 提示符)程序與系統(tǒng)進(jìn)行輸入輸出的方式,鍵盤和顯示器屏幕是標(biāo)準(zhǔn)輸入輸出設(shè)備,數(shù)據(jù)輸入的起點(diǎn)為鍵盤,數(shù)據(jù)輸出的終點(diǎn)是屏幕,輸出的數(shù)據(jù)可以在屏幕上顯示出來(lái)。
1.?程序功能:將鍵盤上輸入的字符在屏幕上顯示出來(lái)
2.?編寫KY10_1.java 程序文件,源代碼如下。
class KY10_1{
public static void main(String[] args) throws java.io.IOException {
byte buffer[]=new byte[10];
System.out.println("從鍵盤輸入不超過(guò)10 個(gè)字符,按回車鍵結(jié)束輸入:");
int count =System.in.read(buffer);//讀取輸入的字符并存放在緩沖區(qū)buffer 中
System.out.println("保存在緩沖區(qū)buffer 中元素的個(gè)數(shù)為:"+count);
System.out.println("buffer 中各元素的值為:");
for (int i=0;i
}
System.out.println();
System.out.println("輸出buffer 字符元素:");
System.out.write(buffer, 0, buffer.length);
}
}
3.?編譯、運(yùn)行KY10_1.java 文件。
(二)使用文件輸入輸出流的應(yīng)用程序
1.?程序功能:將保存在本地機(jī)當(dāng)前文件夾中的KY10_2.HTML 文本文件的內(nèi)容在屏幕上顯示出來(lái),然后將其另存為KY10_2.txt 文件。
2.?編寫KY10_2.java 程序文件,源代碼如下
import java.io.*;
public class KY5_4 {
public static void main(String[] args) throws IOException {
FileReader in=new FileReader("KY5_1.HTML");//建立文件輸入流
BufferedReader bin=new BufferedReader(in);//建立緩沖輸入流
FileWriter out=new FileWriter(" KY5_1.txt",true);//建立文件輸出流
String str;
while ((str=bin.readLine())!=null) {
//將緩沖區(qū)內(nèi)容通過(guò)循環(huán)方式逐行賦值給字符串str
System.out.println(str);//在屏幕上顯示字符串str
out.write(str+"\n");//將字符串str 通過(guò)輸出流寫入KY5_1.txt 中
}
in.close();
out.close();
}
}
3.?編譯、運(yùn)行程序
(三)使用隨機(jī)文件類的應(yīng)用程序
使用文件輸入類FileReader 只能將文件內(nèi)容全部讀入。如果要選擇讀入文件的內(nèi)容,可使用隨機(jī)文件類RandomAccessFile。
1.?程序功能:建立數(shù)據(jù)流,通過(guò)指針有選擇的讀入文件內(nèi)容。
2.?編寫KY10_3.java 程序文件,源代碼如下。
import java.io.*;
class KY10_3 {
public static void main(String args[]) {
String str[]={"First line\n","Second line\n","Last line\n"};
try {
RandomAccessFile rf=new RandomAccessFile("KY5_5.txt", "rw");
System.out.println("\n 文件指針位置為:"+rf.getFilePointer());
System.out.println("文件的長(zhǎng)度為:"+rf.length());
rf.seek(rf.length());
System.out.println("文件指針現(xiàn)在的位置為:"+rf.getFilePointer());
for (int i=0; i<3; i++)
rf.writeChars(str[i]); // 字符串轉(zhuǎn)為字節(jié)串添加到文件末尾87
rf.seek(10);
System.out.println("\n 選擇顯示的文件內(nèi)容:");
String s;
while ((s=rf.readLine())!=null)
System.out.println(s);
rf.close();
}
catch (FileNotFoundException fnoe) {}
catch (IOException ioe) {}
}
}
3.?編譯并運(yùn)行程序
(四)使用數(shù)據(jù)輸入輸出流與文件輸入輸出流類的應(yīng)用程序
使用數(shù)據(jù)輸入流DataOutputStream 和數(shù)據(jù)輸出流DataInputStream 可以讀取或?qū)懭肴魏蜫ava 類型的數(shù)據(jù),不用關(guān)心它們的實(shí)際長(zhǎng)度是多少字節(jié)。一般與文件輸入流FileInputStream 和輸出流類
FileOutputStream 一起使用。
1.?程序功能:將整型數(shù)據(jù)和字符串對(duì)象通過(guò)數(shù)據(jù)輸出流寫到文件中。將文件中的整型數(shù)據(jù)和字符串對(duì)象通過(guò)數(shù)據(jù)輸出流讀出,并在屏幕上顯示文件中的內(nèi)容。
2.?編寫KY10_4.java 程序文件,源代碼如下。
import java.io.*;
public class KY10_4
{
public static void main(String arg[])
{
try
{ //添加方式創(chuàng)建文件輸出流
FileOutputStream fout = new FileOutputStream("KY5_6.txt",true);
DataOutputStream dout = new DataOutputStream(fout);
dout.writeInt(1);
dout.writeChars("羅馬"+"\n");
dout.writeInt(2);
dout.writeChars("北京"+"\n");
dout.close();
}
catch (IOException ioe){}
try
{
FileInputStream fin = new FileInputStream("KY5_6.txt");
DataInputStream din = new DataInputStream(fin);
int i = din.readInt();
while (i!=-1) //輸入流未結(jié)束時(shí),輸入流結(jié)束時(shí)i 為-1
{
System.out.print(i+" ");
char ch ;
while ((ch=din.readChar())!='\n') //字符串未結(jié)束時(shí)
System.out.print(ch);
System.out.println();
i = din.readInt();
}
din.close();
}
catch (IOException ioe){}
}
}
3.?編譯并運(yùn)行程序
(五)使用對(duì)象輸入輸出流的應(yīng)用程序
使用對(duì)象流可以直接寫入或讀取一個(gè)對(duì)象。由于一個(gè)類的對(duì)象包含多種信息,為了保證從對(duì)象流中能夠讀取到正確的對(duì)象,因此要求所有寫入對(duì)象流的對(duì)象都必須是序列化的對(duì)象。一個(gè)類如果實(shí)現(xiàn)了Serializable 接口,那么這個(gè)類的對(duì)象就是序列化的對(duì)象。Serializable 接口沒(méi)有方法,實(shí)現(xiàn)該接口的類不需要實(shí)現(xiàn)額外的方法。
1.?程序功能:保存對(duì)象信息到文件,并將文件中的對(duì)象信息顯示出來(lái)。
2.?編寫KY10_5.java 程序文件,源代碼如下。
import java.io.*;
public class KY5_7 implements Serializable //序列化接口
{
int bh=1;int nl=21;
String xm;
KY5_7(int bh,String xm,int nl)//構(gòu)造方法
{
this.bh = bh;
this.xm = xm;
this.nl = nl;
}
KY10_5()//構(gòu)造方法
{
this(0,"",21);
}
void save(String fname)//保存到文件中的方法
{
try
{
FileOutputStream fout = new FileOutputStream(fname);//輸出文件流
ObjectOutputStream out = new ObjectOutputStream(fout);//輸出對(duì)象流
out.writeObject(this); //寫入對(duì)象
out.close();
}
catch (FileNotFoundException fe){}
catch (IOException ioe){}
}
void display(String fname)//顯示文件中對(duì)象信息的方法
{
try
{
FileInputStream fin = new FileInputStream(fname);//輸入文件流
ObjectInputStream in = new ObjectInputStream(fin);//輸入對(duì)象流
KY10_5 OO = (KY5_7)in.readObject(); //讀取對(duì)象
System.out.println(" 類名: "+OO.getClass().getName()+"
"+OO.getClass().getInterfaces()[0]);
System.out.println(" "+OO.bh+" "+OO.xm+" "+OO.nl);
in.close();
}
catch (FileNotFoundException fe){}
catch (IOException ioe){}
catch (ClassNotFoundException ioe) {}
}
public static void main(String arg[])
{
String fname = "KY5_7.obj";
KY10_5 O1= new KY5_7(1,"張馳",14);
O1.save(fname);
O1.display(fname);
}
}
3.?編譯并運(yùn)行程序
評(píng)論
查看更多