『壹』 java 什麼叫刷新流的緩沖
流是計算機中用於在兩個設備或者庫之間傳遞數據的形式。
以計算機打開一個文檔並顯示出來為例:
文檔實際上是由很多字元構成的集合,而且這些字元間是有順序的。當你打算打開它的時候,計算機要從硬碟上讀取到文件,然後一行一行傳給顯示設備。你可以想像,系統從文件中由起始位置開始不斷取出數據,像水一樣通過管道流到顯示設備這里。這就是流,確切說這一個是文件流。那麼你想,既然流動,就需要管道。我們說管道就是緩沖區。實際上就是將數據先讀取到緩沖區,然後顯示設備從緩沖區中讀取數據。這個概念懂了,咱們說下面的。
顯示設備獲取數據通常是等緩沖區被填滿以後。但是實際上有些時候我們單次想傳遞的數據並沒有緩沖區這么大,那麼就需要刷新一下緩存,強制將緩存中的流數據推到顯示設備中。
不懂了可以繼續追問
『貳』 Java 多位元組文件流
你樓上那個會不會啊?你這個是文件輸入流,哪來的length?有什麼用》?我知道有length 那個是位元組大小,循環遍歷是read--------看資料
*
例子:通過位元組輸入流讀取文件信息
*
1、創建位元組輸入流對象
*
InputStream in = new FileInputStream("d:\\\\aa.txt");
*
2、創建位元組數組作為從流中讀取數據的容器
*
byte[] bs = new byte[1024];
*
3、循環從流中讀取數據
*
while(in.read(bs)!=-1){
*
你要進行的數據操作
*
}
*
4、關閉位元組輸入流
*
in.close();
*
*
緩存流:給流操作提供緩存器,提高效率
*
創建緩存流對象的語法:
*
InputStream in = new FileInputStream("d:\\\\aa.txt");
*
BufferedInputStream bis = new BufferedInputStream(in);
---不是說循環length是大小,read是讀取輸出,多練就明白了
import java.io.*;
public class Ztext {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//創建文件對象
File fs=new File("D:/fs.txt");
FileInputStream fis=null;
try {
//從文件讀取到內存
fis=new FileInputStream(fs);
//定義位元組數組,以1024為單位讀取,可改
byte[] bs = new byte[1024];
//得到實際讀取到的位元組數,因為事先不知道文件大小
//當為-1的時候跳出死循環
int n = 0;
while((n=fis.read(bs))!=-1){
//把位元組轉成String 這樣可以在控制台輸出
String s=new String(bs,0,n);
//可以看看read幫助文檔,n代表實際讀取
System.out.println(s);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
-----------------下面是輸入到文件-------------------------
import java.io.*;
public class Ztext {
/**
* @param args
*/
public static void main(String[] args) {
File f=new File("d:/fs.txt");
FileOutputStream fs=null;
try{
fs=new FileOutputStream(f);
String s="字元串可從其他地方獲得";
//
byte [] bs=new byte[1024];
fs.write(s.getBytes());
System.out.println("成功輸入字元到文件");
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
try {
fs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
--從一個txt文件讀取到另一個txt文件
import java.io.*;
public class Ztext {
/**
* @param args
*/
public static void main(String[] args) {
File f1=new File("d:/fs.txt");
File f2=new File("d:/ss.txt");
FileInputStream fin=null;
FileOutputStream fs=null;
try{
//從fs讀取到內存再從內存write到ss
fin=new FileInputStream(f1);
fs=new FileOutputStream(f2);
byte [] bs=new byte[1024];
int n=0;
while((n=fin.read(bs))!=-1){
fs.write(bs);
}
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
try {
fin.close();
fs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
--如果你希望輸入到文件回車換行可以加\\t\
--最後,後面還有字元對象流不多講,自己慢慢學,包自己引啊
『叄』 GHOST 中英文對照表
Ghost的命令行參數一覽表
/?或/H: 查看幫助。
-CLONE:克隆。
-IA:對所有分區中的扇區進行映象。
-ID:對整個磁碟(包括未分區空間)進行復制。
-IR:和ID一樣,但不將分區調整為扇區界限。
-IB:只復制磁碟的啟動扇區。
-IAL:對LINUX分區�
-OR:覆蓋空間並進行完整性檢查。
-NOLILO:復制後不要試圖去修正LILO啟動調入器。
-BOOTCD:當使用-SURE直接製作CD-R映象時,期望找到可啟動軟盤。
-FDSZ:清除目標磁碟上的標志性位元組。
-FDSP:保留目標磁碟上的標志性位元組。(優先順序高於-FSSZ)
-LPM:LPT主並行連接模式。
-LPS:LPT從並行連接模式。
-TCPM:TCP/IP主連接模式。
-TCPS:TCP/IP從連接模式。
-USBM:自動進入USB主模式。
-USBS:自動進入USB從模式。
-JL:記錄多點傳送會話診斷消息到文件。
-JS:設置最大的多點傳送值。
-JA:設置多點傳送會話的名稱。
-AUTO:不要提示輸入文件名,使用默認值。
-CHKIMG:檢查映象文件的完整性。
-PWD:指定密碼。
-SKIP:指定需要跳過的FAT文件系統中的文件或目錄。
-PMBR:當進行任何磁碟復制操作時,保留目標磁碟中的主引導記錄。
-SPAN:允許存取多個卷。
-SPLIT:當創建映象時將映象分成數塊。
-Z:壓縮映象文件。
-F64:當調入舊映象文件時允許64K的簇大小。
-FATLIMIT:防止FAT分區大小超過2兆。
-F32:將FAT16轉換為FAT32。
-NTD:允許NTFS內部診斷檢查。
-NTC-:禁止NTFS連續簇分配。
-NTCHKDSK:強制CHKDSK在下一個NTFS卷啟動。
-NTIC:忽略NTFS卷上的CHKDSK位。
-NTIL:忽略非空的NTFS日誌文件檢查位。
-NTIID:忽略分區系統標識符的復制。
-TAPEBUFFERED:默認的磁帶模式。
-TAPESAFE:當使用舊的或不可靠的磁帶時有用。
-TAPESPEED:允許控置磁帶速度。
-TAPEUNBUFFERED:強制非緩沖的磁帶輸入輸出。
-TAPEEJECT:強制磁帶操作完後彈出。
-TAPEBSIZE:磁帶塊大小。
-RB:強制復制完成後自動重新啟動。
-FX:當完成復制後退出程序。
-QUIET:安靜模式。
-SURE:和-CLONE選項一起使用來避免提問。
-BATCH:批處理模式,一切操作由程序自動完成。
-NOFILE:禁止文件詢問。
-SCRIPT:自動按照腳本文件中的命令來運行程序。
-DL:指定存在的硬碟號。
-FIS:使用檢測出的硬碟最大值。
-FNX:禁止擴展13號中斷支持。
-FFX:使用擴展13號中斷。
-FNI:禁止直接IDE硬碟存取支持。
-FFI:使用直接IDE硬碟存取。
-FNS:禁止直接ASPI/SCSI硬碟存取支持。
-FFS:使用直接ASPI/SCSI硬碟存取。
-NOSCSI:禁止使用ASPI存取SCSI設備。
-BFC:處理壞的FAT
-VDM:寫入前使用使用磁碟校驗命令來檢查磁碟上的每個扇區。
-FRO:強制即使有壞的簇也繼續復制。
-CRC32:使用CRC32校驗。
-CRCIGNORE:盡量忽略映象文件中的錯誤。
-FCR:當建立文件時創建校驗文件。
-AFILE:使用指定的中止記錄文件。
-DI:顯示診斷。
-MEMCHECK:診斷內存。
-DD:記錄磁碟信息到GHSTSTAT.TXT。
-DFILE:使用指定的信息日誌文件。
-FINGER:顯示詳細的指紋信息。
-VER:顯示程序版本號。
『肆』 java中date=fis.read())!=-1什麼意思
fis應該是FileInputStream的對象。這個涉及IO操作
fis按位元組讀取某個文件裡面的內容(這種情況是是一個位元組一個位元組的讀取,所以你這句話應該是在一個循環里),當讀到最後的時候,就會返回-1。
所以如果這是在一個循環裡面話,(比如(while(date=fis.read())!=-1)))所以date=fis.read())!=-1表示一個位元組一個位元組讀這個文件,讀到最後一個停止。
『伍』 java字元流的緩存區問題,急
flush應該是刷新緩沖區,也就是緩沖區有一個固定的大小,如果沒有達到那個值而又沒有加flush是不會及時顯示到屏幕的,也就是說其實你read是成功了的,這是我的理解
『陸』 java中 while ((rs = fis.read(data)) > 0) { dataStr += new String(data, 0, rs); }為何是讀取輸入流
private static void loadConfig() {
try {
if (!file.exists()) //判斷file 文件路徑是否存在
file.createNewFile(); //如果不存在,則創建file文件的路徑
byte[] data = new byte[64]; //創建一個byte數組,長度為64位
FileInputStream fis = new FileInputStream(file); //創建一個文件的輸入流,從file中讀取該文件
int rs = 0;
while ((rs = fis.read(data)) > 0) { //把fis流文件以每次最大64的長度寫入byte數組中,每次寫入的長度為rs,當fis文件寫完時,rs會返回-1即,這里的判斷會改為 -1 <0從而表示這個文件讀取完了退出該while循環
dataStr += new String(data, 0, rs); //把讀取的byte數組以從0開始到rs長度的方式轉換成字元串追加到dataStr中,注意這里的data是每次循環是從流文件中讀取出來的數據,每次都會不一樣,舉個例子,file 是讀取的一個內容為123456789的txt文件,而64位byte每次讀取四位長度(這里是例子,實際不是這么長),那麼你讀取這個文件會循環3次,第一次取出1234放入data中, 把data 加入到dataStr 後,第二次取出5678放入data中, 把data 加入到dataStr 後,第三次取出9放出到dataStr 中, 這里你的流文件全部取完,當第四次循環時rs取不出流文件了,會變成-1從而退出while
}
if (!(dataStr=="")) {
String[] sets = dataStr.split(",");
runCount = Integer.parseInt(sets[0]);
date = sets[1];
os = sets[2];
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
以上是關鍵代碼的注釋,寫的很詳細了,不懂的再來問我
『柒』 java中關於文件創建的問題
問題出在你代碼初始順序上
這是修改後的代碼
/*
* 功能
* 演示FileOutStream
* 實現文件的復制粘貼功能
*
*/
import java.io.*;
import java.util.*;
public class OutputStream {
public static void main(String[] args) {
OutputStream ops = new OutputStream();
ops.start();
}
// 構造函數
OutputStream() {
f_r = new File("D:\\eclipse\\11.txt");
f_w = new File("D:\\eclipse\\22.txt");
}
// 開始
void start() {
// 判斷被復制的文件是否存在
if (f_r.exists()) {
// 判斷用於粘貼的文件是否存在
if (!f_w.exists()) {// 不存在則創建
try {
System.out.println("創建文件!");
f_w.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
fos = new FileOutputStream(f_w);
fis = new FileInputStream(f_r);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
r = new Read(fis);
w = new Write(fos, r);
System.out.println("開始進行復制粘貼操作!");
// 復制
r.readTo();
// 粘貼
w.toWrite();
System.out.println("操作完成!");
try {
System.out.println(" 關閉文件!");
fos.close();
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("文件不存在!");
}
}
private FileOutputStream fos = null;
private FileInputStream fis = null;
private File f_r = null;// 寫入
private File f_w = null;// 讀取
private Read r = null;
private Write w = null;
}
// 將數據讀出給內存
class Read {
Read(FileInputStream fis) {
this.fis = fis;
st = new Vector<String>();
}
void readTo() {
// 創建緩存
byte b[] = new byte[1024];
// 創建n記錄獲取數據長度
int n = 0;
try {
// 每次讀出1024byte數據
while ((n = fis.read(b)) != -1) {
// 數據轉換byte->string
String s = new String(b, 0, n);// 將數據轉換為String加入集合
st.add(s);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Vector<String> st = null;
private FileInputStream fis = null;
}
// 數據從內存寫入
class Write {
Write(FileOutputStream fos, Read r) {
this.fos = fos;
this.r = r;
}
void toWrite() {
// 創建緩存
byte b[] = new byte[1024];
// 創建n記錄獲取數據長度
int n = 0;
for (int i = 0; i < r.st.size(); i++) {
// 獲取數據
String s = r.st.get(i);
// 數據轉換String->byte
b = s.getBytes();
// 將數據寫入文件
try {
fos.write(b);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Read r = null;
private FileOutputStream fos = null;
}
『捌』 java後台返回的zip文件損壞,本地緩存中創建的zip是好使的
額,你使用response獲取outpustream ous,使用ous作為參數實例化ZipOutputStream zos,然後直接使用zos寫入不行嗎?
『玖』 什麼是NCQ謝謝!
NCQ是屬於SATA 300規范中的一條,相信看過《揭穿謊言!解析市面上所謂的S-ATA 2》的讀者都了解了這一點,它是一項提升硬碟性能的技術,筆者下面來具體解釋它。
我們知道硬碟和內存不同,硬碟結構上有很大部分是機械的,其性能一定受到機械部件特性比如馬達轉速等等的影響,所以硬碟速度始終只能慢慢提高。
我們的硬碟是怎麼寫數據的?其過程很簡單,從磁碟的最外圈開始往內圈寫,一個圈叫做一個磁軌track,所有碟(platter,即平時說的單碟),面(一個碟可能有兩個面)上同一磁軌組成一個柱面(cylinder),寫硬碟就是按照從外到里一點點順序寫的。可惜我們讀取的時候肯定不是按照這樣的順序的,我們一般是隨機的讀取分散在碟片上的數據,我們需要在快速轉動的同時准確定位,可以想像這是多麼不容易。
上圖中暗紅的是就是一個磁軌(track),黃色的是扇區(sector)。
要精確定位,我們會遇到兩個敵人:尋道延遲和轉動延遲。
尋道延遲是磁頭找到磁軌的時間。我們可以想像一下磁頭反復地在一個個同心圓之間伸長,縮短,其延遲就是尋道延遲,或者在硬碟技術參數中稱為尋道時間。
要減少尋道時間,一般的做法就是對任務的重新排序。因為如果我們的定位任務按照先來後到的順序依次進行,那延遲肯定很大。這里可以舉一個很好理解的例子。如果3個人同時乘電梯,A先按按鈕要到10樓,B要到5樓,C到15樓,如果按照先按先送的順序,電梯先到10樓,再下來到5樓,又上去到15樓,顯然浪費了很多時間,而正常的順序是從下往上的順序排列的,這個例子很普通,但是可能大家乘電梯的時候從來不會考慮到吧:)當然尋道時間的優化比這個復雜得多,演算法也聰明得多。
轉動延遲是找到准確磁軌後,那個正確的地址所在位置轉到磁頭下面的時間。這里我們可以想像轉得越快,這個時間就越短,對5400轉硬碟,轉一圈要11.1毫秒,7200轉要8.3毫秒,而萬轉硬碟只要6毫秒。
要減少轉動延遲,一般的辦法是提高轉速,但是我們知道提高轉速很難,否則我們不會到現在還在用7200轉的硬碟。除了這個辦法還有1.優化排序2.亂序執行。
兩個延遲加起來就是我們遇到的總延遲,我們希望總延遲越小越好。以前的做法是優化排序任務從而減少尋道時間,但是後來發現追求最小尋道時間會導致轉動延遲變大,兩者相加不一定是最小的。所以提出了一種綜合考慮尋道和轉動的優化方法,這種方法就稱為「tagged command queuing」,而在SATA 300標准中使用的特殊的優化方法就叫做「Native Command Queuing」,就是NCQ。
總算說到NCQ了,相信這樣解釋下來大家一定清楚它就是一種從尋道和轉動兩方面考慮的,目的在於減少總延遲的優化演算法。關於TCQ和NCQ的具體區別和NCQ具體怎麼操作就略過了,需要的可以查白皮書。SATA 300規范還引入3種新技術保證NCQ的效率。
Race-Free Status Return
在PATA里,如果控制器沒有對硬碟發出下一個命令,硬碟是不能發回之前命令的執行狀態的,這會造成額外的延遲。為此,SATA 300免除了這項限制,允許各硬碟端可以隨時報告命令執行狀態,所以命令執行完畢信息的回報可以達成高度的管道化,甚至做到數個命令同時回傳的程度。
Interrupt Aggregation
在DMA傳輸模式下,硬碟通知傳輸結束,會引起一個中斷(Interrupt),造成延遲。所以SATA 300提供中斷聚集機制。如果硬碟同時間內完成多組命令,這些命令完成所引起的中斷就可以聚集在一起,大幅減少中斷的數目,這對於降低中斷延遲有極大的貢獻。
First Party DMA(FPDMA)
當PATA的硬碟准備要傳輸資料時,會發出中斷訊號告知控制器,然後控制器對硬碟發出服務命令。當上述動作完成,控制器的驅動程式就進行直接記憶體存取(DMA)通道的設定,這過程會造成不小的延遲。SATA II允許硬碟端自行建立DMA傳輸通道,不需驅動程式介入,通過DMA setup FIS(Frame Information Block)直接對控制器送出需求通知,DMA引擎就可以進行資料傳輸。
我們看到這些技術都是盡量減少了命令在控制器和硬碟之間的延遲,使得NCQ對命令的排序更加有效。
http://www.it.com.cn/f/diy/0411/2/42880_1.htm
『拾』 請問我的程序為啥每次復制文件都會少一點位元組(java代碼如下)
因為while裡面的fis.read()讀了1個
int i;
while((i=fis.read())!=-1){
ops.write(i);
}
一個個讀效率很慢的!