IOストリーム-一般的に使用されるストリームオブジェクト(4)
-
ファイルバイトストリーム
FileInputStreamはバイト単位でファイルを読み取り、すべてのタイプのファイル(画像、ビデオ、テキストファイルなど)の読み取りに適しています。Javaには、テキストファイルを読み取るためのFileReaderも用意されています。
FileOutputStreamは、すべてのタイプのファイルに適したバイト単位のデータファイルに書き込みます。Javaには、テキストファイルの書き込み専用のFileWriterも用意されています。
-
ファイルバイト入力ストリーム
import java.io.FileInputStream; public class FileStreamDemo { public static void main(String[] args) { FileInputStream fis=null; try { //创建文件字节输入对象 fis=new FileInputStream("d:/sxt.png"); int temp=0;//先定义一个临时变量 while ((temp = fis.read())!=-1){ System.out.println(temp); } }catch (Exception e){ e.printStackTrace(); }finally { try { if (fis!=null){ fis.close(); } }catch (Exception e){ e.printStackTrace(); } } } }
-
ファイルバイト出力ストリーム
import java.io.FileInputStream; import java.io.FileOutputStream; public class FileStreamDemo { public static void main(String[] args) { FileInputStream fis=null; FileOutputStream fos=null; try { //创建文件字节输入对象 fis=new FileInputStream("d:/sxt.png"); //创建文件字节输出流 fos=new FileOutputStream("d:/aa.png"); int temp=0;//先定义一个临时变量 while ((temp = fis.read())!=-1){ fos.write(temp); } //将数据从内存中写入到磁盘中,刷新 fos.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (fis!=null){ fis.close(); } if (fos!=null){ fos.close(); } }catch (Exception e){ e.printStackTrace(); } } } }
-
-
バッファを介した読み取りおよび書き込み効率の向上
-
方法1:IOストリームの読み取りおよび書き込み効率を向上させるために、バッファーとして指定された長さのバイト配列を作成します。この方法は、大きな画像を読み取るときのバッファ定義に適しています。注:バッファーの長さは、2の整数乗である必要があります。一般に、1024の長さがより適切です。
-
効率が遅くなり、スペースを節約できます。
import java.io.FileInputStream; import java.io.FileOutputStream; public class FileStreamBuffedDemo { public static void main(String[] args) { FileInputStream fis=null; FileOutputStream fos=null; try { //创建文件字节输入对象 fis=new FileInputStream("d:/itbz.png"); //创建文件字节输出流 fos=new FileOutputStream("d:/aa.png"); //创建一个缓冲区,提高读写效率 byte[] buff=new byte[1024];//相当于那个一个包,可以更快的运200斤的大米。不用在一粒一粒的搬 int temp=0;//先定义一个临时变量 while ((temp = fis.read(buff))!=-1){ //这里的read()要选择有数组类型的 fos.write(buff,0,temp);//write选择三个参数的,buff数组相当于把包带进来,然后从大米里的包拿多少,当然是一次拿一包 } //我给的数组长度,起始从0开始,到temp(读完数组的长度),就相当于一次拿一整包大米 //将数据从内存中写入到磁盘中,刷新 fos.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
-
方法2:バイト配列をバッファーとして使用します。配列の長さは、入力オブジェクトのavailable()によって返される現在のファイルの推定長さによって定義されます。ファイルの読み取りと書き込みを行う場合、ファイルの読み取りと書き込みの操作は1回の読み取りと書き込みの操作で完了します。注:ファイルが大きすぎると、メモリ使用量も大きくなります。したがって、この方法は大きなファイルにはお勧めできませんが、方法1をお勧めします。
-
効率は速いですが、多くのスペースが無駄になります。
import java.io.FileInputStream; import java.io.FileOutputStream; public class FileStreamBuffer2Demo { public static void main(String[] args) { FileInputStream fis=null; FileOutputStream fos=null; try { //创建文件字节输入对象 fis=new FileInputStream("d:/itbz.png"); //创建文件字节输出流 fos=new FileOutputStream("d:/aa.png"); //创建一个缓冲区,提高读写效率 byte[] buff=new byte[fis.available()];//相当于那个一个包,用字节输入流的available()方法,返回文件的预估大小的值,也就是他要一次性拿走200斤的大米 int temp=0;//先定义一个临时变量 fis.read(buff);//直接一次读这个数组 fos.write(buff);//直接一次写这个数组,不用再去循环的读写操作了,因为力气大,直接一次扛走200斤大米 //将数据从内存中写入到磁盘中,刷新 fos.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
-
-
バイトバッファストリームによる読み取りと書き込みの効率の向上
Javaバッファストリーム自体にはIOストリームの読み取りおよび書き込み機能はありませんが、他のストリームをパッケージ化するのと同じように、効率を向上させるためにバッファ機能が他のストリーム(ノードストリームまたは処理ストリーム)に追加されます。バッファストリームは処理ストリーム(パッケージングストリーム)です。
ファイルやその他のデータソースに対して頻繁に読み取りと書き込みを行う場合、効率は比較的低くなります。このとき、バッファストリームを使用すると、情報の読み取りと書き込みをより効率的に行うことができます。バッファストリームは最初にデータをキャッシュし、バッファがいっぱいになった後、または手動で更新されたときに、プログラムまたは書き込み先にデータを1回読み取るためです。したがって、キャッシュストリームは依然として非常に重要です。パフォーマンスを向上させるために、IO操作時にバッファストリームを追加することを忘れないでください。
BufferedInputStream BufferedOutputStremと2つのストリームは、内部キャッシュ配列を通るフローの操作の効率を向上させるためにバッファリングされたバイトストリームです。
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; public class FileStreamBuffered3Demo { public static void main(String[] args) { FileInputStream fis=null; FileOutputStream fos=null; BufferedInputStream bis=null; BufferedOutputStream bos=null; try { fis=new FileInputStream("d:/itbz.png"); bis=new BufferedInputStream(fis);//定义字节输入缓冲流,去嵌套文件字节输入流 fos=new FileOutputStream("d:/cc.png"); bos=new BufferedOutputStream(fos);定义字节输出缓冲流,去嵌套文件字节输出流 //缓冲流中的byte数组长度默认是8192 int temp=0; while ((temp=bis.read())!=-1){ //利用嵌套完之后的缓存流去读数据 bos.write(temp);//利用嵌套完之后的缓存流去写数据 } }catch (Exception e){ e.printStackTrace(); }finally { try { //注意:关闭流的顺序:后开先闭 if (bis!=null){ bis.close(); } if (fis!=null){ fis.close(); } if (bos!=null){ bos.close(); } if (fos!=null){ fos.close(); } }catch (Exception e){ e.printStackTrace(); } } } }
- ストリームを閉じるためのシーケンス処理図:
-
定義ファイルコピーツール
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; public class FileCopyTools { public static void main(String[] args) { copyFile("d:/itbz.png","d:/abc.png");//直接用了copyFile方法去完成了拷贝处理,给定源和目标的路径 } /** * 文件拷贝方法 */ public static void copyFile(String src,String des){ //src:你从哪个位置拷贝文件(源),des:你的文件要拷贝到什么位置(目的地) FileInputStream fis=null; FileOutputStream fos=null; BufferedInputStream bis=null; BufferedOutputStream bos=null; try { bis=new BufferedInputStream(new FileInputStream(src));//src:从源去读取文件 bos=new BufferedOutputStream(new FileOutputStream(des));//des:拷贝到目的地 int temp=0; while ((temp=bis.read())!=-1){ bos.write(temp); } bos.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try { if (bis!=null){ bis.close(); } if (fis!=null){ fis.close(); } if (bos!=null){ bos.close(); } if (fos!=null){ fos.close(); } }catch (Exception e){ e.printStackTrace(); } } } }