1. 程式人生 > 其它 >Java 記憶體操作流

Java 記憶體操作流

技術標籤: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;//不能通過編譯