IOストリーム(続き)
入力ストリームと出力ストリーム
-
コンピュータのハードディスク上のデータを、入力と呼ばれるプログラムに読み込みます。つまり、入力して、データを読み込みます。
-
プログラムから外部デバイスへの出力と呼ばれるデータの書き込み、つまり出力、データ書き込み操作の実行
伝送方向
入力ストリーム:プログラムへの読み込みは入力ストリームと呼ばれます。
出力ストリーム:出力ストリームと呼ばれるプログラムから書き出します。
すべての入力ストリームは、InputStreamまたはReaderのサブクラスです。
クラス名がInputStreamで終わるクラスは、すべてInputStreamのサブクラスです。
クラス名がReaderで終わるクラスは、すべてReaderクラスのサブクラスです。
すべての出力ストリームは、OutputStreamまたはWriterのサブクラスです。
名前がOutputStreamで終わるクラスは、すべてOutputStreamのサブクラスです。
名前がWriterで終わるクラスは、すべてWriterのサブクラスです。
バイトストリームと文字ストリーム
データストリームのエンコード形式からに分割
-
バイトストリーム
-
キャラクターストリーム
InputStreamとOutputStreamのサブクラスはバイトストリームです
主にオーディオ、画像、曲、バイトストリームを処理するバイナリファイルの読み取りと書き込みが可能で、処理単位は1バイトです。
バイトストリームの共通クラス
バイト入力ストリームFileInputStream
バイト出力ストリームFileOutputStream
ReaderとWriterのサブクラスは文字ストリームです
-
主に文字または文字列を扱い、文字ストリーム処理単位は2バイトです。
-
バイトストリームによって読み取られたバイトデータは、指定されたエンコーディングテーブルに移動して、対応するテキストを取得します。
文字ストリームの一般的なクラス
文字入力ストリームFileReader
文字出力ストリームFileWriter
package day2;
import java.io.*;
public class StreamDemo {
public static void main(String[] args) throws IOException {
File file=new File("D:\\789.txt");
FileInputStream in=null;
FileOutputStream out=null;
try {
//文件输入字节流(输入管道)
in=new FileInputStream(file);
int b=0;
//指定输出文件地址,如果文件不存在,就会自动创建
out=new FileOutputStream("D:\\jei.txt");
while ((b=in.read())!=-1){
//System.out.println(b);
out.write(b);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("路径不正确");
} catch (IOException e) {
e.printStackTrace();
System.out.println("读写终止");
}finally {
in.close();//即使不出异常,也要关闭读写过程
out.close();
}
}
}
package day2;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class StreamDemo2 {
public static void main(String[] args) throws IOException {
File f=new File("D:\\常用工具包\\取色.exe");
f.createNewFile();
//输入流 向程序中读入数据
FileInputStream in=new FileInputStream(f);
//输出流 从程序向外输出数据
FileOutputStream out=new FileOutputStream("D:\\常用工具包\\色.exe");
byte[] b=new byte[1024];
int length = 0;
while ((length=in.read(b))!=-1){
System.out.println(length);
out.write(b,0,length);
}
in.close();
out.close();
}
}
package day2;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class StreamDemo3 {
public static void main(String[] args) throws IOException {
//输入流 向程序中读入数据
FileInputStream in = new FileInputStream("D:\\feiQ.exe");
//输出流 从程序向外输出数据
FileOutputStream out = new FileOutputStream("F:\\feiQ12.exe");
/*
FileInputStream int read(); 每次从输入流中读取一个字节 返回编码 文件读完返回-1
int read(byte[] b) 每次从输入流中读一个byte数组个字节,
返回的是数组中实际装入的字节数量,文件读完返回-1
FileOutputStream write(int b) 一次向外写一个字节
write(b,0,length);
一个向外输出一个byte数组,从指定的位置开始,写length个长度
*/
byte[] b = new byte[1024];
int length=0;
while((length=in.read(b))!=-1){
System.out.println(length);
out.write(b,0,length);
}
in.close();
out.close();
}
}
さまざまなパッケージタイプに応じて、ストリームはに分割されます
ノードフロー
処理フロー
ノードフロー:
ストリームがファイル、文字列、文字列配列などの特定のデータソースをカプセル化する場合、それはノードストリームと呼ばれます。
処理フロー。
ストリームが他のストリームオブジェクトをカプセル化する場合、それは処理ストリームと呼ばれます。
処理ストリームは、いくつかの新しいメソッドを追加しながら、読み取りと書き込みの効率を向上させるバッファ機能を提供します。
ノードフローの共通クラス
バイト入力ストリームFileInputStream
バイト出力ストリームFileOutputStream
文字入力ストリームFileReader
文字出力ストリームFileWriter
処理フローの一般的なクラス
BufferedOutputStream BufferedOutputStream
バッファリングされた入力ストリームBufferedInputStream
バッファリングされた文字入力ストリームBufferedReader
バッファリングされた文字出力ストリームBufferedWriter
package day2;
import java.io.*;
public class StreamDemo4 {
public static void main(String[] args) throws IOException {
/*
节点流:直接包含的是文件,字符串等数据
处理流:包含的是其他流对象
BufferedInputStream, BufferedoutputStream 内部提供一个缓冲数组
*/
File f=new File("D:\\常用工具包\\取色.exe");
FileInputStream bin=new FileInputStream(f);
//输入流 向程序中读入数据 节点流 包含的是文件,字符串等数据
BufferedInputStream bf=new BufferedInputStream(bin);
//输出流 从程序向外输出数据
FileOutputStream out=new FileOutputStream("D:\\常用工具包\\色.exe");
BufferedOutputStream bout=new BufferedOutputStream(out);
byte[] b=new byte[1024];
int length=0;
while ((length=bf.read(b))!=-1){
bout.write(b,0,length);
}
bf.close();
bout.flush();//刷新缓冲输出流
bout.close();
}
}
入力および出力ノードの文字ストリーム
リーダーの基本的な方法
文字を読み取り、整数として返します。
-1が返される場合は、入力ストリームの終わりに達しています。
int read()はIOExceptionをスローします
一連の文字を読み取り、それらを配列バッファーに格納します。
実際に読み取られた文字数を返します。読み取る前に入力ストリームの終わりに達した場合は-1を返します。
int read(char [] cbuf)はIOExceptionをスローします
シャットダウン
void close()はIOExceptionをスローします
ライターの基本的な方法
文字データを出力ストリームに書き込みます。バイトデータはパラメータbの16ビットです。
void write(int c)はIOExceptionをスローします
文字型配列のデータは、出力ストリームに書き込まれます。
void write(char [] cbuf)はIOExceptionをスローします
文字型配列の指定された位置(オフセット)から開始します
長さ文字は出力ストリームに書き込まれます
void write(char [] cbuf、int offset、int length)はIOExceptionをスローします
注:
文字ストリームはプレーンテキストのみを読み取ることができます
package day2;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class ReaderWriteDemo {
public static void main(String[] args) throws IOException {
//字符流,每次直接读到字符,底层有一个转换流
//字符流只能读纯文本文件
FileReader reader=new FileReader("D:\\jei.txt");
FileWriter writer=new FileWriter("D:\\jei1.txt");
/*System.out.println(reader.read());
System.out.println(reader.read());
System.out.println(reader.read());
System.out.println(reader.read());
System.out.println(reader.read());*/
int c=0;
while ((c=reader.read())!=-1){
writer.write(c);
}
reader.close();
writer.flush();
writer.close();
}
}
package day2;
import java.io.*;
public class ReaderWriteDemo3 {
public static void main(String[] args) throws IOException {
//字符流,每次直接读到字符,底层有一个转换流
//字符流只能读纯文本文件
FileReader reader=new FileReader("D:\\jei.txt");
BufferedReader br=new BufferedReader(reader);
//向文件中追加内容
FileWriter writer=new FileWriter("D:\\jei1.txt",true);
BufferedWriter bw=new BufferedWriter(writer);
String str=null;
while ((str=br.readLine())!=null){
System.out.println(str);
bw.write(str);
bw.newLine();//追加内容时换行
}
br.close();
bw.flush();
bw.close();
}
}