java 關於fileinputstream的使用
今天瞭解了一下fileinputstream的使用,關於其read方法的使用
1、如何使用fileinputstream讀取檔案中的內容,首先通過閱讀原始碼來了解一下其原理
/**
* Reads a byte of data from this input stream. This method blocks
* if no input is yet available.
*
* @return the next byte of data, or <code>-1</code> if the end of the
* file is reached.
* @exception IOException if an I/O error occurs.
* @Range(from=-1,to=255)
*/
public int read() throws IOException {
return read0();
}
Range(from=-1,to=255)
這是read()方法的說明,其讀取的其實就是按照ACSII碼來讀取的,超出的部分就會顯示亂碼。並且返回值為資料的ACSII碼,例如
pj.txt中
“
hello world
你好世界
”
import java.io.*;
import java.util.ArrayList;
public class E1 {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream=new FileInputStream("C:\\Users\\hasee\\Desktop\\pj.txt");
int temp;
while((temp=fileInputStream.read())!=-1)
System.out.print((char)temp);
}
}
結果為
hello world
ä½ å¥½ä¸–ç•Œ
所以我們讀取包括在ASCII中的資料的時候才使用這個方法,不然就選擇fileinputstream中的read(byte[])方法。
原始碼如下
/**
* Reads up to <code>b.length</code> bytes of data from this input
* stream into an array of bytes. This method blocks until some input
* is available.
*
* @param b the buffer into which the data is read.
* @return the total number of bytes read into the buffer, or
* <code>-1</code> if there is no more data because the end of
* the file has been reached.
* @exception IOException if an I/O error occurs.
* @Range(from=-1,to=java.lang.integer.MAX_VALUE)
*/
public int read(byte b[]) throws IOException {
return readBytes(b, 0, b.length);
}
由此可知,這個方法是把讀取到的資料存在byte[]陣列當中,並返回讀取到的資料的長度,並且其資料範圍
Range(from=-1,to=java.lang.integer.MAX_VALUE)
可以讀取的範圍更大。
同樣使用pj.txt測試
import java.io.*;
import java.util.ArrayList;
public class E1 {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream=new FileInputStream("C:\\Users\\hasee\\Desktop\\pj.txt");
byte[] bytes=new byte[1024];
while (fileInputStream.read(bytes)!=-1){
System.out.print(new String(bytes));
}
}
}
結果為
hello world
你好世界
注意:問題在今天使用read方法的時候出現,程式碼如下
import java.io.*;
import java.util.ArrayList;
public class E1 {
public static void main(String[] args) throws IOException {
FileInputStream fileInputStream=new FileInputStream("C:\\Users\\hasee\\Desktop\\pj.txt");
while (fileInputStream.read()!=-1){
System.out.print((char)fileInputStream.read());
}
}
}
測試檔案中內容為
“123456”
執行結果如下
246
我一開始很疑惑,為什麼總是缺少135,後面瞭解到,read方法其實可以理解為一個指標,當他第一次呼叫時候就會指向第一個資料,而後每一次呼叫都會使得指標往後移動一位,而我的程式碼中使用了read()方法在while中進行了判斷,然後又進行了輸出,導致判斷的那一次指向的資料就沒有被輸出,所就會產生這種情況。
相關文章
- java中FileInputStream,FileReader等的區別Java
- Java I/O 教程(四) FileInputStream 類Java
- java FileInputStream open0原始碼解析Java原始碼
- java基礎學習_io流之FileInputStreamJava
- Java IO 之 FileInputStream & FileOutputStream 原始碼分析Java原始碼
- win10系統下java中FileInputStream的錯誤Win10Java
- Java 關於執行緒的一些使用Java執行緒
- 關於Remix的使用REM
- 關於split的使用
- BufferedReader、FileReader、FileInputStream的區別
- 關於Java的File.separatorJava
- 關於Java中的equals方法Java
- 關於GWT的Java heap spaceJava
- 關於Java的一點想法Java
- 關於java的執行流程Java
- 關於索引的使用模式索引模式
- 關於java多型Java多型
- 關於 Java 中的 RMI-IIOPJava
- Java 中關於protected的介紹Java
- 關於Java中的反射機制Java反射
- 關於Java中的@Deprecated註解Java
- 關於 Java 的10個謊言Java
- 關於Java中類的成員Java
- 關於java實現同步的方法Java
- 關於java中的double check lockJava
- 那些關於Java的小祕密Java
- 關於Java的10個謊言Java
- 關於C/C++/Java的比喻C++Java
- 關於java的“原子操作”問題Java
- 關於Java Mail的身份驗證!JavaAI
- 關於java 的 Classpath全解 (轉)Java
- 關於Java棧與堆的思考Java
- 關於JAVA的可移植性(轉)Java
- Android關於Typedarray的使用Android
- 關於MySQL使用的時長MySql
- Masonry 關於ScrollView的使用View
- 關於InputMethodManager的使用方法
- 關於DBMS_SQL的使用SQL