java fileoutputstream/fileinputstream

3686 ワード

目次
 
一:FileInputStream/FileOutputStream
二:改善されたレプリケーション機能.
2.1注意すべき点は
一:FileInputStream/FileOutputStream
まずコンピュータが認識するのはすべてバイナリなので、ファイルを読み取る第一歩はファイル接続を確立し、それからバイトパスを構築することであり、javaのすべてのI/Oはバイトストリームから始まり、いわゆる文字ストリームもバイトストリームに基づいて行われるバイトストリームが文字ストリームに変換される操作である.この点はもう私の前の文章で話したことがある.
File file = new File("");
#バイトパスの構築
FileInputStream fileInputstream= new FileInputStream/(file);
バイトストリームを構築し、読み取り操作を開始しました.次に、一般的な読み取り方法をいくつか紹介し、注意点を説明します.
fileOutputStream.read():read()無参のこの方法は、あなたが読み取った単一バイトの10進数表現を返します.なぜですか.バイナリに戻ってもそれが何なのか分からないからです.この方法では、一度に呼び出すと1バイトしか返されないので、すべてのファイル内容を取得するには、ループ取得データにループ終了のポイントが必要である以上、read()が-1を返すとファイルの読み取りが終了します.私の簡単なファイルを見てみましょう.(自分でテストしてほしいのですが、次のコードの機能はa.txtの内容をバイトごとに読み出してb.txtに書き込むことです)
package test;
import java.io.*;
public class test {
    private static String a;
    public static void main(String[] args) throws IOException, InterruptedException {
        
        File file = new File("C:\\Users\\Administrator\\Desktop\\a.txt");
        FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\info1\\b.txt");
        FileInputStream fileInputStream =new FileInputStream(file);
        int b=0;
         while ((b=fileInputStream.read())!=-1){
             fileOutputStream.write(b);
         }
         fileInputStream.close();
         fileOutputStream.flush();
         fileOutputStream.close();

    }
}

二:改善されたレプリケーション機能.
 
上の機能は大丈夫ですが、私たちはちょっと、このコピーは1つのファイルから1バイトずつ読み取って別のファイルに1バイトずつ書き込むので、あなたは面白いのではないでしょうか.これはあまりにもlowでしょう.一番いい方法はもちろん、私たちが大きな列に値をつけることができますよね.そうですね.次に、次の改良版のレプリケーション機能を見てみましょう.あまりコードを言わない.
public class test {
    private static String a;
    public static void main(String[] args) throws IOException, InterruptedException {
        File file = new File("C:\\Users\\Administrator\\Desktop\\a.txt");
        FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\info1\\b.txt");
        FileInputStream fileInputStream =new FileInputStream(file);
        byte[] by = new byte[50];
        int length=0;
         while ((length=fileInputStream.read(by))!=-1){
             fileOutputStream.write(by,0,length);
             //fileOutputStream.write(by);
         }
         fileInputStream.close();
         fileOutputStream.flush();
         fileOutputStream.close();

    }
}

上のコードを説明します.このコードと上の違いは大きくありません.コアの変更はby[]配列です.これは私が今50バイトを一度に読み出し、読み出した50バイトをby[]配列に入れ、write()メソッドを呼び出してこのby[]を新しいファイルに書き出します.
2.1注意すべき点は
  • read(by)この方法はread()無パラメータの方法とは異なり,前者は読み出したバイトをby[]に入れながら読み出したバイトの個数lengthを返す.後者read()は、読み込まれる現在のバイトです.読み取りが終了すると-1.
  • に戻る.
  • 上のコードの注釈部分に注意してください.これは私が言いたいポイントです.上のコードをよく考えてみると、私が読むたびに50バイトで、by[]配列のデータが次のデータで上書きされるメカニズムに問題があります.

  •          もし私のデータが140バイトあったら、私は毎回50バイトを読みます.
             初めて50を読みましたが、大丈夫です.by[]のデータを書き出します.このときby[]のデータは新しいファイルに書き込まれますが、by[]のデータはまだあります.
             2回目に50バイトを読み込むと、この新しい50バイトが1回目のby[]のデータを1つずつ置き換えます.そしてby[]を书くと、この时点でby[]のデータは残っていますが、1回目に比べて2回目のデータで、1回目のデータは永久に消え、2回目の読み取りに置き換えられました.
             3回目:今回再び読み込むなど、データは40バイトしかありません.OKを読み取り、2ステップ目のby[]の最初の4 10バイトを置き換えて書きます.  ここまであなたの発見問題はありません.3回目はby[]の最初の4十バイトしかカバーしていないので、この時あなたが書くと問題があります.この時、あなたはもっと何かを書いたことに気づきます.   2回目に読み取ったデータの50バイトはby[]の中にあるので、最初の4、10バイトをカバーして10個残っています.この10バイトはあなたがコピーしたものです.   はい、これが//fileOutputStream.write(by);この注釈のコードの問題は、全部書くことはできません.最初の4、10個だけ書けばいいのですが、//fileOutputStream.write(by)はby全体のデータを全部書くのが問題です.
      実際には、最初の4つが私たちが3回目に読み取った実際のデータの長さです.これが fileOutputStream.write(by,0,length);の由来です.
    今日はまずここまで、残りのI/Oは一つ一つ説明します.  you  next.