iojava
㈠ 請問java中的io是什麼意思呀
io--InputStream,outputStream,是輸入流、輸出流的意思
㈡ java中什麼是IO流
理解Java的IO流,首答先要把視角放在內存上,而不是放在文件上。
InputStream是用來寫入的沒錯,但不是寫入文件中,而是寫入內存中。所以InputStream的作用是從文件中讀取數據然後寫入內存中或者說寫入到正在運行的程序中。
而OutputStream同理,是從內存/程序中將數據推送出去,把數據保存到文件中。
以Java程序作為主視角,你就能懂了。Input讀取是為了讀給程序用,Output寫出是程序把數據輸出到硬碟上了。
㈢ Java NIO與IO的區別和比較
nio是new io的簡稱,從jdk1.4就被引入了,可以說不是什麼新東西了。nio的主要作用就是用來解決速度差異的。舉個例子:計算機處理的速度,和用戶按鍵盤的速度。這兩者的速度相差懸殊。
如果按照經典的方法:一個用戶設定一個線程,專門等待用戶的輸入,無形中就造成了嚴重的資源浪費:每一個線程都需要珍貴的cpu時間片,由於速度差異造成了在這個交互線程中的cpu都用來等待。 在以前的 Java IO 中,都是阻塞式 IO,NIO 引入了非阻塞式 IO。
㈣ JAVA IO中的IO是什麼意思
I是Input,O是Output,IO就是輸入與輸出,Java的輸入機制允許程序讀取外部數據,輸出機制允許程序將程序數據輸出到外部存儲設備
㈤ Java幾種常用的IO寫法與效率比較
Java中經常會用到迭代列表數據的情況,本文針對幾種常用的寫法進行效率比較。雖然網上已經有了類似的文章,但是對他們的結論並不認同。常見的實現方法:1.for循環:for(int i = 0; i < list.size(); i++) for(int i = 0, size = list.size(); i < size; i++) 一般人都會認為第二種寫法效率高。
2.foreach:for(Object obj : list) 這是一種簡潔的寫法,只能對列表進行讀取,無法修改。
3.while:int size = list.size(); while(size-- > 0) 4.迭代:
Object iter = list.iterator(); while(iter.hasNext()) { iter.next(); }測試代碼: 針對以上幾種方法編寫的測試代碼。 public static void main(String[] args) { List list = new ArrayList(); int runTime = 1000;//執行次數 for (int i = 0; i < 1000 * 1000; i++) { list.add(i); } int size = list.size(); long currTime = System.currentTimeMillis();//開始分析前的系統時間 //基本的for for(int j = 0; j < runTime; j++) { for (int i = 0; i < size; i++) { list.get(i); } } long time1 = System.currentTimeMillis(); //foreach for(int j = 0; j < runTime; j++) { for (Integer integer : list) { } } long time2 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) { //while int i = 0 ; while(i < size){ list.get(i++); } } long time3 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) {//普通for循環 for (int i = 0; i < list.size(); i++) { list.get(i); } } long time4 = System.currentTimeMillis(); for(int j = 0; j < runTime; j++) {//迭代 Iterator iter = list.iterator(); while(iter.hasNext()) { iter.next(); } } long time5 = System.currentTimeMillis(); long time = time1 - currTime ; System.out.print("use for:" + time); time = time2 - time1; System.out.print("\tuse foreach:" + time); time = time3 - time2; System.out.print("\tuse while:" + time); time = time4 - time3; System.out.print("\tuse for2:" + time); time = time5 - time4; System.out.print("\tuse iterator:" + time); System.out.println(); }輸出結果(JDK1.6):1.use for:8695 use foreach:17091 use while:6867 use for2:7741 use iterator:14144
2.use for:8432 use foreach:18126 use while:6905 use for2:7893 use iterator:139763.use for:8584 use foreach:17177 use while:6875 use for2:7707 use iterator:14345
結論:1.針對列表的 foreach的效率是最低:耗時是普通for循環的2倍以上。個人理解它的實現應該和iterator相似。2. list.size()的開銷很小:list.size()次數多少對效率基本沒有影響。查看ArrayList的實現就會發現,size()方法的只是返回了對象內的長度屬性,並沒有其它計算,所以只存在函數調用的開銷。對數組的測試:將代碼中的列表list換做數組再進行測試(iterator不適用),發現耗時基本為0。說明:
3. 列表的get()方法開銷不少應該主要是檢測數據合法性時產生的。將執行次數增加100萬倍,這時可以看出結果基本相等,並沒有明顯的差異。說明:4. 數組length也沒有開銷可見數組長度並不是每次執行的時候都要計算的。聯想一下Java創建數組的時候要求必須指定數組的長度,編譯處理的時候顯然沒有把這個值拋棄掉。網上有一篇類似的文章,它居然得出了一個foreach執行效率最高的結論。
㈥ 出現java.io.IOException是怎麼回事
根據報錯信息可知是因為許可權錯誤導致,解決辦法有以下幾種:
1.在AndroidMainfest.xml中添加:
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAG」/>許可權;
2.如果還不行的時候可以試著在AndroidMainfest.xml中添加:
<usespermissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 許可權;
3.注意AndroidMainfest.xml文件中許可權的書寫位置:應該和<application>標簽節點同一級,而不要寫到<application>標簽中,這樣許可權是不會生效的;
4.還有一種異常是我在查資料的時候發現的,有的手機在以磁碟模式連接電腦的時候,手機會暫時失去對sdcard/外存的讀寫許可權,這時打開手機app就會發生這個許可權異常IOException。
㈦ java中的import java.io.*是什麼意思 io具體又是什麼意思
import java.io.* 這個是引用包import java.io.*這個的意思而IO則是輸入輸出流的意思,也就是inputStream,和outputStream這些類的
㈧ java中io的用法
java中關於io流,最終操作還是最底層的InputStream和OutputStream
其它的對象如FileoutPutStream,或者DateoutputStream只是對OutputStream進行封裝,有的是為了方便操作有的是為了加快速度
例如DateoutputStream是為了操作的方便,它實現ObjectOutput介面,可以將某些java的數據類型直接寫到文件或者請求中,然後又可以直接取出來,而不用讀了過後解析
例如讀了兩位元組,轉成String再判斷如果是數字則強轉成int,這裡面就可以直接readInt()相當於一層封裝,還是用了inputString和outputStream,如果你研究一下序列化與反序列化(ObjectOutputStream,ObjectInputStream)你的感受會更深,因為它可以直接將一個對象寫入文件或者請求中,然後讀的時候直接就可以讀出來,這樣用起來非常方便
所以dos=new DataoutputStream(new FileOutputStream(tempfile));
FileOutputStream是將流寫入文件,而DataoutputStream則是為了方便將java基本數據類型直接寫到文件裡面,與直接用FileoutPutStream區別就在於讀該文件的時候前者可以直接讀出int等數據類型,而後者你需要讀了位元組流然後自己解析,得到你想要的值
還有的就是為了加快速度如BufferedInputStream和BufferedOutputStream兩者就是運用緩存,存了多個位元組後一次性寫入或者讀出,這樣加快了讀寫速度。
至於文件編碼,則是在寫的時候如果你沒設編碼則按系統默認編碼來寫,位元組存儲格式和長度不一樣,這些應該在讀文件或者寫的時候就設置好,不論是以位元組寫還是以字元寫,流已經被編碼過了
㈨ java中的IO
import java.io.*;
import java.util.*;
class Test{
private String filename="";
public void writerFile(String filename)throws Exception{
this.filename=filename;
File file=new File(filename);
PrintStream print=new PrintStream(file);
Scanner scanner=new Scanner(System.in);
String in="";
String exit="quit";
System.out.println("開始接收輸入\n");
do{
in=scanner.nextLine();
if(in.toLowerCase().equals(exit)) break;
print.println(in);
}while(true);
scanner.close();
print.close();
return;
}
public void TheFile(String newFilename)throws Exception{
List<String> list=new ArrayList<String>();
String oldFilename=this.filename;
File oldFile=new File(oldFilename);
File newFile=null;
Scanner scanner=new Scanner(oldFile);
PrintStream print=null;
newFile=new File(newFilename);
print=new PrintStream(newFile);
while(scanner.hasNextLine()){
list.add(scanner.nextLine());
}
for(int i=list.size()-1;i>=0;i--){
print.println((String)list.get(i));
}
scanner.close();
print.close();
return;
}
public static void main(String[] str)throws Exception{
Test t=new Test();
String newFilename="2.txt";
t.writerFile("1.txt");
Scanner theFilename=new Scanner(System.in);
t.TheFile(newFilename);
}
}
㈩ Java NIO和IO的區別
JavaNIO和IO之間的主要差別,我會更詳細地描述表中每部分的差異。
IONIO
面向流面向緩沖
阻塞IO非阻塞IO
無選擇器
面向流與面向緩沖
JavaNIO和IO之間第一個最大的區別是,IO是面向流的,NIO是面向緩沖區的。JavaIO面向流意味著每次從流中讀一個或多個位元組,直至讀取所有位元組,它們沒有被緩存在任何地方。此外,它不能前後移動流中的數據。如果需要前後移動從流中讀取的數據,需要先將它緩存到一個緩沖區。JavaNIO的緩沖導向方法略有不同。數據讀取到一個它稍後處理的緩沖區,需要時可在緩沖區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩沖區中包含所有您需要處理的數據。而且,需確保當更多的數據讀入緩沖區時,不要覆蓋緩沖區里尚未處理的數據。
阻塞與非阻塞IO
JavaIO的各種流是阻塞的。這意味著,當一個線程調用read()或write()時,該線程被阻塞,直到有一些數據被讀取,或數據完全寫入。該線程在此期間不能再干任何事情了。JavaNIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什麼都不會獲取。而不是保持線程阻塞,所以直至數據變的可以讀取之前,該線程可以繼續做其他的事情。非阻塞寫也是如此。一個線程請求寫入一些數據到某通道,但不需要等待它完全寫入,這個線程同時可以去做別的事情。線程通常將非阻塞IO的空閑時間用於在其它通道上執行IO操作,所以一個單獨的線程現在可以管理多個輸入和輸出通道(channel)。
選擇器(Selectors)
JavaNIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以注冊多個通道使用一個選擇器,然後使用一個單獨的線程來「選擇」通道:這些通道里已經有可以處理的輸入,或者選擇已准備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。
NIO和IO如何影響應用程序的設計
無論您選擇IO或NIO工具箱,可能會影響您應用程序設計的以下幾個方面:
1.對NIO或IO類的API調用。
2.數據處理。
3.用來處理數據的線程數。
API調用
當然,使用NIO的API調用時看起來與使用IO時有所不同,但這並不意外,因為並不是僅從一個InputStream逐位元組讀取,而是數據必須先讀入緩沖區再處理。
數據處理
使用純粹的NIO設計相較IO設計,數據處理也受到影響。
在IO設計中,我們從InputStream或Reader逐位元組讀取數據。假設你正在處理一基於行的文本數據流,例如:
Name:Anna
Age:25
Email:[email protected]
Phone:1234567890
該文本行的流可以這樣處理:
BufferedReaderreader=newBufferedReader(newInputStreamReader(input));
StringnameLine=reader.readLine();
StringageLine=reader.readLine();
StringemailLine=reader.readLine();
StringphoneLine=reader.readLine();
請注意處理狀態由程序執行多久決定。換句話說,一旦reader.readLine()方法返回,你就知道肯定文本行就已讀完,readline()阻塞直到整行讀完,這就是原因。你也知道此行包含名稱;同樣,第二個readline()調用返回的時候,你知道這行包含年齡等。正如你可以看到,該處理程序僅在有新數據讀入時運行,並知道每步的數據是什麼。一旦正在運行的線程已處理過讀入的某些數據,該線程不會再回退數據(大多如此)。下圖也說明了這條原則:
(JavaIO:從一個阻塞的流中讀數據)而一個NIO的實現會有所不同,下面是一個簡單的例子:
ByteBufferbuffer=ByteBuffer.allocate(48);
intbytesRead=inChannel.read(buffer);
注意第二行,從通道讀取位元組到ByteBuffer。當這個方法調用返回時,你不知道你所需的所有數據是否在緩沖區內。你所知道的是,該緩沖區包含一些位元組,這使得處理有點困難。
假設第一次read(buffer)調用後,讀入緩沖區的數據只有半行,例如,「Name:An」,你能處理數據嗎?顯然不能,需要等待,直到整行數據讀入緩存,在此之前,對數據的任何處理毫無意義。
所以,你怎麼知道是否該緩沖區包含足夠的數據可以處理呢?好了,你不知道。發現的方法只能查看緩沖區中的數據。其結果是,在你知道所有數據都在緩沖區里之前,你必須檢查幾次緩沖區的數據。這不僅效率低下,而且可以使程序設計方案雜亂不堪。例如:
ByteBufferbuffer=ByteBuffer.allocate(48);
intbytesRead=inChannel.read(buffer);
while(!bufferFull(bytesRead)){
bytesRead=inChannel.read(buffer);
}
bufferFull()方法必須跟蹤有多少數據讀入緩沖區,並返回真或假,這取決於緩沖區是否已滿。換句話說,如果緩沖區准備好被處理,那麼表示緩沖區滿了。
bufferFull()方法掃描緩沖區,但必須保持在bufferFull()方法被調用之前狀態相同。如果沒有,下一個讀入緩沖區的數據可能無法讀到正確的位置。這是不可能的,但卻是需要注意的又一問題。
如果緩沖區已滿,它可以被處理。如果它不滿,並且在你的實際案例中有意義,你或許能處理其中的部分數據。但是許多情況下並非如此。下圖展示了「緩沖區數據循環就緒」:
3)用來處理數據的線程數
NIO可讓您只使用一個(或幾個)單線程管理多個通道(網路連接或文件),但付出的代價是解析數據可能會比從一個阻塞流中讀取數據更復雜。
如果需要管理同時打開的成千上萬個連接,這些連接每次只是發送少量的數據,例如聊天伺服器,實現NIO的伺服器可能是一個優勢。同樣,如果你需要維持許多打開的連接到其他計算機上,如P2P網路中,使用一個單獨的線程來管理你所有出站連接,可能是一個優勢。一個線程多個連接的設計方案如
JavaNIO:單線程管理多個連接
如果你有少量的連接使用非常高的帶寬,一次發送大量的數據,也許典型的IO伺服器實現可能非常契合。下圖說明了一個典型的IO伺服器設計:
JavaIO:一個典型的IO伺服器設計-一個連接通過一個線程處理