文字ストリーム
バイトストリームを使用してテキストを読み取る場合、特に中国語の文字に遭遇した場合、中国語の文字が複数バイトのストレージを占有する可能性があるため、完全な文字が表示されないことがあります
。Javaはいくつかの文字ストリームクラスを提供しています。ユニットはデータを読み書きし、テキストファイルに特化します
文字入力ストリーム[リーダー]
java.io.Reader抽象クラスは、文字情報をメモリに読み込むことができる文字ストリームの読み取りに使用されるすべてのクラスのスーパークラスを表し、文字入力ストリームの基本的な共通メソッドを定義します
ファイル文字入力ストリーム[FileReader]
ハードディスクファイルのデータを文字モードでメモリに読み込みます
次の画像はそのコンストラクタ
です!!!使い方!!!
public class Demo01Reader {
public static void main(String[] args) throws IOException {
Reader reader = new FileReader("F:\\cccc.txt");
// 存储读取1024个字符
char[] chars = new char[1024];
int len = 0;
// 当读到文件结尾时候 len==-1
while ((len = reader.read(chars)) != -1) {
System.out.println(new String(chars, 0, len));
}
reader.close();
}
}
!!!結果は正しいです!!!
文字出力ストリーム[ライター]
java.io.Writer抽象クラスは、文字ストリームの書き込みに使用されるすべてのクラスのスーパークラスを表し、文字情報をメモリに読み込んで、文字入力ストリームの基本的な共通メソッドを定義します
ファイル文字出力ストリーム[FileWriter]
java.io.FileWriterクラスは、構築中にシステムのデフォルトの文字エンコーディングとデフォルトのバイトバッファーを使用して、ファイルに文字を書き込むのに便利なクラスです。
次の画像はそのコンストラクタです
文字出力ストリームの使用ポイント:
- FileWriterオブジェクトを作成し、宛先をバインドしてコンストラクターにデータを書き込みます
- FileWriterのメソッドライターを使用してデータをメモリバッファーに書き込む(文字をバイトに変換するプロセス)
- FileWriterのメソッドflushを使用して、メモリバッファー内のデータをファイルにフラッシュします。
- リソースを解放します(この前に、メモリバッファー内のデータはファイルに更新されます)
使い方
public class Demo02Writer {
public static void main(String[] args) throws IOException {
Writer writer = new FileWriter("F:\\cccc.txt");
writer.write("囧囧是世界上最漂亮的女孩");
writer.close();
}
}
正常に書き込み、前のファイルの内容を置き換えます
閉じて更新しました
組み込みバッファのため、出力ストリームを閉じないと、ファイルに文字を書き込むことはできませんが、閉じたストリームオブジェクトはデータの書き込みを続けることができません。
データを書き込みたい場合は、別のテクノロジーでストリームを使用する必要があります。フラッシュ方式
- flush:バッファをフラッシュします。ストリームオブジェクトは引き続き使用できます
- close:最初にバッファを更新してから、システムにリソースを解放するよう通知します。ストリームオブジェクトは使用できなくなります
public class Demo02Writer {
public static void main(String[] args) throws IOException {
Writer writer = new FileWriter("F:\\cccc.txt");
writer.write("囧囧是世界上最漂亮的女孩");
writer.flush();
writer.write("囧囧是世界上最漂亮的女孩-2");
writer.close();
}
}
注:flush()メソッドを最初に呼び出すと、バッファデータが強制的にファイルに書き込まれます。closeを呼び出した後は、データの書き込みを続けることはできません。!!
執筆とラッピングを続ける
FileOutputStreamと同様に、ブールコンストラクターがあり、
追加する場合はfalse、追加しない場合はfalseです
。!!コードオン!!!
public class Demo02Writer {
public static void main(String[] args) throws IOException {
Writer writer = new FileWriter("F:\\cccc.txt", true);
writer.write("囧囧是世界上最漂亮的女孩" + "\r\n");
writer.flush();
writer.write("————囧囧是世界上最豆的女孩!" + "\r\n");
writer.close();
}
}
!!!結果が追加されます!!!
jdk 9対jdk 7
jdk7の書き込み方法は、try ... with ...リソースで使用できることがわかっていますが、ここでは説明しませんが、非常に簡単です。
次に、jdk 9の新しい書き込み方法を見てみましょう。
!!!上記のコードはまだファイルをコピーする例です!!!
public class Demo05FileInputStream {
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fis = new FileInputStream("F:\\cccc.txt");
FileOutputStream fos = new FileOutputStream("F:\\dddd.txt");
// jdk 9 的新语法,支持将流放入圆括号中,省略了finally关闭流的操作
try (fis; fos) {
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("复制成功");
}
}