在 Java 中轉換輸入流為位元組陣列

Mohammad Irfan 2023年1月30日 2020年12月31日
  1. 使用 Java 中的 readAllBytes() 方法將 InputStream 轉換為位元組陣列
  2. 使用 Java 中的 toByteArray() 方法將輸入流轉換為位元組陣列
  3. 使用 Java 中的 write() 方法將輸入流轉換為位元組陣列
  4. 使用 Java 中的 readAllBytes() 方法將 InputStream 轉換為位元組陣列
  5. 使用 Java 中的 readFully() 方法將 InputStream 轉換為位元組陣列
  6. 使用 Java 中的 getBytes() 方法將輸入流轉換為位元組陣列
  7. 使用 Java 中的自定義程式碼將輸入流轉換為位元組陣列
  8. 使用 Java 中的 toByteArray() 方法將輸入流轉換為位元組陣列
在 Java 中轉換輸入流為位元組陣列

本教程介紹瞭如何在 Java 中把輸入流轉換為位元組陣列,並列舉了一些示例程式碼來理解這個主題。

InputStream 是一個抽象類,也是所有表示位元組輸入流的類的超類。Java 使用輸入流從任何源如檔案、陣列等讀取資料。然後,我們將看到如何通過使用 Java 中的一些內建方法和自定義程式碼將該流轉換為位元組陣列。

在本文中,我們將使用幾個內建方法,如 toByteArray()readAllBytes()readFully()getBytes()write() 等,並使用一個文字檔案 abc.txt 來讀取資料。這個文字檔案中包含了一句話:Welcome to Delfstack,我們將讀到這句話並轉換成位元組陣列,進一步可以轉換成字串來檢查所需的結果。

使用 Java 中的 readAllBytes() 方法將 InputStream 轉換為位元組陣列

我們可以使用 readAllBytes() 方法將所有資料放入一個位元組陣列。這個方法返回一個位元組陣列,可以進一步傳遞到 String 建構函式中列印文字資料。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class SimpleTesting{
    public static void main(String[] args) {
        try{
            InputStream ins = new FileInputStream("abc.txt");
            byte[] byteArray = ins.readAllBytes();
            System.out.println(new String(byteArray));
            ins.close();
        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

輸出:

Welcome to Delfstack

使用 Java 中的 toByteArray() 方法將輸入流轉換為位元組陣列

如果使用 Apache 庫,則可以使用 IOUtils 類的 toByteArray() 方法來獲取所有資料到位元組陣列中。這個方法返回一個位元組陣列,可以進一步傳遞給 String 建構函式來列印文字資料。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;

public class SimpleTesting{
    public static void main(String[] args) {
        try {
            InputStream ins = new FileInputStream("abc.txt");
            byte[] bytes = IOUtils.toByteArray(ins);
            System.out.println(new String(bytes));
        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

輸出:

Welcome to Delftstack

使用 Java 中的 write() 方法將輸入流轉換為位元組陣列

我們可以使用 ByteArrayOutputStream 類的 write() 方法將所有的資料轉換成一個位元組陣列。這個方法返回一個位元組陣列,可以傳遞給 String 建構函式來列印文字資料。

package myjavaproject;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class SimpleTesting{
    public static void main(String[] args) {
        try{
            InputStream ins = new FileInputStream("abc.txt");
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            int read;
            byte[] data = new byte[16384];
            while ((read = ins.read(data, 0, data.length)) != -1) {
                buffer.write(data, 0, read);
            }
            System.out.println(new String(data));
            ins.close();
        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

輸出:

Welcome to Delfstack

使用 Java 中的 readAllBytes() 方法將 InputStream 轉換為位元組陣列

我們可以使用 DataInputStream 類的 readAllBytes() 方法將所有資料轉換為一個位元組陣列。這個方法返回的位元組陣列可以進一步傳遞到 String 建構函式中列印文字資料。

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class SimpleTesting{
    public static void main(String[] args) {
        try{
            String file = "abc.txt";
            DataInputStream dis = new DataInputStream(new FileInputStream(file));
            byte[] bytes = dis.readAllBytes();
            System.out.println(new String(bytes));
            dis.close();
        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

輸出:

Welcome to Delftstack

使用 Java 中的 readFully() 方法將 InputStream 轉換為位元組陣列

我們可以使用 RandomAccessFile 類的 readFully() 方法將所有資料轉換為位元組陣列。這個方法返回一個位元組陣列,它可以傳遞給 String 建構函式來列印文字資料。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
public class SimpleTesting{
	public static void main(String[] args) {
		try{
			String file = "abc.txt";
			InputStream is = new FileInputStream(file);
			RandomAccessFile raf = new RandomAccessFile(file, "r");
			byte[] bytesData = new byte[(int) raf.length()];
			raf.readFully(bytesData);
			System.out.println(new String(bytesData));
			is.close();
			raf.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

輸出:

Welcome to Delfstack

使用 Java 中的 getBytes() 方法將輸入流轉換為位元組陣列

我們可以使用 String 類的 getBytes() 方法將所有資料轉換成一個位元組陣列。這個方法返回一個位元組陣列,可以進一步傳遞到 String 建構函式中列印文字資料。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.stream.Collectors;

public class SimpleTesting{
    public static void main(String[] args) {
        try{
            String file = "abc.txt";
            byte[] bytesData = {};
            InputStream is = new FileInputStream(file);
            try (BufferedReader buffer = new BufferedReader(new InputStreamReader(is))) {
                bytesData = buffer.lines().collect(Collectors.joining("\n")).getBytes();
            }
            System.out.println(new String(bytesData));
            is.close();
        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

輸出:

Welcome to Delftstack

使用 Java 中的自定義程式碼將輸入流轉換為位元組陣列

如果你不想使用任何內建的方法,可以使用這段自定義的程式碼將輸入流轉換為位元組陣列,這段程式碼返回一個位元組陣列,它可以進一步傳入 String 建構函式來列印文字資料。這段程式碼返回一個位元組陣列,可以進一步傳遞到 String 建構函式中列印文字資料。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class SimpleTesting{
	public static void main(String[] args) {
		try{
			String file = "abc.txt";
			byte[] bytesData = {};
			bytesData = getBytesFromFile(new File(file));
			System.out.println(new String(bytesData));
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	public static byte[] getBytesFromFile(File file) throws IOException {
		InputStream is = new FileInputStream(file);
		long length = file.length();
		byte[] bytes = new byte[(int)length];
		int offset = 0;
		int numRead = 0;
		while (offset < bytes.length
				&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
			offset += numRead;
		}
		if (offset < bytes.length) {
			throw new IOException("Could not read file "+file.getName());
		}
		return bytes;
	}
}

輸出:

Welcome to Delfstack

使用 Java 中的 toByteArray() 方法將輸入流轉換為位元組陣列

我們可以使用 ByteArrayOutputStream 類的 toByteArray() 方法將所有資料轉換為一個位元組陣列。這個方法返回一個位元組陣列,可以進一步傳遞到 String 建構函式中列印文字資料。

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class SimpleTesting{
	public static void main(String[] args) {
		try{
			String file = "abc.txt";
			InputStream is = new FileInputStream(file);
			ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
			is.transferTo(byteArrayOutputStream);
			byte[] bytesData = byteArrayOutputStream.toByteArray();
			System.out.println(new String(bytesData));
			is.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

輸出:

Welcome to Delfstack

相關文章 - Java IO