為什麼要用文件輸入流
『壹』 文件輸入流疑惑
當然不是異常了.
package wjf;
import java.io.*;
public class Fis
{
public static void main(String[] args) throws Exception
{
FileInputStream fis=new FileInputStream("Fis.java");
byte[] b=new byte[100];
int c;
while((c=fis.read(b))!=-1)
{
System.out.println("c="+c);
}
}
}
列印結果如下:
c=100
c=100
c=88.
查查API,自己理解一下才行.
『貳』 用Java和上傳文件到資料庫 上傳時只用到了輸入流 為啥下載時用到了輸入流和輸出流
代碼如下:importjava.io.*;/***復制文件夾或文件夾*/publicclassCopyDirectory{//源文件夾staticStringurl1="f:/photos";//目標文件夾staticStringurl2="d:/tempPhotos";publicstaticvoidmain(Stringargs[])throwsIOException{//創建目標文件夾(newFile(url2)).mkdirs();//獲取源文件夾當前下的文件或目錄File[]file=(newFile(url1)).listFiles();for(inti=0;i
『叄』 到底什麼時候用輸入流,什麼時候用輸出流
打開外文件使用輸入流,
保存文件到磁碟輸出流。
『肆』 java 為什麼用文件輸入流寫97進去,文件中卻顯示的是a
你這個不是輸入流,你這個叫輸出流好不好?
方向是根據內存來判定的,從內存寫入到硬碟,就是輸出流;從硬碟寫到內存,就是輸入流;
首先,97轉成二進制,1100001,交給虛擬機-操作系統調用方法寫入到你這個構造方法指定的位置。由於常用編輯器會在打開的時候,將位元組轉換為字元顯示,1-127之間的會查詢ASCII碼表,會顯示為a,其它值則查詢系統默認的碼表,如果是中文,則查詢gbk碼表。
如果你要寫入97,可以將97轉換為String類型,調用getbytes()方法得到一個數組,寫入就行
『伍』 圖書管理系統c++為什麼要用到文件輸出流
掌握輸入/輸出流
在這一章里,我會提及一些有用的函數。我將為你演示如何打開一個可以同時進行讀、寫操作的文件;此外,我還將為你介紹其它打開文件的方法,以及如何判斷打開操作是否成功。因此,請接著往下讀!
到目前為止,我已為你所展示的只是單一的打開文件的途徑:要麼為讀取而打開,要麼為寫入而打開。但文件還可以以其它方式打開。迄今,你應當已經認識了下面的方法:
ifstream OpenFile(「cpp-home.txt」);
噢,這可不是唯一的方法!正如以前所提到的,以上的代碼創建一個類ifstream的對象,並將文件的名字傳遞給它的構造函數。但實際上,還存在有不少的重載的構造函數,它們可以接受不止一個的參數。同時,還有一個open()函數可以做同樣的事情。下面是一個以上代碼的示例,但它使用了open()函數:
ifstream OpenFile;
OpenFile.open(「cpp-home.txt」);
你會問:它們之間有什麼區別嗎?哦,我曾做了不少測試,結論是沒有區別!只不過如果你要創建一個文件句柄但不想立刻給它指定一個文件名,那麼你可以使用open()函數過後進行指定。順便再給出一個要使用open()函數的例子:如果你打開一個文件,然後關閉了它,又打算用同一個文件句柄打開另一個文件,這樣一來,你將需要使用open()函數。
考慮以下的代碼示例:
#include <fstream.h>
void read(ifstream &T) //pass the file stream to the function
{
//the method to read a file, that I showed you before
char ch;
while(!T.eof())
{
T.get(ch);
cout << ch;
}
cout << endl << "--------" << endl;
}
void main()
{
ifstream T("file1.txt");
read(T);
T.close();
T.open("file2.txt");
read(T);
T.close();
}
據此,只要file1.txt和file2.txt並存儲了文本內容,你將看到這些內容。
現在,該向你演示的是,文件名並不是你唯一可以向open()函數或者構造函數(其實都一樣)傳遞的參數。下面是一個函數原型:
ifstream OpenFile(char *filename, int open_mode);
你應當知道filename表示文件的名稱(一個字元串),而新出現的則是open_mode(打開模式)。open_mode的值用來定義以怎樣的方式打開文件。下面是打開模式的列表:
名稱
描述
ios::in
打開一個可讀取文件
ios::out
打開一個可寫入文件
ios::app
你寫入的所有數據將被追加到文件的末尾,此方式使用ios::out
ios::ate
你寫入的所有數據將被追加到文件的末尾,此方式不使用ios::out
ios::trunk
刪除文件原來已存在的內容(清空文件)
ios::nocreate
如果要打開的文件並不存在,那麼以此參數調用open()函數將無法進行。
ios::noreplace
如果要打開的文件已存在,試圖用open()函數打開時將返回一個錯誤。
ios::binary
以二進制的形式打開一個文件。
實際上,以上的值都屬於一個枚舉類型的int常量。但為了讓你的編程生涯不至於太痛苦,你可以像上表所見的那樣使用那些名稱。
下面是一個關於如何使用打開模式的例子:
#include <fstream.h>
void main()
{
ofstream SaveFile("file1.txt", ios::ate);
SaveFile << "That's new!\n";
SaveFile.close();
}
正如你在表中所看到的:使用ios::ate將會從文件的末尾開始執行寫入。如果我沒有使用它,原來的文件內容將會被重新寫入的內容覆蓋掉。不過既然我已經使用了它,那麼我只會在原文件的末尾進行添加。所以,如果file1.txt原有的內容是這樣:
Hi! This is test from www.cpp-home.com!
那麼執行上面的代碼後,程序將會為它添上「That』s new!」,因此它看起來將變成這樣:
Hi! This is test from www.cpp-home.com!That』s new!
假如你打算設置不止一個的打開模式標志,只須使用OR操作符或者是 ,像這樣:
ios::ate ios::binary
我希望現在你已經明白「打開模式」是什麼意思了!
現在,是時候向你展示一些真正有用的東西了!我敢打賭你現在還不知道應當怎樣打開一個可以同時進行讀取和寫入操作的文件!下面就是實現的方法:
fstream File(「cpp-home.txt」,ios::in ios::out);
實際上,這只是一個聲明語句。我將在下面數行之後給你一個代碼示例。但此時我首先想提及一些你應當知道的內容。
上面的代碼創建了一個名為「File」的流式文件的句柄。如你所知,它是fstream類的一個對象。當使用fstream時,你應當指定ios::in和ios::out作為文件的打開模式。這樣,你就可以同時對文件進行讀、寫,而無須創建新的文件句柄。噢,當然,你也可以只進行讀或者寫的操作。那樣的話,相應地你應當只使用ios::in或者只使用ios::out —— 要思考的問題是:如果你打算這么做,為什麼你不分別用ifstream及ofstream來實現呢?
下面就先給出示例代碼:
#include <fstream.h>
void main()
{
fstream File("test.txt",ios::in ios::out);
File << "Hi!"; //將「Hi!」寫入文件
static char str[10]; //當使用static時,數組會自動被初始化
//即是被清空為零
File.seekg(ios::beg); // 回到文件首部
// 此函數將在後面解釋
File >> str;
cout << str << endl;
File.close();
}
OK,這兒又有一些新東西,所以我將逐行進行解釋:
fstream File(「test.txt」, ios::in ios::out); —— 此行創建一個fstream對象,執行時將會以讀/寫方式打開test.txt文件。這意味著你可以同時讀取文件並寫入數據。
File << 「Hi!」; —— 我打賭你已經知道它的意思了。
static char str[10]; —— 這將創建一個容量為10的字元數組。我猜static對你而言或者有些陌生,如果這樣就忽略它。這只不過會在創建數組的同時對其進行初始化。
File.seekg(ios::beg); —— OK,我要讓你明白它究竟會做些什麼,因此我將以一些有點兒離題、但挺重要的內容開始我的解釋。
還記得它么:
while(!OpenFile.eof())
{
OpenFile.get(ch);
cout << ch;
}
你是不是曾經很想知道那背後真正執行了什麼操作?不管是或不是,我都將為你解釋。這是一個while型循環,它會一直反復,直至程序的操作到達文件的尾端。但這個循環如何知道是否已經到了文件末尾?嗯,當你讀文件的時候,會有一個類似於「內置指針(inside-pointer)」的東西,它表明你讀取(寫入也一樣)已經到了文件的哪個位置,就像記事本中的游標。而每當你調用OpenFile.get(ch)的時候,它會返回當前位置的字元,存儲在ch變數中,並將這一內置指針向前移動一個字元。因此下次該函數再被調用時,它將會返回下一個字元。而這一過程將不斷反復,直到讀取到達文件尾。所以,讓我們回到那行代碼:函數seekg()將把內置指針定位到指定的位置(依你決定)。你可以使用:
ios::beg —— 可將它移動到文件首端
ios::end —— 可將它移動到文件末端
或者,你可以設定向前或向後跳轉的字元數。例如,如果你要向定位到當前位置的5個字元以前,你應當寫:
File.seekg(-5);
如果你想向後跳過40個字元,則應當寫:
File.seekg(40);
同時,我必須指出,函數seekg()是被重載的,它也可以帶兩個參數。另一個版本是這樣子的:
File.seekg(-5,ios::end);
在這個例子中,你將能夠讀到文件文本的最後4個字元,因為:
1)你先到達了末尾(ios::end)
2)你接著到達了末尾的前五個字元的位置(-5)
為什麼你會讀到4個字元而不是5個?噢,只須把最後一個看成是「丟掉了」,因為文件最末端的「東西」既不是字元也不是空白符,那隻是一個位置(譯註:或許ios::end所「指」的根本已經超出了文件本身的范圍,確切的說它是指向文件最後一個字元的下一個位置,有點類似STL中的各個容器的end迭代點是指向最後一個元素的下一位置。這樣設計可能是便於在循環中實現遍歷)。
你現在可能想知道為什麼我要使用到這個函數。呃,當我把「Hi」寫進文件之後,內置指針將被設為指向其後面……也就是文件的末尾。因此我必須將內置指針設迴文件起始處。這就是這個函數在此處的確切用途。
File >> str; —— 這也是新鮮的玩意兒!噢,我確信這行代碼讓你想起了cin >> .實際上,它們之間有著相當的關聯。此行會從文件中讀取一個單詞,然後將它存入指定的數組變數中。
例如,如果文件中有這樣的文本片斷:
Hi! Do you know me?
使用File >> str,則只會將「Hi!」輸出到str數組中。你應當已經注意到了,它實際上是將空格作為單詞的分隔符進行讀取的。
由於我存入文件中的只是單獨一個「Hi!」,我不需要寫一個while循環,那會花費更多的時間來寫代碼。這就是我使用此方法的原因。順便說一下,到目前為止,我所使用的讀取文件的
========================
文件拷貝:
void file(const char* src,const char* des)
{
fstream infile(src,ios::binary);
fstream outfile(des,ios::binary); ;
outfile<< infile.rd_buf();
}
『陸』 Java里那個輸入流和輸出流怎麼用
//java中使用文件輸入流和文件輸出流進行文件讀寫的用例!
Java
packagecom.test.io;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
/**
*
*@author亞當愛上java
*用例內容:文件輸入流和文件輸入流結合用例,位元組流方式
*時間:2010-06-20
*注意事項:文件輸入流和文件輸出流都是相對與內存來說的,例如通過程序讀取文件時往內存輸入數據就是文件輸入流
*/
publicclassFileInputOrOutput{
publicstaticvoidmain(String[]args){
//文件或者路徑名的抽象表現形式,意思就是說之後如果進行操作的話就是全部在這個抽象路徑名所指向的文件或者文件加中
Filefile=newFile("e:/test.txt");
Filefile2=newFile("e:/test1.txt");
//文件位元組數的個數
//System.out.println(file.length());
try{
/*------------------------------------------讀操作部分-----------------------------------------------*/
//文件輸入流對象
InputStreamfis=newFileInputStream(file);
//文件輸入流對象所讀取的位元組數大小
//System.out.println(fis.available());
/**
*1.按照一個位元組為單位進行讀取數據,弊端是遇到中文就會把中文的漢字拆開從而出現亂碼
*/
////流對象讀出的返回值是每次所讀到的一個字元所對應的ascii碼值
//inti=fis.read();
//
////如果已經讀到文件尾則i==-1,此時終止循環
//while(i!=-1){
//System.out.print((char)i);
//保證每一次循環都繼續往後讀取一個字元,否則i的值不變會成為死循環
//i=fis.read();
//}
/**
*2.按照一個位元組數組所指定的大小為單位進行讀取,每次最多可以讀取數組定義的大小的位元組個數
*/
//每次讀取都以1K位元組作為單位來進行
byteb[]=newbyte[1024];
//流對象讀出並返回的是每次讀取位元組的個數,最大每次讀取自己數可以和數組b.length相同
//b中存儲了每次所讀取的所有數據
inti=fis.read(b);
Stringstr="";
//如果已經讀到文件尾則i==-1,此時終止循環
while(i!=-1){
//把每次讀取的位元組數組解碼為字元串
//參數1:要解碼為字元的位元組
//參數2:要解碼的首字元的索引
//參數3:要解碼的位元組的個數,如果文件個數大於所設定的一次讀取文件的大小時i的取值就是
//b.length,否則小於數組的位元組大小時則為實際的讀取出自己數的大小
str=str+newString(b,0,i);
//保證每一次都往文件的下一部分進行讀取,否則i值沒有變化會成為死循環
i=fis.read(b);
}
//System.out.print(str);
//關閉輸入流對象
fis.close();
/*------------------------------------------寫操作部分-----------------------------------------------*/
//文件輸出流對象
OutputStreamfos=newFileOutputStream(file2);
//str是從file所指定的文件中讀出的所有內容,將此內容寫入另一個文件中
//將字元解碼為位元組數組
byteb2[]=str.getBytes();
//將解碼後的位元組數組,通過文件輸出流對象寫入到緩沖區中
fos.write(b);
//強制將緩沖區中的內容輸出到文件中
fos.flush();
//關閉輸出流對象
fos.close();
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
『柒』 如何理解輸入流與輸出流概念
東西讀入內存就是輸入流 東西從內存寫到記錄存儲輸出流 而我們本身就以記錄存儲為原點所有會有不解的感覺~ java io流按照java io流的方向可以分為輸入流和輸出流輸入流是將資源數據讀入到緩沖Buffer中,輸出流是將緩沖Buffer中的數據按照指定格式寫出到一個指定的位置,所以這兩個流一般同時使用,才有意義。例如你要做文件的上傳,你要先用輸入流將待上傳文件讀入緩沖,然後用輸出流將文件寫出到網路伺服器的一個位置,則上傳成功;若是文件下載,則先獲得輸入流,來讀取網路伺服器中的一個文件,然後用輸出流寫到本地的一個文件中;還有例如文件的拷貝,也是先用輸入流讀再用輸出流寫出去的很好的例子,你可以先做一個小例子試試,對你理解java io有幫助
『捌』 為什麼要再讀取文件時使用FileinputStream函數
哥們,FileInputStream不是函數,是類。
FileInputStream 從文件系統中的某個文件中獲得輸入位元組。哪些文件可用取決於主機環境。 FileInputStream 用於讀取諸如圖像數據之類的原始位元組流。要讀取字元流,請考慮使用 FileReader。 FileInputStream 包含其他一些輸入流,它將這些流用作其基本數據源,它可以直接傳輸數據或提供一些額外的功能。 FileInputStream 類本身只是簡單地重寫那些將所有請求傳遞給所包含輸入流的 InputStream 的所有方法。 FileInputStream 的子類可進一步重寫這些方法中的一些方法,並且還可以提供一些額外的方法和欄位。
『玖』 這里的System.in是返回的是字元串,為什麼還要用InputStreamReader,這個流不是將位元組轉為字元串嗎
System.in是標准輸入文件的輸入流,類型是InputStream,是個流。至於你說的「返回的是字元串」,你可能理解有誤,你只是通過別的途徑將這個輸入流里的數據讀取成字元串了。
InputSteamReader顧名思義是「輸入流讀取器」,不是「將位元組轉為字元串」。
『拾』 struts2下載文件為什麼提供一個輸入流而不是輸出流。
也有輸出流啊,輸入流是從該文件讀入數據到緩存區中,輸出流是把這些在從緩存區中輸出到你創建的新文件中