Java io ストリームの学習メモ

PS: 元の単語のほとんどは参考資料からのものであり、要約は非常に優れているため、変更していません。

1. IOストリームでできること

IO を通じて、ハードディスク ファイルの読み取りと書き込みを行うことができます。(ネットワーク データの送信には io も含まれます)。

2. IOストリームの分類


流れの方向に応じて分類し、入力フローと出力フローに分けます。

メモリに移動します: input (Input)と呼ばれます。または、read (Read)と呼ばれます。
メモリから:出力 (Output)と呼ばれます。または、write (Write)と呼ばれます。


データを読み取る
さまざまな方法に応じて分類します。データをバイト単位で読み取る方法と、一度に 1 バイトずつ読み取る方法 (これは、一度に 8 バイナリ ビットを読み取るのに相当します)。
このストリームはユニバーサルでありあらゆるタイプのファイルを読み取ることができます。含まれるもの: テキスト ファイル、画像、サウンド ファイル、ビデオ ファイルなど...

データを文字形式で読み取ります
一度に 1 文字ずつ読み取ります。このストリームは、通常のテキスト ファイルの読み取りの便宜のために存在します。このストリームは読み取ることができません: 画像、サウンド、ビデオ、その他のファイル。読み取れるのはプレーン テキスト ファイルのみで、Word ファイルも読み取れません。

注:
プレーン テキスト ファイルには、.txt ファイルだけでなく、.java、.ini、および .py も含まれます。つまり、メモ帳で開けるファイルは普通のテキストファイルであれば大丈夫です。

3. IOストリームの最上位の親クラス

    - バイト入力ストリーム:最上位の親クラス:InputStream --> 抽象クラスの共通サブクラス:FileInputStream
    - バイト出力ストリーム:最上位の親クラス:OutputStream --> 抽象クラスの共通サブクラス:FileOutputStream
    - 文字入力ストリーム:最上位親クラス : Reader --> 抽象クラスの共通サブクラス: FileReader
    - 文字出力ストリーム: 最上位の親クラス: Writer --> 抽象クラスの共通サブクラス: FileWriter

4. Java でマスタリングするストリーム (16)

1. ファイル専用:

  • java.io.FileInputStream(マスター)¶
  • java.io.FileOutputStream(マスター)¶
  • java.io.FileReader
  • java.io.FileWriter

2. 変換ストリーム: (バイトストリームを文字ストリームに変換します)

  • java.io.InputStreamReader
  • java.io.OutputStreamWriter

3. バッファストリーム排他的:

  • java.io.BufferedReader
  • java.io.BufferedWriter
  • java.io.BufferedInputStream
  • java.io.BufferedOutputStream

4. データストリーム排他的:

  • java.io.DataInputStream
  • java.io.DataOutputStream

5. 標準出力ストリーム:

  • java.io.PrintWriter
  • java.io.PrintStream(マスター)¶

6. オブジェクト固有のフロー:

  • java.io.ObjectInputStream(マスター)¶
  • java.io.ObjectOutputStream(マスター)¶

7.ファイルクラス

  • java.io.ファイル

5. 入力ストリーム

PS: 以下の try および catch catch 例外の多くは私が書いたものではありません。もちろん、初めて作成する場合は自分で入力することもできますが、alt + z を直接素早く生成できます。

さらに、これらの一般的に使用されるいくつかの方法 (と思う) は、実際には最初のいくつかを書きますが、残りは覚えやすいです。

私のconf.txtファイルはsrcと同じディレクトリにあります。

ファイル入力ストリーム

public class IODemo1 {
    public static void main(String[] args)  {
        File file = new File("conf.txt");
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file);

            byte[] bytes = new byte[3]; // 做缓存用的,一次最多4个字节
            int redCount = 0;

            // inputStream去读取,而每次读取到的字节文件存放到bytes中。
            while ((redCount = inputStream.read(bytes)) != -1){ // read读取值是字节数量,读取不到返回-1
                System.out.println("转换后的字符:"+new String(bytes, "UTF-8"));
                System.out.println("读取字节数量:"+redCount);
                System.out.println("----------------");
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            // 失败与否都要关闭io
            if(inputStream != null){ // 判断文件是否为null
                try{
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

入力ストリームリーダー

そういう書き方もあるんですね。

バイト入力ストリームを文字入力ストリームに変換します。

public class IODemo {
    public static void main(String[] args)  {
        File file = new File("conf.txt");
        FileInputStream inputStream = null;
        InputStreamReader inputStreamReader = null;
        try {
             inputStream = new FileInputStream(file);
             inputStreamReader = new InputStreamReader(inputStream,"UTF-8"); // 转换为为字符输入流

            byte[] bytes = new byte[3]; // 做缓存用的,一次最多4个字节
            char[] chars = new char[1];
            int redCount = 0;

            // inputStream去读取,每次读取到字节存放到bytes中。
            //while ((redCount = inputStream.read(bytes)) != -1){ // read读取值是字节数量,读取不到返回-1
            //    System.out.println("转换后的字符:"+new String(bytes, "GBK"));
            //    System.out.println("读取字节数量:"+redCount);
            //}
            System.out.println("---------------");
            // 对一个文件不能同时开2个输入流
            while ((redCount = inputStreamReader.read(chars)) != -1){
                System.out.println("读取字符数量:"+redCount);
                for (char aChar : chars) { // 遍历缓冲字符数组
                    System.out.println(aChar);
                }
                System.out.println("将字符数组转换成字符串:"+ new String(chars));
                System.out.println("---------------");
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            // 失败与否都要关闭io
            if(inputStreamReader != null){
                try{ // 流的关闭要区分顺序,先关闭外层也就是包装那一层
                    inputStreamReader.close();
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }
}

ファイルリーダー

ファイル文字読み出し形式

public class FileReaderDemo {
    public static void main(String[] args) {
        File file = new File("conf.txt");
        FileReader fileReader = null;
        try {
            char[] chars = new char[4];
            int readCount = 0;
            fileReader = new FileReader(file);
            while ((readCount = fileReader.read(chars)) != -1){
                System.out.println(new String(chars));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(fileReader != null){
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

バッファリーダー

独自のキャッシュを持つ文字入力ストリーム。コンストラクター パラメーターは文字入力ストリームです。

public class BufferReaderDemo {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("conf.txt");
        // 当一个流的构造方法中需要一个流的时候,这个被传进来的流叫做:节点流。
        // 外部负责包装的这个流,叫做:包装流,还有一个名字叫做:处理流。
        // 像当前这个程序来说:FileReader就是一个节点流。BufferedReader就是包装流/处理流。
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        String str = null;
        while ((str = bufferedReader.readLine()) != null){ // readLine()方法读取一个文本行,但不带换行符。
            System.out.println(str);
        }

        bufferedReader.close(); // 关闭最外层即可
    }
}

オブジェクト入力ストリーム

オブジェクトを逆シリアル化する

        // 反序列化
        ObjectInputStream oin = new ObjectInputStream(new FileInputStream("conf1.txt"));
        Object o = oin.readObject();
        System.out.println(o);

6. 出力ストリーム

ファイル出力ストリーム


public class IoDemo2 {
    public static void main(String[] args) {
        File file = new File("conf.txt");
        FileOutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream(file,true); // 开启文件追加模式
            String wls = "万乐姝";
            byte[] bytes = wls.getBytes(StandardCharsets.UTF_8); // 将string转换为字节文件
            outputStream.write(bytes); // 写入
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(outputStream != null){
                try {
                    outputStream.flush(); // 先刷新在关闭,否则可能有bug
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

出力ストリームライター

public class IoDemo2 {
    public static void main(String[] args) {
        File file = new File("conf.txt");
        FileOutputStream outputStream = null;
        OutputStreamWriter outputStreamWriter = null;
        try {
            outputStream = new FileOutputStream(file,true); // 开启文件追加模式
            outputStreamWriter = new OutputStreamWriter(outputStream);
            outputStreamWriter.write("万乐姝");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(outputStream != null){
                try {
                    outputStreamWriter.flush(); // 先关闭外层流
                    outputStreamWriter.close();
                    outputStream.flush();
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

ファイルライター

public class FileWriterDemo {
    public static void main(String[] args) {
        File file = new File("conf.txt");
        FileWriter fileWriter = null;
        try {
            fileWriter = new FileWriter(file,true); // 开启文件追加模式
            fileWriter.write("卧槽");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fileWriter.flush();
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

BufferedWriter

public class BufferWriterDemo {
    public static void main(String[] args) throws IOException {
        FileWriter fileWriter = new FileWriter("conf.txt",true);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        bufferedWriter.write("qhxxxx");
        bufferedWriter.close();

    }
}

プリントストリーム

 私たちが通常使用するコンソールの print ステートメントは、PrintStream オブジェクトです。

ストリームの出力方向を変更する

System.setOut(PrintStream对象)

 PrintStream printStream = new PrintStream(new FileOutputStream("conf.txt"));
        printStream.println("\n121212"); // 输出到conf.txt
        System.setOut(printStream); // 改变流的输出方向

        System.out.println("\n完了数"); // 输出到conf.txt了
        System.out.println("121212");

オブジェクト出力ストリーム

初心者にはあまり役に立たない

シリアル化されるオブジェクトは  Serializableインターフェイスを実装する必要があります

       // 序列化
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new             
        FileOutputStream("conf1.txt"));
        objectOutputStream.writeObject(new User("qhx","1232323"));
        objectOutputStream.flush();
        objectOutputStream.close();

7. プロパティファイルの読み込みと設定を行う

  • getProperty( String key): 指定されたキーを使用して、このプロパティ リスト内のプロパティを検索します。つまり、パラメータキーを介して、キーに対応する値が取得されます。
  • load (InputStream inStream): 入力ストリームからプロパティ リスト (キーと要素のペア) を読み取ります。指定したファイル (上記の test.properties ファイルなど) をロードして、そのファイル内のすべてのキーと値のペアを取得します。getProperty (文字列キー) を検索します。
  • setProperty (String key, String value): Hashtable の put メソッドを呼び出します。基本クラスの put メソッドを呼び出して、キーと値のペアを設定します。
  • store ( OutputStream out, String comments ): このプロパティ テーブルからのプロパティのリスト (キーと要素のペア) を、load メソッドを使用してプロパティ テーブルにロードするのに適した形式で出力ストリームに書き込みます。ロード メソッドとは対照的に、このメソッドはキーと値のペアを指定されたファイルに書き込みます。
  • clear(): ロードされたすべてのキーと値のペアをクリアします。このメソッドは基本クラスで提供されます。
     

設定ファイルの読み込み

  private static String getKey(String key) {
        Properties properties = new Properties();
        File file = new File(FILE_NAME);
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream(file); // 配置文件
            properties.load(inputStream); // 将配置文件对应的key,value映射到properties的map中。
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(inputStream != null){  // 还是这样关比较好,万一报错就tm关不了
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println(properties.getProperty(key));
    }

プロファイル設定

    /**
     * 配置文件设置
     *
     * @param key
     * @param value
     * @return
     */
    public static boolean setPropertiesKey(String key,String value) {
        // 判断key是否有重复
        String key1 = getKey(key);
        if(key1 == null){
            return setKey(key,value); 
        }
        return false;
    }

    /**
     *  配置文件设置
     *
     * @param key
     * @param value
     * @return boolean
     */
    private static boolean setKey(String key, String value) {
        Properties properties = new Properties();
        File file = new File(FILE_NAME); // 其实有其他配置可以同意下yaml文件里面配置,然后这里面读取,好统一调配。
        FileWriter fileWriter = null;
        try {
            fileWriter = new FileWriter(file,true);
            properties.setProperty(key, value); // 存进map里面
            properties.store(fileWriter,""); // 将map对应的键值对写进输出流。这个comments 最后写入的时候是个注释
        } catch (IOException e) {
            // 卧槽我加入设置key,value失败,肯定调到这个逻辑
            return false;
        } finally {
            if (fileWriter != null) {  // 还是这样关比较好,万一报错就tm关不了
                try {
                    fileWriter.flush();
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }

}

8.ファイル 

Java では、ファイル オブジェクトはファイルとディレクトリの抽象表現を表します。

 ケース: ファイル ディレクトリの走査の再帰的実装

public class FileDemo {
    public static void main(String[] args) {
        getChildrenFile("src",1);
    }


    // 递归则子文件所有目录
    public static void getChildrenFile(String fileName,int y){ // fileName 文件路径名,y 是目录等级
        File file = new File(fileName);
        StringBuffer stb = new StringBuffer();
        // 根据目录等级追加几条 "-"
        for (int i = 0; i < y; i++) {
            stb.append("-");
        }
        // 遍历子文件
        for (String name: file.list()) {
            System.out.println(stb + name); // 目录等级 + 文件路径名,并且换行
            String childrenName = fileName + "/"+name;
            if(new File(childrenName).isDirectory()){ // 判断子文件是否是递归,是的话仍执行
                getChildrenFile(childrenName,y+1); // 同样下一级目录等级 + 1
            }
        }
      }

    }

参考文献

Java IOストリーム詳細解説(バイトストリーム、文字ストリーム、入力ストリーム、出力ストリーム、リフレッシュ)_入力ストリーム・出力ストリーム・更新ストリーム_ファットブラザーのブログ-CSDNブログ

 Java IO ストリーム (超詳しい!)_A happy wild pointer~ のブログ - CSDN ブログ

おすすめ

転載: blog.csdn.net/Qhx20040819/article/details/132086878