Java怎麼將一個InputStream轉換成爲String

Java怎麼將一個InputStream轉換成爲String?


一個流變成一個String對象,我們首先要去了解的就是他們有什麼共同點,表面上看他們一個對象,一個流,完全就沒法轉換,不過通過一些分解,然後在轉換是完全可以做到的。

在轉換之前我們不妨瞭解一下流,到底是什麼?

在 Java 中所有數據都是使用流讀寫的。流是一組有序的數據序列,將數據從一個地方帶到另一個地方。根據數據流向的不同,可以分爲輸入(Input)流和輸出(Output)流兩種。InputStream就是輸入,OutputStream就是輸出流

輸入流InputStream

在java中InputStream是字節輸入流,用來將文件中的數據讀取到java程序中。InputStream是所有字節輸入流的頂層父類,是一個抽象類。如果要用,需要使用子類。比如我們創建一個InputStream的時候,我們繼續按照這麼創建

InputStream inputStream = new FileInputStream("E:\\codework\\demo1\\demo\\src\\main\\java\\com\\echo\\demo\\DemoApplication.java");

從介紹中我們可以看到InputStream就是字節輸入流,我們可以去看看它相關的API,在電腦中,不管是文件也好還是視頻也好,最底層都是字節,String是一個對象,底層存儲也是字節的形式。所以這裏我們就找到了他們可以轉換的點了。

怎麼使用InputStream讀取文件內容

既然我們的文件底層是字節存儲的,那我們瞭解一下InputStream讀取API看看它是怎麼讀取字節的

名稱 作用
int read() 從輸入流讀入一個 8 字節的數據,將它轉換成一個 0~ 255 的整數,返回一個整數,如果遇到輸入流的結尾返回 -1
int read(byte[] b) 從輸入流讀取若干字節的數據保存到參數 b 指定的字節數組中,返回的字節數表示讀取的字節數,如果遇到輸入流的結尾返回 -1
int read(byte[] b,int off,int len) 從輸入流讀取若干字節的數據保存到參數 b 指定的字節數組中,其中 off 是指在數組中開始保存數據位置的起始下標,len 是指讀取字節的位數。返回的是實際讀取的字節數,如果遇到輸入流的結尾則返回 -1
//調用read方法讀取數據
StringBuffer sb = new StringBuffer();
int i;
while ((i = inputStream.read()) != -1) {
    // inputStream.read()) 讀取文件的一個字節(8個二進制位),並將其由二進制轉成十進制的整數返回
    // 轉成字符
    char c = (char) i;
    sb.append(c);
}
System.out.println(sb.toString());

注意: 這種方式不能讀取中文,一箇中文佔多個字節,此時一次讀取一個字節會把中文拆開讀。

解決不能讀取中文的問題

我們可以從API中看到inputStream可以直接從流裏面獲取到一個字節數組,那麼這就解決了我們的中文佔多個字節的問題

StringBuffer sb = new StringBuffer();
byte arr[] = new byte[3];
int i;
while ((i = inputStream.read(arr)) != -1) {
    // 轉成字符
    String s = new String(arr);
    sb.append(s);
}
System.out.println(sb.toString());

不同的編碼格式佔字節數是不同的,UTF-8編碼下一個中文所佔字節也是不確定的,可能是2個、3個、4個字節;所以我們要根據實際情況去設置字節數組的長度,解決了這個問題我們的讀取就沒問題ile

封裝好的方法

StringWriter stringWriter = new StringWriter();
IOUtils.copy(inputStream, stringWriter);
String s = stringWriter.toString();
System.out.println(s);

封裝好的方法都有可能需要引入相應的依賴,對應的方法很多,記得引入依賴就好了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章