第一篇:使用java輸入輸出流實現(xiàn)文件的復制
使用java輸入輸出流實現(xiàn)文件的復制:
public class Test {
public static void copy(File source,File target){
InputStream in=null;
OutputStream out=null;
try {
in=new BufferedInputStream(new FileInputStream(source));out=new BufferedOutputStream(new FileOutputStream(target));byte[] buff=new byte[1024];
while(in.read(buff)>0){
out.write(buff);
}
} catch(Exception e){
// TODO: handle exception
e.printStackTrace();
}finally{
try {
if(in!=null)
in.close();
if(out!=null)
out.close();
} catch(Exception e2){
// TODO: handle exception
}
}
}
public static void main(String[] args){
// TODO Auto-generated method stub
}
}
第二篇:java 文件與輸入輸出流
實驗2文件與輸入輸出流(1)
一、實驗目的? 能夠使用File類表示文件或目錄,獲取相關信息,并進行文件操作; ? 能夠利用InputStream和OutputStream的子類進行字節(jié)讀、寫操作,明白其優(yōu)點及不足;
? 能夠用FileInputStream和FileOutputStream進行文件讀寫的操作; ? 理解“逐層包裝”思想,能夠利用“數(shù)據(jù)流”(DataInputStream和DataOutputStream)包裝字節(jié)流,方便各類數(shù)據(jù)的讀寫;
? 能夠利用“緩沖字節(jié)流”(BufferedInputStream和BufferedOutputStream)包裝字節(jié)流,加快數(shù)據(jù)的讀寫速度;
? 熟知System.in和System.out是PrintStream的實例。
二、實驗步驟
在Eclipse環(huán)境中導入項目“code(lab_2)”,然后按要求完成各小題:
1.打開FileTest.java文件,請按下列要求進行操作:
(1)按要求填充程序所缺代碼;
(2)程序的運行需要用到一個命令行參數(shù),請分別用一個文件、目錄作參數(shù)來運行程序,看一看結果有什么不同。
(在Eclipse中設置命令行參數(shù)方法:Run/Open Run Dialog ?/(x)=Arguments設置)
2.在上一題的基礎上,修改程序,使之具備輸出指定目錄下所有子目錄中文件絕對路徑名、大小的功能,如下所示:
子目錄:C:jdk1.6.0sample
子目錄:C:jdk1.6.0samplewebservices
子目錄:C:jdk1.6.0samplewebservicesEbayServer
文件: C:jdk1.6.0samplewebservicesEbayServerbuild.properties,大小: 512 字節(jié) 文件: C:jdk1.6.0samplewebservicesEbayServerbuild.xml,大小: 3168 字節(jié)1
……
提示:參考課件 FileSpace.java內容,通過一個以“路徑名”為參數(shù)的靜態(tài)方法來實現(xiàn):該方法先判斷“路徑名”是一個文件,還是一個目錄?如果是文件,則輸出其絕對路徑和大??;若為一個目錄,則先顯示目錄絕對路徑,再列出該目錄下的所有子目錄和文件,通過循環(huán)和遞歸方法來執(zhí)行后續(xù)處理。
3.文件FileOutputStreamTest.java的功能是:利用FileOutputStream類向myfile.txt文件寫入'0'~'9'和“用字節(jié)流寫入文件內容”,請?zhí)畛涑绦蛩贝a,并運行程序。然后打開myfile.txt文件,查看其內容是否與要求相符?
4.文件FileInputStreamTest1.java的功能是:利用FileInputStream類以“逐字節(jié)”方式讀取myfile.txt文件內容,并輸出。請?zhí)畛涑绦蛩贝a,并運行程序。問題:為什么程序輸出的內容為亂碼?
5.在FileInputStreamTest1.java的基礎上,編寫程序FileInputStreamTest2.java,利用FileInputStream類以“字節(jié)數(shù)組”方式讀取myfile.txt文件內容,能正確輸出,解決亂碼問題。
思考題:亂碼問題是怎樣解決的?
6.若要將信息“Java開發(fā)典型模塊大全”(書名)、“明日科技”(作者)、79.5(價格)等信息以UTF、double類型保存到文件books.txt中,請用“數(shù)據(jù)流”類編程實現(xiàn)。
第三篇:關于java文件流的簡單示例
package myjava;
import java.io.*;
public class InputStreamDemo1 {
//根據(jù)文件返回一個輸入流 private FileInputStream getFileInputStream(File file){FileInputStream fis=null;try{fis=new FileInputStream(file);}catch(IOException e){System.out.println(e.getMessage());}return fis;} //根據(jù)文件返回一個輸輸出流 private FileOutputStream getFileOutputStream(File file){FileOutputStream fos=null;try{fos=new FileOutputStream(file);}catch(IOException e){System.out.println(e.getMessage());}catch(Exception e1){System.out.println(e1.getMessage());}return fos;} public static void main(String args[]){File input=new File(“G:Java網絡編程.pdf”);File output=new File(“G:output.txt”);InputStreamDemo1 isd=new InputStreamDemo1();FileInputStream fis=isd.getFileInputStream(input);FileOutputStream fos=isd.getFileOutputStream(output);int b=0;
}} try {while((b=fis.read())!=-1){fos.write(b);} fis.close();fos.close();} catch(Exception e){System.out.println(e.getMessage());}
第四篇:Java 實驗 文件管理與IO流
作業(yè)要求:每個題保存為一個.java文件,保存在同一工程文件夾中,文件夾的名字為E:Java你的班級+姓名,例如:E:Java信息11張三。
注意:上交的程序包含程序的執(zhí)行結果,以注釋的形式附在程序后面。
實驗六文件管理與I/O流
一、實驗目的1.熟悉用文件File類創(chuàng)建、刪除、查看文件或目錄。
2.字節(jié)流、字符流、緩沖流、隨機流等流式文件的創(chuàng)建,讀寫操作。
3.用字符流和緩沖流從鍵盤接受字符串的方法。
二、實驗內容
1.先運行該程序。源文件是sy6_1.java。然后按【思考問題】分析程序。
import java.io.*;
public class sy6_1{
public static void main(String[] args)throws Exception
{
int x=0;
File Mypath;
Mypath=new File(“E:aaaa”);
if(!Mypath.exists())
{System.out.println(“創(chuàng)建新目錄”);Mypath.mkdir();}
else System.out.println(“目錄已存在”);
File Myfile1=new File(Mypath,“myfile1.txt”);
File Myfile2=new File(Mypath,“myfile2.txt”);
File Myfile3=new File(Mypath,“myfile3.txt”);
FileInputStream Fin=new FileInputStream(Myfile1);
FileOutputStream Fout=new FileOutputStream(Myfile1);
DataOutputStream Dout=new DataOutputStream(new FileOutputStream(Myfile2));
DataInputStream Din=new DataInputStream(new FileInputStream(Myfile2));
PrintWriter PWout=new PrintWriter(new FileWriter(Myfile3));
RandomAccessFile RAread=new RandomAccessFile(Myfile3,“r”);
String str;
int num1;
BufferedReader buf;//緩沖流
buf=new BufferedReader(new InputStreamReader(System.in));
System.out.print(“請輸入一個小于255整型數(shù):”);
while(!(str=buf.readLine()).equalsIgnoreCase(“q”))
{ System.out.print(“請輸入另一個小于255整型數(shù),按Q結束:”);
num1=Integer.parseInt(str);
Fout.write(num1);
}Fout.close();
System.out.println(“你剛輸入的數(shù)據(jù)是:”);
while((x=Fin.read())!=-1)
{ System.out.println(x);
}Fin.close();
System.out.print(“請輸入int范圍內整型數(shù):”);
while(!(str=buf.readLine()).equalsIgnoreCase(“q”))
{ System.out.print(“請輸入另一個整型數(shù),按Q結束:”);
num1=Integer.parseInt(str);
Dout.writeInt(num1);
}Dout.close();
int leng=Din.available()/4;
int xxx=0;
while(xxx { xxx++; x=Din.readInt(); System.out.println(x); } Din.close(); System.out.print(“請輸入第一個字符串:”); while((str=buf.readLine())!=null) { System.out.print(“請輸入另一個字符串,按Ctrl+Z結束:”); PWout.println(str);//寫入myfile3.txt中 } PWout.close(); RAread.seek(0); while(RAread.getFilePointer() {System.out.println(RAread.readLine());//從myfile3.txt中一行一行讀并輸出在控制臺上 } RAread.close(); System.out.println(“完成”); } } 【思考問題】 ① 本程序共用到哪幾種流式文件?都用于做什么? 答:基本輸入輸出流:System.in.輸入(從鍵盤) System.out.輸出(顯示器) 字節(jié)流類:FileOutputStream 文件輸出 FileInputStream 文件輸入 DataOutputStream數(shù)據(jù)輸出 DataInputStream數(shù)據(jù)輸入 字符流類:PrintWriter輸入 緩沖文件流:BufferedReader ② 運行完程序后,請用“我的電腦”找到創(chuàng)建的文件,并分別打開文件看其內容,你 看到的是你輸入的數(shù)據(jù)嗎? 答:myfile1和myfile2中的數(shù)據(jù)非輸入數(shù)據(jù),myfile3中可以看見輸入的數(shù)據(jù)。③ 將創(chuàng)建輸入流對象Fin放在輸出流Fout前,看發(fā)生什么? ④ 對第二種流式文件判斷文件占用字節(jié)的長度用available()方法,而此處用int leng=Din.available()/4;為什么除以4? 2.按照第1題的內容,修改程序要求每次重新運行不覆蓋原內容,把所有其它流式文件全部改用隨機流式文件來實現(xiàn),新的數(shù)據(jù)填加在文件尾,然后讀出校驗。 import java.io.*; public class sy6_2 { public static void main(String[] args)throws Exception { File Mypath; Mypath = new File(“E:aaa”); if(!Mypath.exists()) {System.out.println(“創(chuàng)建新目錄”);Mypath.mkdir();} else System.out.println(“目錄已存在”); File Myfile1 = new File(Mypath, “myfile1.txt”); File Myfile2 = new File(Mypath, “myfile2.txt”); File Myfile3 = new File(Mypath, “myfile3.txt”); RandomAccessFile rf1 = new RandomAccessFile(Myfile1, “rw”); RandomAccessFile rf2 = new RandomAccessFile(Myfile2, “rw”); RandomAccessFile rf3 = new RandomAccessFile(Myfile3, “rw”); String str; int num1; BufferedReader buf;//緩沖流 buf = new BufferedReader(new InputStreamReader(System.in)); System.out.print(“請輸入一個小于255整型數(shù):”); rf1.seek(rf1.length());//指針移到文件尾進行寫操作 while(!(str=buf.readLine()).equalsIgnoreCase(“q”)) { System.out.print(“請輸入另一個小于255整型數(shù),按Q結束:”);num1=Integer.parseInt(str); rf1.write(num1);//將整型數(shù)作為ascii碼值所對應的字符寫入myfile1.txt中} rf1.seek(0);//指針移到文件頭進行讀操作 int x=0; while((x=rf1.read())!=-1) { System.out.println(x); } rf1.close(); System.out.print(“請輸入int范圍內整型數(shù):”); rf2.seek(rf2.length()); while(!(str = buf.readLine()).equalsIgnoreCase(“q”)){ System.out.print(“請輸入另一個整型數(shù),按Q結束:”); num1 = Integer.parseInt(str); rf2.writeInt(num1); } int x1 = 0; for(int l = 0;l { rf2.seek(l*4); x1 = rf2.readInt(); System.out.println(x1); } rf2.close(); System.out.print(“請輸入第一個字符串:”); rf3.seek(rf3.length()); while((str = buf.readLine())!= null){ System.out.println(“請輸入另一個字符串,按Ctrl+Z結束:”);rf3.writeUTF(str);//寫入myfile3.txt中 } rf3.seek(0); while(rf3.getFilePointer()< rf3.length()){ System.out.println(rf3.readUTF());//從myfile3.txt中讀出字符串并輸出在控制臺上 } rf3.close(); System.out.println(“完成”); } } 三、實驗報告要求 1.回答第1題【思考問題】提出的問題。 2.寫出第二題要求的源程序。 流的分類: 輸入流(InputStream/Reader),輸出流(OutputStream/Writer) 字節(jié)流(InputStream,OutputStream)字符流(Reader/Writer) 節(jié)點流(InputStream/Reader,OutputStream/Writer),處理流(過濾流)BufferedIO(緩沖),DataInputStream/DataOutputStream(各種數(shù)據(jù)類型), InputStreamReader/OutputStreamWriter(轉換流),ByteArrayInputStream/ ByteArrayOutputStream(內存數(shù)組流)PipedInputStream/ PipedOutputStream(管道流,線程間通訊) 1.或者OutputStream可以創(chuàng)建一個文件,但是不能創(chuàng)建一個文件夾。 2.InputStream(OutputStream)和Reader(Writer)的區(qū)別在于字節(jié)和字符,對于非標準ASCII 編碼(占用兩個字節(jié)的字符)字節(jié)流會出現(xiàn)亂碼。 3.使用bufferedIO是為了readline()方法和write(s),s是一個字符串。而且 bufferedinPutStream有mark和reset方法。 4.InputStreamReader和OutputStreamWriter可以把字節(jié)流轉換為字符流。 InputStreamReader需要和InputStream套接。OutputStreamWriter需要和OutputStream套接。OutputStreamWriter可以寫一個字符串。還有一個典型的應用就是在于對于System.in的處理。 InputStreamReaderisr = newInputStreamReader(System.in); BufferedReaderbr = newBufferedReader(isr); System.in是一個InputStream的子類,需要把它改成InputStreamReader然后使用BufferedReader讀出每行的內容。 5.DataInputStream,DataOutputStream是用來對付原始的數(shù)據(jù)類型,比如int,long,double,float 和UTF。 6.ByteArrayInputStream和ByteArrayOutputStream在內存中創(chuàng)建一個字節(jié)數(shù)組。 import java.io.*; publicclassTestDataStream { publicstaticvoid main(String[] args){ ByteArrayOutputStreambaos = newByteArrayOutputStream();//在內存中創(chuàng)建了一個內存字節(jié)數(shù)組,并對上一個管道baos DataOutputStream dos = newDataOutputStream(baos);//使用DataOutputStream是為了使用writeDouble,writeBoolean等方法 try { dos.writeDouble(Math.random());//在字節(jié)數(shù)組當中寫入8個字節(jié)的double類型的數(shù)字 dos.writeBoolean(true);//在字節(jié)數(shù)組中寫入一個boolean類型的true,占用1個字節(jié) ByteArrayInputStreambais = newByteArrayInputStream(baos.toByteArray());//bais也對到由baos對應的內存字節(jié)數(shù)組 System.out.println(bais.available());//內存數(shù)組當中有多少字節(jié)可用(也就是說被寫入了多少個字節(jié)的內容) DataInputStream dis = newDataInputStream(bais);//使用DataInputStream是為了使用readDouble,readBoolean等方法 System.out.println(dis.readDouble());//先寫進去的東西要先讀是隊列 System.out.println(dis.readBoolean());//后寫進去的東西要后讀 dos.close(); dis.close(); } catch(IOException e){ e.printStackTrace(); } } } 7.PipedInputStream和PipedOutputStream是管道流,用于線程間的通信。一個線程的PipedInputStream對象必須從另一個線程的PipedOutputStream對象讀取輸入。要使用管道流,必須同時構造管道輸入流和輸出流。 8.Print流就只有輸出流,沒有輸入流。 Print流不會拋異常,而且都會自動flush。 System.setOut(ps);//修改系統(tǒng)輸出的位置 9.Object流和序列化問題 將對象轉換為字節(jié)流并保存起來(文件,磁盤,網絡),這種機制叫做對象序列化。并在日后還原這個對象,這種機制叫對象的反序列化。將一個對象保存到永久存儲設備上稱為持續(xù)性。 使用ObjectOutputStream和ObjectInputStream來專門用來把一個object寫入或者讀出硬盤上。(常用于游戲存盤?)其做法是把整個的object寫入磁盤或者讀出。 當一個對象被序列化時,只保存對象的非靜態(tài)成員變量,不能保存任何的成員方法和靜態(tài)的成員變量。如果一個對象的成員變量是一個對象,那么這個對象的數(shù)據(jù)成員也會被保存。 為了把一個類的對象寫到硬盤或者網絡,就必須實現(xiàn)serializable接口或Externalizable接口。區(qū)別是在于和Externalizable(外部化)是接口是抽象方法,必須被實現(xiàn)。而Serializable(序列化)是一個標示形接口,也就是說,這樣的接口是沒有方法。Java當中還有很多這樣的接口。但是我們必須實現(xiàn)這個接口,這個接口的意義是在于讓java編譯器知道這個該類需要實現(xiàn)了這個功能。要注意,如果該類沒有實現(xiàn)這個接口,會拋出一個NotSerializableException。 有的時候,一個可序列化的對象包含對某個不可序列化的對象的引用,那么整個序列化操作將會失敗,并且會拋出一個NotSerializableException。為了解決這個問題,可以將這個引用標記為transient,那么對象仍然可以序列化。也就是說,transient修飾的成員變量在序列化的時候,是不給予考慮的,也就是說被transient修飾的內容是不會被保存的。 Externalizable接口當中有兩個抽象方法,必須被實現(xiàn).第五篇:08 Java當中的輸入輸出流的學習筆記 基本IO