Java 記憶體操作流
阿新 • • 發佈:2020-12-31
技術標籤:Java演算法及JDK原始碼探究日常小知識隨筆java
記憶體操作流
除了檔案之外, IO的操作也可以發生在記憶體之中, 這種流就是記憶體操作流
檔案流的操作裡面一定會產生一個檔案資料(不管最後這個資料是否被保留), 那麼現在我需要IO處理, 但是不想產生檔案, 這種情況就可以使用記憶體作為操作的終端。
在Java 中兩類資料流:
位元組記憶體流
ByteArrayInputStream, ByteArrayOutputStream
字元記憶體流
CharArrayReader, CharArrayOutputWriter
觀察 ByteArrayInputStream 和 ByteArrayOutputStream 類中提供的構造方法
ByteArrayInputStream 類構造:
public ByteArrayInputStream(byte[] buf)
ByteArrayOutputStream 類構造
public ByteArrayOutputStream()
範例: 通過記憶體流實現一個大小寫轉化的操作
package com.cwq.beyond;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class TestDemo01 {
public static void main(String[] args) throws IOException {
String msg = "hello world !!!";
// 例項化InputStream類物件, 例項化的時候需要將你的操作儲存在記憶體之中, 最終你讀取的就是你設定的內容
InputStream input = new ByteArrayInputStream(msg.getBytes());
OutputStream output = new ByteArrayOutputStream();
int temp = 0;
while ((temp = input.read()) != -1) {
output.write(Character.toUpperCase(temp)); // 每個位元組資料進行處理
} // 此時所有的資料都在OutputStream類中 了
System.out.println(output);
input.close();
output.close();
}
}
Java 資料型別的自動提升
《Java核心技術卷I》P43
Java定義了若干使用於表示式的型別提升規則:
- 如果兩個運算元其中有一個是double型別,另一個操作就會轉換為double型別。
- 否則,如果其中一個運算元是float型別,另一個將會轉換為float型別。
- 否則,如果其中一個運算元是long型別,另一個會轉換為long型別。
- 否則,兩個運算元都轉換為int型別。
(隱含意:如果在二元操作中,不存在double,float,long的話,那麼byte、short、char型別都會被轉化為int型別)
但是如果用final修飾byte,short,char且兩個參與運算的資料都不為int/long/float/double,就不會有自動提升了
byte t1 = 23;
byte t2 = 2;
byte t3 = t1 + t2;//不能通過編譯
int i1 = 4;
int i2 = i1 + t1;//完美編譯
double b1 = 3.23;
float f1 = 34f;
float f2 = b1 + f1;//不能通過編譯
final byte b1 = 34;
final byte b2 = 23;
byte b3 = b1 + b2;//完美編譯
int a = 3;
final short b = -20;
short c = a + b;//不能通過編譯