<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>第８講 ファイル入出力 on 2024年度 発展プログラミング演習（春学期）</title>
    <link>https://ksuap.github.io/2024spring/lesson08/index.html</link>
    <description>Recent content in 第８講 ファイル入出力 on 2024年度 発展プログラミング演習（春学期）</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <lastBuildDate>Thu, 13 Apr 2023 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://ksuap.github.io/2024spring/lesson08/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ファイルの入出力</title>
      <link>https://ksuap.github.io/2024spring/lesson08/stream/index.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ksuap.github.io/2024spring/lesson08/stream/index.html</guid>
      <description>ファイルの入出力 ストリーム（Stream） ラッピング（Wrapping） Reader/Writer, InputStream/OutputStream import文 Reader型 Writer型 InputStream/OutputStream型 練習問題 まとめ ファイルの入出力 ストリーム（Stream） Java で入出力を扱うには，ストリームという概念の理解が必要です． ストリームとは，データを流れとして扱う仕組みです． データがデータソース（Data Source; データの源，入力元）から流れてくる入力ストリームと， データをデータの出力先（Data Destination; 出力先）に流し込む出力ストリームの２つがあります．
下の画像が入力ストリームを表しています． データソースはファイルやネットワークから，もしくは，別のプログラムであるなど， 入力ストリームを扱う側は知らなくても良いようになっています． とにかく，ストリームを扱う側は，必要なデータが流れてくることさえ理解していれば良いわけです． このような性質のため，Java では，あらゆる入出力にストリームを利用します．
プログラムへの情報の読取り
入力元がファイルであろうと，ネットワークの先であろうと，受け取る方法は同じです． 入力元がどこであろうと，同じように扱うために，ラッピング という作業が必要になります．
下の画像が出力ストリームを表しています．出力も入力ストリームと同じく， ラッピングを利用して，出力先を気にすることなくデータを書き込めます．
プログラムからの情報の書き込み
ファイル，ネットワーク，また，メモリに書き込むときにもストリームを利用します．
ラッピング（Wrapping） 先ほど，ファイルやネットワーク，さては，メモリの入出力までストリームを利用できると述べました． 異なるものを同じように扱うために，ラッピング（wrapping）と言う概念を利用します． ラッピングは，アダプタパターン（Adapter Pattern）と言われる場合もあります．
ラッピングとは，包むや包装するという意味です． その意味のとおり，ラッピングを行うには，とある実体を別の型で覆います． 右図のように，別の型で覆うことで，内側の型（Inner）を外側の型（Outer）として扱えるようになります．
// Inner.java class Inner { void method1() { // some operation... } } // Outer.java class Outer { Inner inner; void method2() { inner.method1(); } } // Main.</description>
    </item>
    <item>
      <title>Reader型</title>
      <link>https://ksuap.github.io/2024spring/lesson08/reader/index.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ksuap.github.io/2024spring/lesson08/reader/index.html</guid>
      <description>ファイルの入出力 Reader型 Reader 型の利用方法 典型的なファイルからのデータの読み込み方法 １文字単位の読み込み 例題 1. Catコマンドの作成 実行例 Writer型 InputStream/OutputStream型 練習問題 まとめ Reader 型の利用方法 まずは，入力を扱うReaderを利用する方法を確認します．Readerと一口に言っても， 以下のように多くの型がReader型には存在します．
FileReader ファイル（File型）からテキストデータを読み込むためのReader型． BufferedReader バッファリングを行うためのReader型． データソースから行単位で文字列を読み込める． 他の Readerは文字単位でしかデータを読み込めない． StringReader 文字列（String型）からテキストデータを読み込むためのReader型． LineNumberReader 読み込んだ行数を数えるReader型． InputStreamReader InputStream型の入力ストリームをReader型に変換するReader型． ここに挙げた以外にもいくつかのReader型が存在しますが，この講義では，FileReader とBufferedReader，そして，InputStreamReaderの３つの型を扱います．
また，それぞれの型を利用するには，それぞれの型のインポートが必要です． 例えば，BufferedReaderを利用するときには，import java.io.BufferedReader;という一文が クラス宣言の前に必要です．
典型的なファイルからのデータの読み込み方法． void readMethod(File file) throws IOException{ BufferedReader in = new BufferedReader(new FileReader(file)); // (1) // 上記の(1)の処理を区別して書くと，次のような処理になる． // FileReader freader = new FileReader(file); // BufferedReader in = new BufferedReader(freader); String line; while((line = in.</description>
    </item>
    <item>
      <title>Writer型</title>
      <link>https://ksuap.github.io/2024spring/lesson08/writer/index.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ksuap.github.io/2024spring/lesson08/writer/index.html</guid>
      <description>ファイルの入出力 Reader型 Writer型 Writer 型の利用方法 典型的なファイルへのデータの書き込み方法 例題 2. 指定された行数を出力するコマンド 実行例 例題 3. 単純なファイルコピー 実行例 InputStream/OutputStream型 練習問題 まとめ Writer 型の利用方法 出力を扱うWriterを利用する方法を確認しましょう．Writer型もReader型と同じく， 多くの型が存在します．典型的な型を次に紹介します．
FileWriter ファイル（File型）に書き込むためのWriter型． PrintWriter printfやprintln，printが利用できるWriter型． 他のWriter型は文字単位でしか出力できない． StringWriter 文字列（String型）に書き込むためのWriter型． OutputStreamWriter OutputStream型をWriter型に変換するためのWriter型． ここに挙げた以外にもいくつかのWriter型が存在しますが，この講義では，FileWriter， PrintWriter の２つの型のみを利用します．
典型的なファイルへのデータの書き込み方法． void writeWithWriter(File file, String message) throws IOException{ PrintWriter out = new PrintWriter(new FileWriter(file)); // (2) // 上記の(2)の処理を区別して書くと次のような処理になる． // FileWriter fwriter = new FileWriter(file); // PrintWriter out = new PrintWriter(fwriter); out.print(message); out.close(); }ファイルに文字列（String型の変数message）を書き込む方法は上記の通りです． まず，FileWriterを利用してファイルに書き込むためのWriter型を構築します． 次に，構築したFileWriterをPrintWriterに渡し，文字列の出力が 可能なPrintWriterを構築します．</description>
    </item>
    <item>
      <title>InputStream/OutputStream型</title>
      <link>https://ksuap.github.io/2024spring/lesson08/inoutstream/index.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ksuap.github.io/2024spring/lesson08/inoutstream/index.html</guid>
      <description>ファイルの入出力 Reader型 Writer型 InputStream/OutputStream型 OutputStream型 OutputStream 型色々 InputStream型 InputStream 型色々 例題 4 InputStreamを利用した Cat 例題 5 単純なファイルコピー 2 例題 6 pnm 画像の生成 練習問題 まとめ OutputStream 型 データを書き出すための Stream であり，使い方は Writer とほぼ同じです． 例えば，以下のサンプルプログラムの writeWithWriterは Writer 型で示した典型的なWriterの使い方です． このwriteWithWriterと対比して，writeWithOutputStreamを確認してください．
void writeWithWriter(File file, String message) throws IOException{ PrintWriter out = new PrintWriter(new FileWriter(file)); // (2) // 上記の(2)の処理を区別して書くと次のような処理になる． // FileWriter fwriter = new FileWriter(file); // PrintWriter out = new PrintWriter(fwriter); out.print(message); out.close(); } void writeWithOutputStream(File file, String message) throws IOException{ BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file)); // (3) // 上記の(3)の処理を区別して書くと次のような処理になる． // FileOutputStream fout = new FileOutputStream(file); // BufferedOutputStream out = new BufferedOutputStream(fout); out.</description>
    </item>
    <item>
      <title>練習問題</title>
      <link>https://ksuap.github.io/2024spring/lesson08/assignments/index.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ksuap.github.io/2024spring/lesson08/assignments/index.html</guid>
      <description>ファイルの入出力 Reader型 Writer型 InputStream/OutputStream型 練習問題 行番号付きのCatコマンドの作成 Grepコマンドの作成 文字列にある文字列が含まれているかを確認する Headコマンドの作成 Teeコマンドの作成 カエサル暗号 まとめ 1. 行番号付きの Cat コマンドの作成 例題 1を改良し，行番号付きで出力する cat コマンドを作成してください． クラス名はCat2としてください． ただし，例題 1と異なり，複数のファイルを指定できるようにしましょう． この例題でも，引数は必ず与えられるものとしてください．
出力例 $ cat -n Cat2.java 1 import java.io.*; ...途中省略． 23 } $ java Cat2 Cat2.java Cat.java 1 import java.io.*; ...途中省略． 23 } 1 import java.io.*; ...途中省略． 19 }2. Grep コマンドの作成 ここでは，grepコマンドを作成しましょう．grepコマンドとは， キーワードと１つ以上のファイル名が与えられます． ファイルの行にキーワードが含まれていれば，その行を出力するコマンドです．
クラス名はGrepとしてください． 結果出力には，以下の出力例のようにファイル名も含めてください． 複数のファイルが与えられたとしても，検索できるようにしましょう． なお，キーワードは省略されることはなく，ファイルは少なくとも１つは指定されるとして構いません．
文字列にある文字列が含まれているかを確認する ある文字列（stringA）に，別の文字列（stringB）が含まれているかを 確認するには，containsメソッドを利用してください．
String stringA = &amp;#34;this is a pen&amp;#34;; String stringB = &amp;#34;is a&amp;#34;; String stringC = &amp;#34;are&amp;#34;; if(stringA.</description>
    </item>
    <item>
      <title>まとめ</title>
      <link>https://ksuap.github.io/2024spring/lesson08/summary/index.html</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://ksuap.github.io/2024spring/lesson08/summary/index.html</guid>
      <description>ファイルの入出力 ストリーム（Stream） ラッピング（Wrapping） Reader/Writer, InputStream/OutputStream import文 Reader型 Reader 型の利用方法 典型的なファイルからのデータの読み込み方法 １文字単位の読み込み 例題 1. Catコマンドの作成 実行例 Writer型 Writer 型の利用方法 典型的なファイルへのデータの書き込み方法 例題 2. 指定された行数を出力するコマンド 実行例 例題 3. 単純なファイルコピー 実行例 InputStream/OutputStream型 OutputStream型 InputStream型 例題 4 InputStreamを利用した Cat 例題 5 単純なファイルコピー 2 例題 6 pnm 画像の生成 練習問題 行番号付きのCatコマンドの作成 Grepコマンドの作成 文字列にある文字列が含まれているかを確認する Headコマンドの作成 Teeコマンドの作成 カエサル暗号 まとめ まとめ Java での入出力はストリームという流れで表される． 入力はデータソース(Data Source)からデータが流れてくる． 出力は出力先(Data Destination)にデータを流し込む． 利用するときは，ラッピング（Wrapping）を行う． Java では，４種類のストリームが用意されている． 使用するときには，importが必要． 文字データの入力は Reader， 各種Reader型 ファイルからテキストデータを読み込むFileReader型． バッファリングしてテキストデータを読み込むBufferedReader型． 文字列からテキストデータを読み込むStringReader型． 読み込んだ行数を数えるLineNumberReader型． InputStream型をReaderに変換するInputStreamReader型． Readerの典型的な使い方． 文字データの出力は Writer， 各種Writer型 ファイルにテキストデータを書き込むFileWriter型． printf, println, printを利用できるPrintWriter型． 文字列にテキストデータ書き込むStringWriter型． OutputStream型をWriterに変換するOutputStreamWriter型． Writerの典型的な使い方． バイナリデータの入力は InputStream， 各種InputStream型 ファイルからバイナリデータを読み込むFileInputStream型． データをバッファリングして読み込むBufferedInputStream型． バイト配列からデータを読み込むByteArrayInputStream型． GZip されたデータを読み込むGZIPInputStream型． バイナリデータの出力は OutputStream． 各種OutputStream型 ファイルにデータを書き込むためのFileOutputStream型． バイト配列にデータを書き込むためのByteArrayOutputStream型． GZip 圧縮するためのGZIPOutputStream型． 文字列にある文字列が含まれているかを確認する stringA.</description>
    </item>
  </channel>
</rss>