Java APIでは、バイトシーケンスを読み取ることができるオブジェクトを入力ストリームと呼び、バイトシーケンスを書き込むことができるオブジェクトを出力ストリームと呼びます。最も関係する2つのストリームは、InputStreamとOutputStreamです。抽象クラス。この記事は「JavaCoreTechnology Volume Two」を読んだ私の経験です。コードは特定のシナリオと組み合わせて私が書いています。入力ストリームと出力ストリームの初心者である読者は、次の2つのストリームを正確に区別できると思います。それを読んで。最後に、カニとカニの3つのリンクを作成、いいね、収集、追跡するのは簡単ではありません〜
1つは、入力ストリームとファイル入力ストリームです。
1.読み取り方法を調べる
まず、InputStreamクラスには抽象メソッドがあります。abstractintread()
このメソッドは、バイトを読み取って読み取ったバイトを返すか、入力の終わりに達したときに-1を返します。注:InputStreamが実際に直接使用されることはめったにないため、ほとんどの場合、InputStreamのサブクラスを使用します。その中で最も一般的に使用されるのはFileInputStreamで、FileInputStreamクラスがInputStreamクラスのreadメソッドをオーバーライドします。
参考として、JDKのソースコードを次に示します。
InputStreamのread()ソースコード:
@Override
public int read() throws IOException {
ensureOpen();
return -1;
}
次の図のコメント部分は次のように述べています。この入力ストリームから1バイトのデータを読み取ります。読み取りに使用できる入力がない場合、このメソッドはブロックします。次のバイトを返します。ファイルの終わりに達すると、-1が返されます。
/**
* Reads a byte of data from this input stream. This method blocks
* if no input is yet available.
*
* @return the next byte of data, or {@code -1} if the end of the
* file is reached.
* @throws IOException if an I/O error occurs.
*/
public int read() throws IOException {
return read0();
}
具体的な例を以下に示します。
IDEAを開き(邪悪なEclipseを使用しないでください、これはまったく良くありません)、テキストファイルTest.txtを作成します。ファイルの内容は次のとおりです。こんにちは!
Test.javaファイルを作成するには、最初にファイルオブジェクトを作成する必要があります。Filefile= new File( "E:\\ sprayingproblem \\ Test.txt");
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("E:\\喷涂问题\\Test.txt");
FileInputStream in=new FileInputStream(file);
int read = in.read();
System.out.println(read);
}
}
出力:72。
なぜ数値が出力されるのか不思議に思う人がいるかもしれません。実際、これはH文字に対応するASCIIコードです!
テーブルを検索した後、H、e、l、l、o、!の対応するASCIIコードは72101 108 108 111 33であるため、整数型を文字型に変換するだけで済みます。
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("E:\\喷涂问题\\Test.txt");
FileInputStream in=new FileInputStream(file);
int read = in.read();
char text=(char)read;
System.out.println(text);
}
}
したがって、次のように出力できます:H
2、readAllBytes方法
上記の例のようにreadメソッドのみを使用する場合は、「H」、「E」、「L」を読み取る必要があります...明らかに、速度が遅すぎて不便です。そのため、Java9以降、readAllBytes()メソッドが提供されています。このメソッドは、入力ストリーム内のすべての文字をバイト配列に直接読み取ります。そうすれば、変換によってテキスト情報を一度に出力できます!
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("E:\\喷涂问题\\Test.txt");
FileInputStream in=new FileInputStream(file);
byte[] bytes = in.readAllBytes();
for (byte Byte : bytes) {
char c=(char)Byte;
System.out.print(c);
}
}
}
コンソール出力:
次に、ファイル出力ストリーム
次に、前の入力ストリームの全体的な手順を継続的に説明しましょう。
1.テキストファイルを作成し、テキストの段落を入力しますHello!
2.入力ストリームを介してテキスト情報をバイト配列byte []に読み込みます。
- - - - - - - - - - - - - - - - - - - - - - -分割線 - - ---------------------------------------------
出力ストリームはどうですか?
もちろん、その逆です!!つまり、すでにバイト配列にあるデータを空のテキストファイルに出力します。
前のものに基づいて例を挙げてください:
1.最初に空のテキストファイルReadFromTest.txtを作成します。
2.空のファイルを表すオブジェクトfile2を作成し、out.write()メソッドを呼び出します。出力ストリームが新しいファイルにバインドされており、バイト配列を出力ストリームに書き込むことは、に書き込むことと同じであることが理解できます。新しいファイル。
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
File file1 = new File("E:\\喷涂问题\\Test.txt");
FileInputStream in=new FileInputStream(file1);
byte[] bytes = in.readAllBytes();
//以上部分的代码将原来Test.txt中的hello!转移到字符数组bytes中了
File file2 = new File("E:\\喷涂问题\\ReadFromTest.txt");
FileOutputStream out = new FileOutputStream(file2);
out.write(bytes);
}
}
3.上記のコードを実行すると、テキストメッセージHello!が新しいファイルReadFromTest.txtに表示されます。
コードが文字化けしている理由がわからない場合は、コードを削除する方法を知っている友人がメッセージ領域にコメントできます。