InputStreamは、バイトのすべての入力ストリームのJava親クラスで、OutputStreamの抽象クラスのすべてのJavaバイト出力ストリームクラスのための親クラスで、サブクラスは、このように、彼らは抽象親クラスを再定義したい継承します。
以下は、親クラスを提供するために、最初の2つの一般的な方法を説明し、そしてどのようにそれらを使用するにはタイプれるByteArrayInputStream、ByteArrayOutputStreamタイプ、クラスとクラスのFileInputStreamたFileOutputStreamを含む、バイトの入力と出力ストリームのサブクラス。
バイトの入力ストリーム
入力ストリームクラスおよびそのサブクラスバイトのオブジェクト表現入力ストリームは、一般に、サブクラスのInputStreamクラスは、次の通りです。
ByteArrayInputStream 类:将字节数组转换为字节输入流,从中读取字节。
FileInputStream 类:从文件中读取数据。
PipedInputStream 类:连接到一个 PipedOutputStream(管道输出流)。
SequenceInputStream 类:将多个字节输入流串联成一个字节输入流。
ObjectInputStream 类:将对象反序列化。
ストリームからバイトを読み取ることができる一つまたはバッチ法を用いて、入力ストリームクラス。
InputStreamクラスの一般的な方法
メソッド名と戻り値の型 | 説明 |
---|---|
int型の読み取り() | ストリームは、8ビットバイト、および0〜255の整数に変換し、そして最後に整数を返す入力から読み込ま。戻り値は-1それは入力ストリームの終わりに来たことを示します。I / O操作の効率を向上させるために、我々は、他の2つの形式のread()メソッドを使用することをお勧め |
int型の読み取り(バイト[] b)は | いくつかのバイトは、入力ストリームから読み込まれ、指定パラメータbバイト配列に保存します。この方法は、バイト読取りの数を返します。戻り値-1入力ストリームの終わりに達したことを示し |
INTリード(バイト[] B、オフINT、INT LEN) | いくつかのバイトは、入力ストリームから読み込まれ、指定パラメータbバイト配列に保存します。ここで、バイト配列内の指定された開始インデックスデータの保存を開始オフ、バイトを読み取る回数を指定LEN。メソッドの戻りバイトの数は、実際に読み取ります。戻り値-1入力ストリームの終わりに達したことを示し |
空に近いです() | 入力ストリームを閉じます。読み取り操作が完了したら、システムは、この入力ストリームのリソースに関連するリリースする予定、入力ストリームをオフにする必要があります。注意、のInputStreamはクラス自体close()メソッドは何もしませんが、そのサブクラスの多くは、close()メソッドをオーバーライドします |
利用可能INT() | 入力ストリームから読み込むことができるバイト数を返します。 |
ロング(長いn)をスキップ | パラメータをスキップn個の入力ストリームからバイト数を指定します。この方法は、スキップするバイト数を返します |
無効マーク(int型readLimit) | 開始フラグは、入力ストリームの現在位置に設定され、バイトのreadLimitパラメータ指定最大数は標識設定されています |
ブールmarkSupported() | 現在のフラグが入力ストリームを許可するように設定されているかどうか、それはそうでなければTRUE、FALSEを返します |
無効リセット() | 復帰フラグの開始に入力ストリームポインタがに設定されています |
ご注意ください:マーク()メソッドとreset()メソッドを使用する前に、ファイルシステムが両方の方法をサポートしているかどうかを決定する必要があります。
バイト出力ストリーム
オブジェクトのOutputStreamクラスおよびそのサブクラスは、バイトの出力ストリームを表します。OutputStreamの一般的なサブクラスは、以下の通りです。
ByteArrayOutputStream 类:向内存缓冲区的字节数组中写数据。
FileOutputStream 类:向文件中写数据。
PipedOutputStream 类:连接到一个 PipedlntputStream(管道输入流)。
ObjectOutputStream 类:将对象序列化。
OutputStreamクラスまたはメソッドを使用してストリームからバイト数に書き込むことができます。
OutputStreamの一般的な方法
メソッド名と戻り値の型 | 説明 |
---|---|
空の書き込み(INT B) | 出力ストリームにバイトを書き込みます。どこの引数はint型ですが、それはbyte型にキャストすることなく、表現の使用を可能にします。他の二つの形態のI / O操作の効率を向上させるために、それは書き込みを利用することが推奨される()メソッド |
空の書き込み(バイト[] b)は | パラメータBを指定した出力ストリームに書き込まれたバイトの配列内のすべてのバイト |
空の書き込み(バイト[] B、オフint型、int型のLEN) | パラメータbは、出力ストリームに書き込まれたバイト配列のバイト数を指定します。ここで、指定されたバイト配列の開始インデックスオフ、LEN表す要素の数 |
空に近いです() | 出力ストリームを閉じます。書き込み操作が完了したら、それは出力ストリームを閉じる必要があります。システムは、出力ストリームに関連付けられているリソースを解放します。注、OutputStreamのは、クラス自体close()メソッドは何もしませんが、そのサブクラスの多くは、close()メソッドをオーバーライドします |
空フラッシュ() | データが出力ストリームに書き込まれ、効率を向上させるために、データは、通常、メモリバッファに保存され、データが一定のレベルに達するだけバッファは、バッファ内のデータが出力ストリームに書き込まれます。使用フラッシュ()メソッドは、出力ストリームに書き込まれたデータをバッファリングするように強制されてもよいし、バッファを空に |
バイト配列入力ストリーム
れるByteArrayInputStreamクラスデータは、メモリ内のバイト配列は、次の2つのクラスのコンストラクタのオーバーロードから読み取ることができます。
ByteArrayInputStream(byte[] buf):创建一个字节数组输入流,字节数组类型的数据源由参数 buf 指定。
ByteArrayInputStream(byte[] buf,int offse,int length):创建一个字节数组输入流,其中,参数 buf 指定字节数组类型的数据源,offset 指定在数组中开始读取数据的起始下标位置,length 指定读取的元素个数。
使用するByteArrayInputStreamクラスが実装するバイトの配列は、データから読み出され、その後、INT出力に変換します。コードは以下の通りであります:
public class test {
public static void main(String[] args) {
byte[] b = new byte[] { 1, -1, 25, -22, -5, 23 }; // 创建数组
ByteArrayInputStream bais = new ByteArrayInputStream(b, 0, 6); // 创建字节数组输入流
int i = bais.read(); // 从输入流中读取下一个字节,并转换成int型数据
while (i != -1) { // 如果不返回-1,则表示没有到输入流的末尾
System.out.println("原值=" + (byte) i + "\t\t\t转换为int类型=" + i);
i = bais.read(); // 读取下一个
}
}
}
実施形態では、4バイトバイトBAISの入力ストリームがINTに4バイトのデータ、及び最終的にリターンを要素Bのバイト配列からの第1の要素の読み取りを開始し、変換をします。
プロンプト上記の例に加えて、iの値を印刷するだけでなく、iの値が使用(バイト)ので、私は、元のデータ・バイトを取得することができ、上バイト型からのデータの変換であるので、値(バイト)Iをプリントアウト。
次のようにプログラムの動作結果は以下のとおりです。
原值=1 转换为int类型=1
原值=-1 转换为int类型=255
原值=25 转换为int类型=25
原值=-22 转换为int类型=234
原值=-5 转换为int类型=251
原值=23 转换为int类型=23
次のような結果から、1データ255と234バイトのint型のデータへの変換は-22になった後、この結果の解釈は次のとおりです。
字节类型的 1,二进制形式为 00000001,转换为 int 类型后的二进制形式为 00000000 00000000 0000000000000001,对应的十进制数为 1。
字节类型的 -1,二进制形式为 11111111,转换为 int 类型后的二进制形式为 00000000 00000000 0000000011111111,对应的十进制数为 255。
それが正であるならば、値変わらず、型int型のバイト数への変換から見た、それが変換するので、負であれば、直接0~24の補数バイナリ形式の前に、このように表される元を変更します負の補数形式は、それは即ち、正となり、値を変更します。
プロンプト:相補形の存在下でのバイナリフォーム負第0,0 1になるように、1になり、アンチコード動作が続く、000000011プリミティブを取得した:そのようなバイナリ形式で来る-1、として、 11111110、最終的に相補動作を与えるために、それは11111111となるように、反転ビット+ 1の端部にあります。
ByteArrayOutputStream
ByteArrayOutputStreamクラスは、メモリ内のバイト配列に書き込むことができ、それは次の2つのクラスのコンストラクタのオーバーロードがあります。
ByteArrayOutputStream():创建一个字节数组输出流,输出流缓冲区的初始容量大小为 32 字节。
ByteArrayOutputStream(int size):创建一个字节数组输出流,输出流缓冲区的初始容量大小由参数 size 指定。
次のように一般的な方法は、上記で説明したバイトのクラスByteArrayOutputStream出力ストリームに加えて、他の二つの方法があります。
intsize():返回缓冲区中的当前字节数。
byte[] toByteArray():以字节数组的形式返回输出流中的当前内容。
ByteArrayOutputStreamクラスバイト配列データ出力を使用して実装、コードを以下に示します。
public class Test {
public static void main(String[] args) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[] { 1, -1, 25, -22, -5, 23 }; // 创建数组
baos.write(b, 0, 6); // 将字节数组b中的前4个字节元素写到输出流中
System.out.println("数组中一共包含:" + baos.size() + "字节"); // 输出缓冲区中的字节数
byte[] newByteArray = baos.toByteArray(); // 将输出流中的当前内容转换成字节数组
System.out.println(Arrays.toString(newByteArray)); // 输出数组中的内容
}
}
次のようにプログラムの出力は以下のとおりです。
数组中一共包含:6字节
[1, -1, 25, -22, -5, 23]
ファイル入力ストリーム
JavaのFileInputStreamのストリームは、一般に、ファイルシステム内のファイルからの入力バイトを取得し、比較として用いられます。FileInputStreamのバイトファイル、バイトのグループまたはファイル全体を使用してアクセスすることができます。
あなたは、オブジェクトのFileInputStreamクラスを作成する場合は、あなたが撮影しなければなりませんにFileNotFoundException例外がスローされます指定されたファイルを、見つけるか、文を投げることができない場合。
FileInputStreamの従来の施工方法は、主に次の二つのオーバーロードされた形態です。
FileInputStream(File file):通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String name):通过打开一个到实际文件的链接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
例えば2つの構成を使用するのFileInputStream()メソッド。
try {
// 以File对象作为参数创建FileInputStream对象
FileInputStream fis1 = new FileInputStream(new File("F:/mxl.txt"));
// 以字符串值作为参数创建FilelnputStream对象
FileInputStream fis2 = new FileInputStream("F:/mxl.txt");
} catch(FileNotFoundException e) {
System.out.println("指定的文件找不到!");
}
ファイルの内容を読み取り、出力する次のFileInputStreamクラスを使用して、\ myJava \ HelloJava.javaファイル:我々はDを持っていると仮定します。コードは以下の通りであります:
public class Test {
public static void main(String[] args) {
File f = new File("D:/myJava/HelloJava.java");
FileInputStream fis = null;
try {
// 因为File没有读写的能力,所以需要有个InputStream
fis = new FileInputStream(f);
// 定义一个字节数组
byte[] bytes = new byte[1024];
int n = 0; // 得到实际读取到的字节数
System.out.println("D:\\myJava\\HelloJava.java文件内容如下:");
// 循环读取
while ((n = fis.read(bytes)) != -1) {
String s = new String(bytes, 0, n); // 将数组中从下标0到n的内容给s
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
\ myJava \ HelloJava.javaファイル:上記のコードのように、メインFileInputDemoクラス()メソッドは、最初のファイルオブジェクトF、物点Dを作成します。次いでFileInputStreamのコンストラクタのFileInputStream FISクラスを使用して作成され、1024バイト配列型の長さを宣言し、その後のFileInputStreamにリードを使用オブジェクト()メソッドは、HelloJava.javaバイトアレイにデータファイルを読み出しますバイトで、データを出力します。そして最後に近い入力ストリームのFileInputStream finally文。
D:次のように\ myJava \ HelloJava.java文書が読み取ります。
/*
*第一个java程序
*/
public class HelloJava {
// 这里是程序入口
public static void main(String[] args) {
// 输出字符串
System.out.println("你好 Java");
}
}
ご注意ください:FileInputStreamのクラスは、入力ストリームを読み込み、親クラス()メソッド、スキップ()メソッドは、利用可能な()メソッドおよびclose()メソッドは、マーク()メソッドとreset()メソッドをサポートしていませんよりも優先されます。
ファイル出力ストリーム
クラス、書き換えや道具からのOutputStreamのFileOutputStreamクラスの継承親クラスのすべてのメソッド。オブジェクトは、ストリームにバイトのバイトまたはグループに書き込まれるバイトのクラスたFileOutputStreamファイル出力ストリームを表します。あなたは、オブジェクトのFileOutputStreamクラスを作成すると指定したファイルが存在しない場合は、新しいファイルを作成し、ファイルがすでに存在する場合は、書き換えられた元のファイルの内容を消去します。
FileOutputStreamコンストラクタクラスは、主に次の4つのオーバーロードされています。
FileOutputStream(File file):创建一个文件输出流,参数 file 指定目标文件。
FileOutputStream(File file,boolean append):创建一个文件输出流,参数 file 指定目标文件,append 指定是否将数据添加到目标文件的内容末尾,如果为 true,则在末尾添加;如果为 false,则覆盖原有内容;其默认值为 false。
FileOutputStream(String name):创建一个文件输出流,参数 name 指定目标文件的文件路径信息。
FileOutputStream(String name,boolean append):创建一个文件输出流,参数 name 和 append 的含义同上。
ご注意ください:使用コンストラクタたFileOutputStream(文字列名、ブールAPPEND)は、ファイル出力ストリームオブジェクトを作成し、それが既存のファイルの末尾に追加されたデータになります。唯一の代わりに、既存のデータを上書きする追加データのために、APPENDブール型パラメータがtrueでなければなりません場合は、元の文書で指定された文字列名。
:4つの命令次のファイル出力ストリーム
クラスたFileOutputStream先ファイルのコンストラクタに指定された1宛先ファイルが存在しない可能性があります。
2.先のファイルの名前は任意でよく、例えば、D:\ ABC、D:\ abc.deとD:\ abc.de.fgあなたは、あなたがこれらのファイルの内容を開いて表示するメモ帳などのツールを使用することができますすることができますので、 。
3.ファイルが存在しなければならないターゲットディレクトリは、それ以外の場合は例外java.io.FileNotFoundExceptionがスローされます。
4.ファイルの名前は、既存のディレクトリにすることはできません。\ Javaの、java.io.FileNotFoundExceptionそうでない場合は例外をスロー:このようなDドライブ既存のJavaフォルダとして、あなたはDを使用することができないことをファイル名としてのJavaを使用することはできません。
読むD:\ myJava \ HelloJava.txt中:使用のFileInputStreamクラスの実装は、新しいファイルDの内容を書き込む\ myJava \コンテンツHelloJava.javaファイル、。具体的なコードは次のよう:
public class Test {
public static void main(String[] args) {
FileInputStream fis = null; // 声明FileInputStream对象fis
FileOutputStream fos = null; // 声明FileOutputStream对象fos
try {
File srcFile = new File("D:/myJava/HelloJava.java");
fis = new FileInputStream(srcFile); // 实例化FileInputStream对象
File targetFile = new File("D:/myJava/HelloJava.txt"); // 创建目标文件对象,该文件不存在
fos = new FileOutputStream(targetFile); // 实例化FileOutputStream对象
byte[] bytes = new byte[1024]; // 每次读取1024字节
int i = fis.read(bytes);
while (i != -1) {
fos.write(bytes, 0, i); // 向D:\HelloJava.txt文件中写入内容
i = fis.read(bytes);
}
System.out.println("写入结束!");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fis.close(); // 关闭FileInputStream对象
fos.close(); // 关闭FileOutputStream对象
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
上記のコードのように、Dは:\ myJava \ HelloJava.txtファイル:\コンテンツmyJava \ HelloJava.javaファイルは、入力/出力ストリームを介して文書Dに書き込まれます。HelloJava.txtファイルが存在しないので、ので、このプログラムの実装では、新しいファイルを作成し、コンテンツを書き込みます。
成功の意志を出力した後、プログラムを実行し、「書き込み終了!」コンソールで。この時点で、Dを開く:\ myJava \ HelloJava.txtファイルは同じファイルHelloJava.javaの内容と、その内容を検索します。
プロンプト:APPENDパラメータがtrueに設定されている場合は、のFileOutputStreamオブジェクトを作成するときは、対象ファイルの内容の末尾にデータを追加することができ、その後、目的のファイルがまだ一時的に存在することができます。