A、IOストリームの概要と分類
1概要:を介してデータストリーム上のデバイス、Javaオペレーションの間のデータ転送を処理するためのIOストリーム、JavaはIOパッケージの動作フローのためのオブジェクト
2、IOストリーム分類
データフローに従って
入力ストリーム | 出力ストリーム |
---|---|
読み取りデータ | 書き込みデータ |
データの種類によると、
バイトストリーム | 文字ストリーム |
---|---|
あなたは、このようなオーディオビデオ、テキストファイルなど、あらゆるタイプのファイルを読み書きすることができます | あなたは、テキストファイルを読み書きすることができます |
抽象ベースクラスのバイトストリーム:のInputStream、OutputStreamの | 抽象ベースクラスの文字ストリーム:リーダー、ライター |
バイト入力ストリームのInputStream、バイト出力ストリームのOutputStream | 文字入力ストリームリーダー、文字出力ストリームライター |
注:これは、4つの抽象基本クラスから派生し、その親のサブクラス名の名前にサフィックスとしてサブクラス名です。
第二に、文字ストリーム
1、のFileOutputStreamの書き込みデータ
①、コンストラクタ
たFileOutputStream(ファイルファイル)//データファイルを記述するためのファイルを作成し、出力ストリームで指定されたFileオブジェクトによって表されます。
FileOutputStream(文字列名)//出力ファイルストリームの指定された名前のファイルへの書き込みデータを作成します。
②、たFileOutputStream 3個の書き込み()メソッド
公共ボイドライト(int型B):カットバイトの前のバイト書き込みつ以上のバイト
公共ボイドライト(バイト[] B ): バイト配列書く
公共ボイドライト(バイト[] B、オフint型 、INT LEN): 書き込みバイトアレイ部
③、たFileOutputStreamライトデータ追記実装と改行
ウィンドウズ | Linuxの | マック |
---|---|---|
\ rを\ nは | \ nは | \ rを |
FileOutputStream(文字列名、ブールAPPEND) 、追記するかどうかを表すパラメータ2
例:たFileOutputStreamアウト=新しいのFileOutputStream( " B.TXT"、真の); // trueが追加書き込みを表し、
public class MyIODemo {
public static void main(String[] args) throws IOException {
//参2 代表是否追加写入
//FileOutputStream(String name, boolean append)
//创建一个向具有指定 name 的文件中写入数据的输出文件流。
FileOutputStream out = new FileOutputStream("b.txt",true);//true 表示追加写入
out.write(97); //一次写入一个字节
out.write(98);
//写入一个字节数组
out.write("\r\n".getBytes());//换行
out.write("像我这样优秀的人,本该灿烂过一生".getBytes());
out.write("\r\n".getBytes());
//写入字节数组的一部分 从某个索引开始,写多少个字节
out.write("怎么二十多年到头来,还在人海里浮沉".getBytes(),0,27);
out.write("\r\n".getBytes());
//流使用完毕之后,必须释放资源
out.close();
}
}
図3は、FileInputStreamのデータ読み取り
①、入力バイトは、ファイルシステム、ファイルから取得され
②、FileInputStreamを(文字列名)
実際のファイルに接続されたFileInputStreamを、ファイル・システム・パス名を介してファイルを開くことによって作成されます名前が指定されました。
③、FileInputStreamを(ファイルのファイル)は
、実際のファイル、ファイル・システム・ファイル・オブジェクト・ファイルで指定されたファイルへの接続を開くことにより、FileInputStreamを作成します。
④、ファイル入力ストリームないが関連付けられている場合、エラーが報告されている
INT()は読み取り:1バイト、非効率的な読み取り
バイト[]バイト=新しい新しいバイト[1024];
int型LEN = in.read(バイト) ; //戻り値一度読み込みが有効なのバイト数読み込むことバイトの配列です
注:使用後のストリームの後に、リソースを解放しなければならない
4バイトの入力および出力フロー効率
なBufferedOutputStreamが(OutputStreamをアウト)新しいを作成します。指定された基本となる出力ストリームに書き込みデータにバッファリングされた出力ストリーム。
BufferedInputStreamを(で入力ストリームは)BufferedInputStreamを作成し、後で使用するために、その引数である入力ストリームを保存します。
実質的に、入力と出力の同じ効率的な使用は、バイトストリーム実質ストリーム
ケース、5
分别使用使用高效字节流和基本字节流复制文件
public class MyDemo3 {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
copy2(); //耗时18542毫秒 耗时13802毫秒
copy1(); //耗时14046毫秒 耗时14331毫秒
long end = System.currentTimeMillis();
System.out.println("耗时"+(end-start)+"毫秒");
}
private static void copy2() throws IOException {
FileInputStream in = new FileInputStream("E:\\我的图片和音乐\\疯狂动物城.mp4");
FileOutputStream out = new FileOutputStream("D:\\疯狂动物城.mp4");
//创建一个数组缓冲区
byte[] bytes = new byte[1024*8];
int len = 0; //记录读取到的有效的字节个数
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
out.flush();
}
in.close();
out.close();
}
private static void copy1() throws IOException {
BufferedInputStream in = new BufferedInputStream(new FileInputStream("E:\\我的图片和音乐\\疯狂动物城.mp4"));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("D:\\疯狂动物城.mp4"));
byte[] bytes = new byte[1024*8];
int len=0;
while ((len=in.read(bytes))!=-1){
out.write(bytes,0,len);
}
out.close();
in.close();
}
}
第三には、文字ストリーム
ので、文字ストリームの1が表示されます:中国事業によるバイトストリームは、特に便利ではないので、Javaが文字ストリームを提供します。
= +バイトストリーム文字列コード表
2、Stringクラスの中で問題を符号化及び復号化
コード:文字列をバイト配列に変換され、読み出しに読み込むことができます
- 公共バイト[] GetBytesメソッド();プラットフォームのデフォルトの文字セットエンコーディングを使用して、結果を新規バイト配列に格納し、文字列、バイトこのシーケンスです。
- この文字列を符号化指定された文字セットを使用してパブリックバイト[] GetBytesメソッド(文字列たcharsetName)はバイト配列であり、そして新しいバイト配列に結果を格納します。
デコード:読み取りに、文字列にバイト配列に変換するには、理解することができます
- 公共の文字列(バイト[]バイト):インターネットデコードされたバイト配列、新しい構造の文字列を使用して指定します。デフォルトの文字セット。
- パブリック文字列(バイト[]バイト、文字列たcharsetName)バイト配列は、新しい文字列を作成、指定された文字セットのデコーディングを使用して指定されました。
図3に示すように、転流のOutputStreamWriterの使用
①、のOutputStreamWriterは
ブリッジ文字はバイトストリームにストリームされる:コードテーブルがバイトにストリームに書き込まれた文字コードを指定するために使用することができます。これは、文字セットは、名前で指定するか、または明示的に与えられ、それ以外の場合は、プラットフォームのデフォルトの文字セットを受け入れることができます使用しています。
②、コンストラクタ
:OutputStreamWriterを(OutputStreamのうち)//作成するデフォルトの文字エンコーディングのOutputStreamWriter。
B:のOutputStreamWriter(OutputStreamのうち、文字セット CS)//はのOutputStreamWriter指定された文字セットを作成します。
注:出力ストリームに関連付けられたファイル、およびでない場合、システムが自動的に作成されます
③、5つの忠書き込み文字方向データフロー
public void write(int c) 写一个字符
public void write(char[] cbuf) 写一个字符数组
public void write(char[] cbuf,int off,int len) 写一个字符数组的 一部分
public void write(String str) 写一个字符串
public void write(String str,int off,int len) 写一个字符串的一部分
举例:
public class MyDemo {
public static void main(String[] args) throws IOException {
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("a.txt"));
//往文件中写入数据
out.write('尼'); //一次写入一个字符
out.write("\r\n");
out.flush();
out.write("我爱学java");
out.write("\r\n");
out.flush();
out.write("路慢慢慢其修远兮,吾将上下而求索", 0, 8);
out.write("\r\n");
out.flush();
out.write(new char[]{'a', '9', 98, 'e'});
out.write("\r\n");
out.write(new char[]{'我', '爱', '你', '们'}, 2, 2);
out.write("\r\n");
//字符流 需要将数据从缓冲区刷新过去
out.flush();
out.close(); //刷新并关闭
}
}
図4に示すように、ストリームを使用して変換InputStreamReaderの
①コンストラクタ
InputStreamReaderの(入力ストリームである):デフォルトエンコーディング(GBK)データ読み出し
InputStreamReaderの(入力ストリームは、文字列たcharsetNameある) : を用いて符号化されたデータは、指定された読み出す
読み出しの二種類を②、文字ストリームデータの形式
一文字読み取るため公共int型のリード()
公共intは読み取る(CHAR [] CBUFは ) 読んでいない場合は、1つの文字列または-1を読み出し
public class CopyFile2 {
public static void main(String[] args) throws IOException {
InputStreamReader in = new InputStreamReader(new FileInputStream("a.txt"));
OutputStreamWriter out = new OutputStreamWriter(newFileOutputStream("b.txt"));
//创建一个字符缓冲区
char[] chars = new char[100];
int len = 0; //len 是记录 你每次读取到的有效的字符个数
while ((len=in.read(chars)) != -1) {
out.write(chars, 0, len);//
out.flush(); //字符流记得刷新一下
}
//释放资源
in.close();
out.close();
}
}
5、便利な文字ストリームクラス
名が長すぎストリーム変換である、と私たちは私たちに、ストリームクラスに対応した簡単な変換を与えるJAVA、一般的な文字セットを開発する必要はありませんので。唯一の欠点は、あなたがエンコーディングを指定することはできませんということです。
変換の流れ | コンビニエンスクラス |
---|---|
OutputStreamWriter | FileWriter |
InputStreamReader | FileReade |
FileWriter(ファイルファイル)は、ファイル・オブジェクトを指定してFileWriterオブジェクトを構築します。
FileWriter(文字列filename)で、構成FileWriterオブジェクトは、ファイル名を与えられました。
6、ブック効率的な文字入力ストリーム
①、効率的な文字出力ストリーム:BufferedWriterの//書き込みデータの
コンストラクタ:公共BufferedWriterの、(ライターW)
②、効率的な文字入力ストリーム:BufferedReaderの//データを読み込む
コンストラクタ:公共BufferedReaderの(リーダー電子)
特殊機能③、文字バッファストリーム
BufferedWriterのします。public void改行():システムが互換性を持つ改行改行方式を決定。
BufferedReaderの:パブリック文字列のreadLine():一度読み取り改行改行がデータを返すのはnullを読むことができたラッピングにマークされているデータの行を読んで。
举例://使用高效的字符流,采用读取一行,写入一行的方式来复制文本文件
public class MyDemo8 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new FileReader("a.txt"));
//BufferedWriter(Writer out)
//创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter out = new BufferedWriter(new FileWriter("b.txt"));
String line=null; //记录每次读取到的一行文本
while ((line=in.readLine())!=null){ //这里注意读取不到返回null
out.write(line);
out.newLine(); //写入一个换行符
out.flush();//刷新
}
//释放资源
out.close();
in.close();
}
}