程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java的DataInputStream和DataOutputStream數據輸出輸入流

Java的DataInputStream和DataOutputStream數據輸出輸入流

編輯:關於JAVA

Java的DataInputStream和DataOutputStream數據輸出輸入流。本站提示廣大學習愛好者:(Java的DataInputStream和DataOutputStream數據輸出輸入流)文章只能為提供參考,不一定能成為您想要的結果。以下是Java的DataInputStream和DataOutputStream數據輸出輸入流正文


DataInputStream 
DataInputStream 是數據輸出流。它繼續於FilterInputStream。
DataInputStream 是用來裝潢其它輸出流,它“許可運用法式以與機械有關方法從底層輸出流中讀取根本 Java 數據類型”。運用法式可使用DataOutputStream(數據輸入流)寫入由DataInputStream(數據輸出流)讀取的數據。
DataInputStream 函數列表:

DataInputStream(InputStream in)
final int  read(byte[] buffer, int offset, int length)
final int  read(byte[] buffer)
final boolean  readBoolean()
final byte  readByte()
final char  readChar()
final double  readDouble()
final float  readFloat()
final void  readFully(byte[] dst)
final void  readFully(byte[] dst, int offset, int byteCount)
final int  readInt()
final String  readLine()
final long  readLong()
final short  readShort()
final static String  readUTF(DataInput in)
final String  readUTF()
final int  readUnsignedByte()
final int  readUnsignedShort()
final int  skipBytes(int count)

示例代碼:
關於DataInputStream中API的具體用法:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.lang.SecurityException;

/**
 * DataInputStream 和 DataOutputStream測試法式
 *
 * @author skywang
 */
public class DataInputStreamTest {

 private static final int LEN = 5;

 public static void main(String[] args) {
  // 測試DataOutputStream,將數據寫入到輸入流中。
  testDataOutputStream() ;
  // 測試DataInputStream,從下面的輸入流成果中讀取數據。
  testDataInputStream() ;
 }

 /**
  * DataOutputStream的API測試函數
  */
 private static void testDataOutputStream() {

  try {
   File file = new File("file.txt");
   DataOutputStream out =
     new DataOutputStream(
      new FileOutputStream(file));

   out.writeBoolean(true);
   out.writeByte((byte)0x41);
   out.writeChar((char)0x4243);
   out.writeShort((short)0x4445);
   out.writeInt(0x12345678);
   out.writeLong(0x0FEDCBA987654321L);

   out.writeUTF("abcdefghijklmnopqrstuvwxyz嚴12");

   out.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (SecurityException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 /**
  * DataInputStream的API測試函數
  */
 private static void testDataInputStream() {

  try {
   File file = new File("file.txt");
   DataInputStream in =
     new DataInputStream(
      new FileInputStream(file));

   System.out.printf("byteToHexString(0x8F):0x%s\n", byteToHexString((byte)0x8F));
   System.out.printf("charToHexString(0x8FCF):0x%s\n", charToHexString((char)0x8FCF));

   System.out.printf("readBoolean():%s\n", in.readBoolean());
   System.out.printf("readByte():0x%s\n", byteToHexString(in.readByte()));
   System.out.printf("readChar():0x%s\n", charToHexString(in.readChar()));
   System.out.printf("readShort():0x%s\n", shortToHexString(in.readShort()));
   System.out.printf("readInt():0x%s\n", Integer.toHexString(in.readInt()));
   System.out.printf("readLong():0x%s\n", Long.toHexString(in.readLong()));
   System.out.printf("readUTF():%s\n", in.readUTF());

   in.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (SecurityException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 // 打印byte對應的16進制的字符串
 private static String byteToHexString(byte val) {
  return Integer.toHexString(val & 0xff);
 }

 // 打印char對應的16進制的字符串
 private static String charToHexString(char val) {
  return Integer.toHexString(val);
 }

 // 打印short對應的16進制的字符串
 private static String shortToHexString(short val) {
  return Integer.toHexString(val & 0xffff);
 }
}

運轉成果:

byteToHexString(0x8F):0x8f
charToHexString(0x8FCF):0x8fcf
readBoolean():true
readByte():0x41
readChar():0x4243
readShort():0x4445
readInt():0x12345678
readLong():0xfedcba987654321
readUTF():abcdefghijklmnopqrstuvwxyz嚴12

成果解釋:
(1) 檢查file.txt文本。16進制的數據顯示以下:

001f 對應的int值是31。它表現的寄義是前面的UTF-8數據的長度。字符串“abcdefghijklmnopqrstuvwxyz嚴12”中字母“ab...xyz”的長度是26,“嚴”對應的UTF-8數據長度是3;“12”長度是2。總的長度=26+3+2=31。
(2) 前往byte對應的16進制的字符串
源碼以下:

private static String byteToHexString(byte val) {
 return Integer.toHexString(val & 0xff);
}

想一想為何代碼是:

return Integer.toHexString(val & 0xff);

而不是

return Integer.toHexString(val);

我們先看看 byteToHexString((byte)0x8F); 在下面兩種情形下的輸入成果。
return Integer.toHexString(val & 0xff); 對應的輸入是“0xffffff8f”
return Integer.toHexString(val); 對應的輸入是“0x8f”
為何會如許呢?
緣由其實很簡略,就是“byte類型轉換成int類型”招致的成績。
byte類型的0x8F是一個正數,它對應的2進制是10001111;將一個正數的byte轉換成int類型時,履行的是有符號轉型(新增位都填充符號位的數字)。0x8F的符號位是1,由於將它轉換成int時,填充“1”;轉型後的成果(2進制)是11111111 11111111 11111111 10001111,對應的16進制為0xffffff8f。
由於當我們履行Integer.toHexString(val);時,前往的就是0xffffff8f。
在Integer.toHexString(val & 0xff)中,相當於0xffffff8f & 0xff,獲得的成果是0x8f。
(3) 前往char和short對應的16進制的字符串
“前往char對應的16進制的字符串”對應的源碼以下:

private static String charToHexString(char val) {
 return Integer.toHexString(val);
}

“前往short對應的16進制的字符串”對應源碼以下:

private static String shortToHexString(short val) {
 return Integer.toHexString(val & 0xffff);
}

比擬下面的兩個函數,為何一個是 “val” ,而另外一個是 “val & 0xffff”?
經由過程(2)的剖析,我們相似的推出為何 “前往short對應的16進制的字符串” 要履行“val & 0xffff”。
然則,為何 “前往char對應的16進制的字符串” 要履行 “val” 便可。緣由也很簡略,java中char是無符號類型,占兩個字節。將char轉換為int類型,履行的是無符號轉型,新增為都填充0。


DataOutputStream
DataOutputStream 是數據輸入流。它繼續於FilterOutputStream。
DataOutputStream 是用來裝潢其它輸入流,將DataOutputStream和DataInputStream輸出流合營應用,“許可運用法式以與機械有關方法從底層輸出流中讀寫根本 Java 數據類型”。
示例代碼
關於DataOutStream中API的具體用法:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.lang.SecurityException;

/**
 * DataInputStream 和 DataOutputStream測試法式
 *
 * @author skywang
 */
public class DataInputStreamTest {

 private static final int LEN = 5;

 public static void main(String[] args) {
  // 測試DataOutputStream,將數據寫入到輸入流中。
  testDataOutputStream() ;
  // 測試DataInputStream,從下面的輸入流成果中讀取數據。
  testDataInputStream() ;
 }

 /**
  * DataOutputStream的API測試函數
  */
 private static void testDataOutputStream() {

  try {
   File file = new File("file.txt");
   DataOutputStream out =
     new DataOutputStream(
      new FileOutputStream(file));

   out.writeBoolean(true);
   out.writeByte((byte)0x41);
   out.writeChar((char)0x4243);
   out.writeShort((short)0x4445);
   out.writeInt(0x12345678);
   out.writeLong(0x0FEDCBA987654321L);

   out.writeUTF("abcdefghijklmnopqrstuvwxyz嚴12");

   out.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (SecurityException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 /**
  * DataInputStream的API測試函數
  */
 private static void testDataInputStream() {

  try {
   File file = new File("file.txt");
   DataInputStream in =
     new DataInputStream(
      new FileInputStream(file));

   System.out.printf("byteToHexString(0x8F):0x%s\n", byteToHexString((byte)0x8F));
   System.out.printf("charToHexString(0x8FCF):0x%s\n", charToHexString((char)0x8FCF));

   System.out.printf("readBoolean():%s\n", in.readBoolean());
   System.out.printf("readByte():0x%s\n", byteToHexString(in.readByte()));
   System.out.printf("readChar():0x%s\n", charToHexString(in.readChar()));
   System.out.printf("readShort():0x%s\n", shortToHexString(in.readShort()));
   System.out.printf("readInt():0x%s\n", Integer.toHexString(in.readInt()));
   System.out.printf("readLong():0x%s\n", Long.toHexString(in.readLong()));
   System.out.printf("readUTF():%s\n", in.readUTF());

   in.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (SecurityException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 // 打印byte對應的16進制的字符串
 private static String byteToHexString(byte val) {
  return Integer.toHexString(val & 0xff);
 }

 // 打印char對應的16進制的字符串
 private static String charToHexString(char val) {
  return Integer.toHexString(val);
 }

 // 打印short對應的16進制的字符串
 private static String shortToHexString(short val) {
  return Integer.toHexString(val & 0xffff);
 }
}

運轉成果:

byteToHexString(0x8F):0x8f
charToHexString(0x8FCF):0x8fcf
readBoolean():true
readByte():0x41
readChar():0x4243
readShort():0x4445
readInt():0x12345678
readLong():0xfedcba987654321
readUTF():abcdefghijklmnopqrstuvwxyz嚴12

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved