Java-files-io

提供:Dev Guides
移動先:案内検索

Java-ファイルとI/O

java.ioパッケージには、Javaで入出力(I/O)を実行する必要がある可能性のあるほぼすべてのクラスが含まれています。 これらのストリームはすべて、入力ソースと出力宛先を表します。 java.ioパッケージのストリームは、プリミティブ、オブジェクト、ローカライズされた文字など、多くのデータをサポートしています。

ストリーム

ストリームは、データのシーケンスとして定義できます。 ストリームには2種類あります-

  • InPutStream -InputStreamは、ソースからデータを読み取るために使用されます。
  • OutPutStream -OutputStreamは、宛先にデータを書き込むために使用されます。

ストリーム

Javaは、ファイルとネットワークに関連するI/Oを強力かつ柔軟にサポートしますが、このチュートリアルでは、ストリームとI/Oに関連する非常に基本的な機能について説明します。 私たちは最も一般的に使用される例を1つずつ見ていきます-

バイトストリーム

Javaバイトストリームは、8ビットバイトの入出力を実行するために使用されます。 バイトストリームに関連するクラスは多数ありますが、最も頻繁に使用されるクラスは FileInputStream および FileOutputStream です。 以下は、これら2つのクラスを使用して入力ファイルを出力ファイルにコピーする例です-

import java.io.*;
public class CopyFile {

   public static void main(String args[]) throws IOException {
      FileInputStream in = null;
      FileOutputStream out = null;

      try {
         in = new FileInputStream("input.txt");
         out = new FileOutputStream("output.txt");

         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

今、次の内容を持つファイル input.txt を用意しましょう-

This is test for copy file.

次のステップとして、上記のプログラムをコンパイルして実行します。これにより、input.txtと同じ内容のoutput.txtファイルが作成されます。 それでは、上記のコードをCopyFile.javaファイルに入れて、次のことを行いましょう-

$javac CopyFile.java
$java CopyFile

キャラクターストリーム

Java Byte ストリームは8ビットバイトの入出力を実行するために使用され、Java Character ストリームは16ビットUnicodeの入出力を実行するために使用されます。 文字ストリームに関連するクラスは多数ありますが、最も頻繁に使用されるクラスは FileReader および FileWriter です。 内部的にFileReaderはFileInputStreamを使用し、FileWriterはFileOutputStreamを使用しますが、主な違いは、FileReaderは一度に2バイトを読み取り、FileWriterは一度に2バイトを書き込むことです。

上記の例を書き換えることができます。これは、これら2つのクラスを使用して、入力ファイル(ユニコード文字を含む)を出力ファイルにコピーします-

import java.io.*;
public class CopyFile {

   public static void main(String args[]) throws IOException {
      FileReader in = null;
      FileWriter out = null;

      try {
         in = new FileReader("input.txt");
         out = new FileWriter("output.txt");

         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

今、次の内容を持つファイル input.txt を用意しましょう-

This is test for copy file.

次のステップとして、上記のプログラムをコンパイルして実行します。これにより、input.txtと同じ内容のoutput.txtファイルが作成されます。 それでは、上記のコードをCopyFile.javaファイルに入れて、次のことを行いましょう-

$javac CopyFile.java
$java CopyFile

標準ストリーム

すべてのプログラミング言語は、ユーザーのプログラムがキーボードから入力を取得し、コンピューター画面に出力を生成できる標準I/Oのサポートを提供します。 CまたはC++を知っている場合プログラミング言語の場合、3つの標準デバイスSTDIN、STDOUT、およびSTDERRに注意する必要があります。 同様に、Javaは次の3つの標準ストリームを提供します-

  • 標準入力-これはユーザーのプログラムにデータを供給するために使用され、通常キーボードは標準入力ストリームとして使用され、 System.in として表されます。
  • 標準出力-これは、ユーザーのプログラムによって生成されたデータを出力するために使用され、通常はコンピューター画面が標準出力ストリームに使用され、 System.out として表されます。
  • 標準エラー-これは、ユーザーのプログラムによって生成されたエラーデータを出力するために使用され、通常はコンピューター画面が標準エラーストリームに使用され、 System.err として表されます。

以下は、ユーザーが「q」を入力するまで標準入力ストリームを読み取るために InputStreamReader を作成する単純なプログラムです-

import java.io.*;
public class ReadConsole {

   public static void main(String args[]) throws IOException {
      InputStreamReader cin = null;

      try {
         cin = new InputStreamReader(System.in);
         System.out.println("Enter characters, 'q' to quit.");
         char c;
         do {
            c = (char) cin.read();
            System.out.print(c);
         } while(c != 'q');
      }finally {
         if (cin != null) {
            cin.close();
         }
      }
   }
}

上記のコードをReadConsole.javaファイルに保持し、次のプログラムに示すようにコンパイルして実行してみましょう。 このプログラムは、「q」を押すまで同じ文字を読み取り、出力し続けます-

$javac ReadConsole.java
$java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q

ファイルの読み書き

前述のように、ストリームはデータのシーケンスとして定義できます。 InputStream はソースからデータを読み取るために使用され、 OutputStream はデータを宛先に書き込むために使用されます。

入力および出力ストリームを処理するクラスの階層は次のとおりです。

ファイルIO

2つの重要なストリームは FileInputStreamFileOutputStream であり、このチュートリアルで説明します。

FileInputStream

このストリームは、ファイルからデータを読み取るために使用されます。 キーワード new を使用してオブジェクトを作成でき、いくつかのタイプのコンストラクターが利用可能です。

次のコンストラクタは、ファイル名を文字列として受け取り、ファイルを読み取る入力ストリームオブジェクトを作成します-

InputStream f = new FileInputStream("C:/java/hello");

次のコンストラクターは、ファイルオブジェクトを受け取り、入力ストリームオブジェクトを作成してファイルを読み取ります。 まず、次のようにFile()メソッドを使用してファイルオブジェクトを作成します-

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

_InputStream_オブジェクトを手に入れると、ストリームの読み取りやストリームに対する他の操作に使用できるヘルパーメソッドのリストがあります。

Sr.No. Method & Description
1

public void close() throws IOException\{}

このメソッドは、ファイル出力ストリームを閉じます。 ファイルに関連付けられているシステムリソースを解放します。 IOExceptionをスローします。

2

protected void finalize()throws IOException \{}

このメソッドは、ファイルへの接続をクリーンアップします。 このストリームへの参照がなくなったときに、このファイル出力ストリームのcloseメソッドが呼び出されるようにします。 IOExceptionをスローします。

3

public int read(int r)throws IOException\{}

このメソッドは、指定されたバイトのデータをInputStreamから読み取ります。 intを返します。 データの次のバイトを返します。ファイルの終わりであれば、-1が返されます。

4

public int read(byte[] r) throws IOException\{}

このメソッドは、入力ストリームからr.lengthバイトを配列に読み取ります。 読み取られた合計バイト数を返します。 ファイルの終わりであれば、-1が返されます。

5

public int available() throws IOException\{}

このファイル入力ストリームから読み取ることができるバイト数を提供します。 intを返します。

利用可能な他の重要な入力ストリームがあります。詳細については、次のリンクを参照できます-

  • リンク:/java/java_bytearrayinputstream [ByteArrayInputStream] *リンク:/java/java_datainputstream [DataInputStream]

FileOutputStream

FileOutputStreamは、ファイルを作成してデータを書き込むために使用されます。 ストリームは、出力用に開く前に、ファイルが存在しない場合は作成します。

FileOutputStreamオブジェクトの作成に使用できる2つのコンストラクターを次に示します。

次のコンストラクタは、ファイルを書き込むための入力ストリームオブジェクトを作成するための文字列としてファイル名を取ります-

OutputStream f = new FileOutputStream("C:/java/hello")

次のコンストラクターは、ファイルオブジェクトを受け取り、ファイルを書き込むための出力ストリームオブジェクトを作成します。 まず、次のようにFile()メソッドを使用してファイルオブジェクトを作成します-

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

_OutputStream_オブジェクトを手に入れると、ヘルパーメソッドのリストが表示されます。このメソッドを使用して、ストリームへの書き込みや、ストリームに対する他の操作を実行できます。

Sr.No. Method & Description
1
  • public void close() throws IOException\{}*

このメソッドは、ファイル出力ストリームを閉じます。 ファイルに関連付けられているシステムリソースを解放します。 IOExceptionをスローします。

2

protected void finalize()throws IOException \{}

このメソッドは、ファイルへの接続をクリーンアップします。 このストリームへの参照がなくなったときに、このファイル出力ストリームのcloseメソッドが呼び出されるようにします。 IOExceptionをスローします。

3

public void write(int w)throws IOException\{}

このメソッドは、指定されたバイトを出力ストリームに書き込みます。

4

public void write(byte[] w)

言及されたバイト配列からw.lengthバイトをOutputStreamに書き込みます。

利用可能な他の重要な出力ストリームがあります。詳細については、次のリンクを参照できます-

  • リンク:/java/java_bytearrayoutputstream [ByteArrayOutputStream]
  • リンク:/java/java_dataoutputstream [DataOutputStream]

以下は、InputStreamとOutputStreamを示す例です-

import java.io.*;
public class fileStreamTest {

   public static void main(String args[]) {

      try {
         byte bWrite [] = {11,21,3,40,5};
         OutputStream os = new FileOutputStream("test.txt");
         for(int x = 0; x < bWrite.length ; x++) {
            os.write( bWrite[x] );  //writes the bytes
         }
         os.close();

         InputStream is = new FileInputStream("test.txt");
         int size = is.available();

         for(int i = 0; i < size; i++) {
            System.out.print((char)is.read() + "  ");
         }
         is.close();
      } catch (IOException e) {
         System.out.print("Exception");
      }
   }
}

上記のコードは、ファイルtest.txtを作成し、指定された数値をバイナリ形式で書き込みます。 同じことが、標準出力画面の出力になります。

ファイルナビゲーションとI/O

ファイルナビゲーションとI/Oの基本を知るために通過する他のクラスがいくつかあります。

  • リンク:/java/java_file_class [ファイルクラス]
  • リンク:/java/java_filereader_class [FileReader Class] *リンク:/java/java_filewriter_class [FileWriter Class]

Javaのディレクトリ

ディレクトリは、他のファイルとディレクトリのリストを含むことができるファイルです。* File *オブジェクトを使用してディレクトリを作成し、ディレクトリで使用可能なファイルを一覧表示します。 詳細については、Fileオブジェクトで呼び出すことができるすべてのメソッドと、ディレクトリに関連するメソッドのリストを確認してください。

ディレクトリの作成

ディレクトリを作成するために使用できる2つの便利な*ファイル*ユーティリティメソッドがあります-

  • * mkdir()*メソッドはディレクトリを作成し、成功するとtrueを返し、失敗するとfalseを返します。 失敗は、Fileオブジェクトで指定されたパスが既に存在するか、パス全体がまだ存在しないためにディレクトリを作成できないことを示します。
  • * mkdirs()*メソッドは、ディレクトリとディレクトリのすべての親の両方を作成します。

次の例では、「/tmp/user/java/bin」ディレクトリを作成します-

import java.io.File;
public class CreateDir {

   public static void main(String args[]) {
      String dirname = "/tmp/user/java/bin";
      File d = new File(dirname);

     //Create directory now.
      d.mkdirs();
   }
}

上記のコードをコンパイルして実行し、「/tmp/user/java/bin」を作成します。

-Javaは、慣例に従って、UNIXおよびWindows上のパス区切り文字を自動的に処理します。 JavaのWindowsバージョンでスラッシュ(/)を使用する場合、パスは引き続き正しく解決されます。

ディレクトリのリスト

*File* オブジェクトが提供する* list()*メソッドを使用して、次のようにディレクトリで使用可能なすべてのファイルとディレクトリをリストダウンできます-

import java.io.File;
public class ReadDir {

   public static void main(String[] args) {
      File file = null;
      String[] paths;

      try {
        //create new file object
         file = new File("/tmp");

        //array of files and directory
         paths = file.list();

        //for each name in the path array
         for(String path:paths) {
           //prints filename and directory name
            System.out.println(path);
         }
      } catch (Exception e) {
        //if any error occurs
         e.printStackTrace();
      }
   }
}

これにより、 /tmp ディレクトリで使用可能なディレクトリとファイルに基づいて次の結果が生成されます-

出力

test1.txt
test2.txt
ReadDir.java
ReadDir.class