導航:首頁 > 編程語言 > java重新打開流

java重新打開流

發布時間:2023-06-10 23:04:23

A. java操作流的方法

這是一對繼承於InputStream和OutputStream的類,用於本地文件讀寫(二進制格式讀寫並且是順序讀寫,讀和寫要分別創建出不同的文件流對象);
本地文件讀寫編程的基本過程為:
① 生成文件流對象(對文件讀操作時應該為FileInputStream類,而文件寫應該為FileOutputStream類);
② 調用FileInputStream或FileOutputStream類中的功能函數如read()、write(int b)等)讀寫文件內容;
③ 關閉文件(close())。
實例:流文件讀寫
流文件的單元是位元組,所以它不但可以讀寫文本文件,也可以讀寫圖片、聲音、影像文件,這種特點非常有用,因為我們可以把這種文件變成流,然後在網路上傳輸。
問題是有了通用的流文件以後,為什麼還要專門的字元流呢?這是因為文本可以用不同的方式存儲,可以是普通的文本(UTF-8編碼方式),ASCII文本和Unicode文本,字元流對象可以進行必要的轉換,從而讀出正確的文本。
有人認為流文件不能讀寫文本文件,這其實是個誤會,因為文本文件本質上也是由位元組組成的,當然是流文件的一種。作為讀寫文件的全體,這是沒問題的,但是,如果要處理每次讀入的內容,就最好使用字元流。
所以在文本文件處理時,使用字元流是個最常用的方法。
樣例:
import java.io.*;
public class FileStreamDemo {
public static void main(String[] args) throws IOException {
//創建兩個文件,face.gif是已經存在文件,newFace.gif是新創建的文件
File inFile = new File("face.gif");
File outFile = new File("newFace.gif");
//創建流文件讀入與寫出類
FileInputStream inStream = new FileInputStream(inFile);
FileOutputStream outStream = new FileOutputStream(outFile);
//通過available方法取得流的最大字元數
byte[] inOutb = new byte[inStream.available()];
inStream.read(inOutb); //讀入流,保存在byte數組
outStream.write(inOutb); //寫出流,保存在文件newFace.gif中
inStream.close();
outStream.close();
}
}
實例:讀寫任意大文件應用
因為byte數組最大存儲值不超過64M,所以當一個文件大於60M 的時候,需要分開幾個流操作。我們把上面的程序作一個修改,就可以寫入任意大小的文件。這個程序應用了FileInputStream類的方法如下:
read(byte[] b,int off,int len)
把特定位置的流內容讀入數組,已經讀入byte[]數組的內容,會在流文件中刪除。
程序運行的結果會產生一個新文件。
樣例:
import java.io.*;
public class FileStreamDemo2 {
public static void main(String[] args) throws IOException {
//創建兩個文件
File inFile = new File("tcty36.rm");
File outFile = new File("newtcty36.rm");
//最大的流為60Mb,當文件的容量大於60Mb的時候便分開流
final int MAX_BYTE = 60000000;
long streamTotal = 0; //接受流的容量
int streamNum = 0; //流需要分開的數量
int leave = 0; //文件剩下的字元數
byte[] inOutb; //byte數組接受文件的數據
//創建流文件讀入與寫出類
FileInputStream inStream = new FileInputStream(inFile);
FileOutputStream outStream = new FileOutputStream(outFile);
//通過available方法取得流的最大字元數
streamTotal = inStream.available();
//取得流文件需要分開的數量
streamNum = (int)Math.floor(streamTotal/MAX_BYTE);
//分開文件之後,剩餘的數量
leave = (int)streamTotal % MAX_BYTE;
//文件的容量大於60Mb時進入循環
if (streamNum > 0) {
for(int i = 0; i < streamNum; ++i){
inOutb = new byte[MAX_BYTE];
//讀入流,保存在byte數組
inStream.read(inOutb, 0, MAX_BYTE);
outStream.write(inOutb); //寫出流
outStream.flush(); //更新寫出的結果
}
}
//寫出剩下的流數據
inOutb = new byte[leave];
inStream.read(inOutb, 0, leave);
outStream.write(inOutb);
outStream.flush();
inStream.close();
outStream.close();
}
}
六、管道PipedInputStream/PipedOutputStream類:
當需要在兩個線程中讀寫數據的時候,由於線程的並發執行,讀寫的同步問題可能會發生困難,這時候可以使用管道,管道事實上是一個隊列。
管道是由系統維護的一個緩沖區,當然程序員也可以自己直接指定該緩沖區的大小(只需要設置管道流類中的PIPE_SIZE屬性的值)。當生產者生產出數據後,只需要將數據寫入管道中,消費者只需要從管道中讀取所需要的數據。利用管道的這種機制,可以將一個線程的輸出結果直接連接到另一個線程的輸入埠,實現兩者之間的數據直接傳送。
線程1
線程2
臨時文件
管道
1.管道的連接:
方法之一是通過構造函數直接將某一個程序的輸出作為另一個程序的輸入,在定義對象時指明目標管道對象
PipedInputStream pInput=new PipedInputStream();
PipedOutputStream pOutput= new PipedOutputStream(pInput);
方法之二是利用雙方類中的任一個成員函數 connect()相連接
PipedInputStream pInput=new PipedInputStream();
PipedOutputStream pOutput= new PipedOutputStream();
pinput.connect(pOutput);
2.管道的輸入與輸出:
輸出管道對象調用write()成員函數輸出數據(即向管道的輸入端發送數據);而輸入管道對象調用read()成員函數可以讀起數據(即從輸出管道中獲得數據)。這主要是藉助系統所提供的緩沖機制來實現的。
實例:Java的管道的輸入與輸出
import java.io.*;
public class PipedIO //程序運行後將sendFile文件的內容拷貝到receiverFile文件中
{
public static void main(String args[])
{
try
{
//構造讀寫的管道流對象
PipedInputStream pis=new PipedInputStream();
PipedOutputStream pos=new PipedOutputStream();
//實現關聯
pos.connect(pis);
//構造兩個線程,並且啟動。
new Sender(pos,"c:\\text2.txt").start();
new Receiver(pis,"c:\\text3.txt").start();
}
catch(IOException e)
{
System.out.println("Pipe Error"+ e);
}
}
}
//線程發送
class Sender extends Thread
{
PipedOutputStream pos;
File file;
//構造方法
Sender(PipedOutputStream pos, String fileName)
{
this.pos=pos;
file=new File(fileName);
}
//線程運行方法
public void run()
{
try
{
//讀文件內容
FileInputStream fs=new FileInputStream(file);
int data;
while((data=fs.read())!=-1)
{
//寫入管道始端
pos.write(data);
}
pos.close();
}
catch(IOException e)
{
System.out.println("Sender Error" +e);
}
}
}
//線程讀
class Receiver extends Thread
{
PipedInputStream pis;
File file;
//構造方法
Receiver(PipedInputStream pis, String fileName)
{
this.pis=pis;
file=new File(fileName);
}
//線程運行
public void run()
{
try
{
//寫文件流對象
FileOutputStream fs=new FileOutputStream(file);
int data;
//從管道末端讀
while((data=pis.read())!=-1)
{
//寫入本地文件
fs.write(data);
}
pis.close();
}
catch(IOException e)
{
System.out.println("Receiver Error" +e);
}
}
}
七、隨機文件讀寫:RandomAccessFile類
它直接繼承於Object類而非InputStream/OutputStream類,從而可以實現讀寫文件中任何位置中的數據(只需要改變文件的讀寫位置的指針)。
編程步驟:
① 生成流對象並且指明讀寫類型;
② 移動讀寫位置;
③ 讀寫文件內容;
④ 關閉文件。
另外由於RandomAccessFile類實現了DataOutput與DataInput介面,因而利用它可以讀寫Java中的不同類型的基本類型數據(比如採用readLong()方法讀取長整數,而利用readInt()方法可以讀出整數值等)。
程序實例:
利用隨機數據流RandomAccessFile類來實現記錄用戶在鍵盤的輸入,每執行一次,將用戶的鍵盤輸入存儲在指定的UserInput.txt文件中。
import java.io.*;
public class RandomFileRW
{
public static void main(String args[])
{
StringBuffer buf=new StringBuffer();
char ch;
try
{
while( (ch=(char)System.in.read()) !='\n')
{
buf.append(ch);
}
//讀寫方式可以為"r" or "rw"
RandomAccessFile myFileStream=new RandomAccessFile("c:\\UserInput.txt","rw");
myFileStream.seek(myFileStream.length()) ;
myFileStream.writeBytes(buf.toString());
//將用戶從鍵盤輸入的內容添加到文件的尾部
myFileStream.close();
}
catch(IOException e)
{
}
}
}
八、DataInput/DataOutput介面:
實現與機器無關的各種數據格式讀寫(如readChar() 、readInt()、readLong()、readFloat(),而readLine()將返回一個String)。其中RandomAccessFile類實現了該介面,具有比FileInputStream或FileOutputStream類更靈活的數據讀寫方式。

B. java 文件保存與打開

可以通過「FileOutputStream」創建文件並保存,舉例:
OutputStreamWriter pw = null;//定義一個流
pw = new OutputStreamWriter(new FileOutputStream(「D:/test.txt」),"GBK");//確認流的輸出文件和編碼格式,此過程創建了「test.txt」
pw.write("我是要寫入到記事本文件的內容");//將要寫入文件的內容,可以多次write
pw.close();//關閉流
bre = new BufferedReader(new FileReader("D:/test.txt"));//此時獲取到的bre就是整個文件的緩存流
while ((str = bre.readLine())!= null) // 判斷最後一行不存在,為空結束循環
{
System.out.println(str);//原樣輸出讀到的內容
};
bre .close();//關閉流
備註:文件流用完之後必須及時通過close方法關閉,否則會一直處於打開狀態,直至程序停止,增加系統負擔。

C. 如何刷新輸入流 java

FileWriter fw = new FileWriter(filePath);// 創建文件字元輸出流

內 BufferedWriter bw = new BufferedWriter(fw); // 使用緩沖數據容流封裝輸出流

bw.write(res.toString()); // 寫入數據到輸出流

bw.newLine(); // 寫入換行符

bw.flush(); // 刷新緩沖區

bw.close(); //關閉BufferedWriter

fw.close(); //關閉FileWriter

閱讀全文

與java重新打開流相關的資料

熱點內容
dede工具 瀏覽:507
5g網盟app怎麼下載 瀏覽:486
微信備份老是連接中斷 瀏覽:886
出台多少份文件 瀏覽:380
鞋子怎麼搭配衣服的app 瀏覽:755
文件名使用的通配符的符號是什麼 瀏覽:916
lol分卷文件損壞怎麼辦 瀏覽:276
6分管車螺紋怎麼編程 瀏覽:732
海口農商銀行信用卡app是什麼 瀏覽:770
win10任務欄文件夾我的電腦 瀏覽:14
安卓nba2k18 瀏覽:776
文件夾密碼怎麼修改密碼 瀏覽:271
蘋果數據中心用什麼伺服器 瀏覽:769
省內圓通快遞寄文件夾需要多少錢 瀏覽:740
iphone程序加密 瀏覽:884
win10文件夾調整文件行高 瀏覽:681
創意手繪教程 瀏覽:754
微信刪除帳號信息 瀏覽:596
mysql操作類文件 瀏覽:649
繞過xp密碼 瀏覽:158

友情鏈接