プログラミング 第18回

プログラミング 第18回
ファイル入出力
[email protected]
プログラミング第18回
1
ShowFile1.java (List 18-1, p.218)
import java.io.*;
public class ShowFile1{
public static void main(String[] args){
if(args.length != 1){
System.out.println("使用法:java
ShowFile1 ファイル");
System.exit(0);
}
String filename=args[0];
プログラミング第18回
2
ShowFile1.java (2)
try{
BufferedReader reader=
new BufferedReader(
new FileReader(filename));
String line;
while((line=reader.readLine())!=null){
System.out.println(line);
}
reader.close();
プログラミング第18回
3
ShowFile1.java (3)
}catch(FileNotFoundException e){
System.out.println(
filename+"が見つかりません。");
}catch(IOException e){
System.out.println(e);
}
}
}
プログラミング第18回
4
実行例(error処理のケースのみ)
JavaLessons> java ShowFile1
java ShowFile1
使用法:java ShowFile1 ファイル
JavaLessons> java ShowFile1 temp
java ShowFile1 temp
tempが見つかりません。
プログラミング第18回
5
バッファリング
他のプログラム
読み込み要求
バッファから
データを取り出
す
:BufferedReader
バッファが空になって
から読み込み要求
:FileReader
:バッファ
読んだデータ
はバッファに
最もコストがかか
るところ。
読み込み要求
OS
この間でもバッファ
リングあり
プログラミング第18回
6
WriteFile1.java (List 18-2, p.230)
import java.io.*;
public class WriteFile1{
public static void main(String[] args){
if(args.length != 1){
System.out.println(
"使用法:java WriteFile1 ファイル");
System.exit(0);
}
プログラミング第18回
String filename=args[0];
7
WriteFile1.java (2)
try{
BufferedReader reader=
new BufferedReader(
new InputStreamReader(System.in));
PrintWriter writer=
new PrintWriter(
new BufferedWriter(
new FileWriter(filename)));
String line;
while((line=reader.readLine())!=null){
writer.println(line);
}
プログラミング第18回
8
WriteFile1.java (3)
reader.close();
writer.close();
}catch(IOException e){
System.out.println(e);
}
}
}
プログラミング第18回
9
実行方法
• java WriteFile1 test.txt
• 入力待ちになるので,適当なテキストを入
力し,最後に^Z(コントロール-Z)+改行。
• test.txt の内容を確認する。
プログラミング第18回
10
バッファリング
他のプログラム
書き込み要求
バッファにデー
タを書き込む
:BufferedWriter
バッファがいっぱいに
なってから書き込み要
求
:FileWriter
(PrintWriterは
省いている)
:バッファ
バッファから
データをもらう
最もコストがかか
るところ。
書き込み要求
OS
この間でもバッファ
リングあり
プログラミング第18回
11
注意
• println は PrintWriter のメソッド
• System.out は実は PrintWriter クラスのイ
ンスタンスであった。
プログラミング第18回
12
DeleteFile1.java (List 18-3, p.233)
import java.io.*;
public class DeleteFile1{
public static void main(String[] args){
if(args.length != 1){
System.out.println(
"使用法:java DeleteFile1 削除ファイル");
System.exit(0);
}
String filename=args[0];
プログラミング第18回
13
DeleteFile1.java (2)
File file=new File(filename);
if(file.delete()){
System.out.println(filename
+"を削除しました。");
}else{
System.out.println(filename
+"を削除できませんでした。");
}
}
}
プログラミング第18回
14
RenameFile1.java (List 18-4, p.234)
import java.io.*;
public class RenameFile1{
public static void main(String[] args){
if(args.length != 2){
System.out.println(
"使用法:java RenameFile1 現ファイル 新ファイル名");
System.exit(0);
}
String oldfilename=args[0];
String newfilename=args[1];
プログラミング第18回
15
RenameFile1.java (2)
File oldfile=new File(oldfilename);
File newfile=new File(newfilename);
if(oldfile.renameTo(newfile)){
System.out.println(oldfilename+"を"
+newfilename+"に変更しました。");
}else{
System.out.println(oldfilename+"を"
+newfilename+"に変更できませんでした。");
}
}
}
プログラミング第18回
16
ListDir1.java (List 18-6, p.237)
import java.io.*;
public class ListDir1{
public static void main(String[] args){
if(args.length != 1){
System.out.println(
"使用法:java ListDir1 ディレクトリ名");
System.exit(0);
}
プログラミング第18回
17
ListDir1.java (2)
File dir=new File(args[0]);
String[] dirlist=dir.list();
for(int i=0; i<dirlist.length; i++){
System.out.println(dirlist[i]);
}
}
}
プログラミング第18回
18
MakeDir1.java(List 18-7, p.238)
import java.io.*;
public class MakeDir1{
public static void main(String[] args){
if(args.length != 1){
System.out.println(
"使用法:java MakeDir1 ディレクトリ名");
System.exit(0);
}
String dirname=args[0];
プログラミング第18回
19
File dir=new File(dirname);
if(dir.mkdirs()){
MakeDir1.java
(2)
System.out.println(dirname
+"を作成しました。");
System.out.println("絶対パスは"
+dir.getAbsolutePath()+"です。");
}else{
System.out.println(dirname
+"を作成できませんでした。");
}
}
}
プログラミング第18回
20
Character stream と byte stream
• Reader や Writer オブジェクトが扱うのが文
字ストリーム。16ビット単位の入出力。
• InputStream オブジェクトが扱うのがバイト
ストリーム。8ビット単位の入出力。
– FileInputStream: ファイルから読むためのもの
– BufferedInputStream: バッファリングつき
– DataInputStream: byte,short,int,...などのかたま
りを読み込める。
プログラミング第18回
21
Character stream の役目
日本語EUC
コードのバイ
ト列
日本語SJIS
コードのバイ
ト列
Unicode文字列
Unicode文字列
InputStreamReader
OutStreamWriter
プログラミング第18回
日本語EUC
コードのバイ
ト列
日本語SJIS
コードのバイ
ト列
22
FileDump1.java (List 18-8, p.244)
import java.io.*;
public class FileDump1{
public static void main(String[] args){
DataInputStream in=null;
if(args.length != 1){
System.out.println(
"使用法:java FileDump1 ファイル名");
System.exit(0);
}
プログラミング第18回
23
FileDump1.java (2)
try{
in=new DataInputStream(
new BufferedInputStream(
new FileInputStream(args[0])));
int offset=0;
プログラミング第18回
24
while(true){
byte b=in.readByte();
if(offset%16==0){
FileDump1.java (3)
System.out.print(intToHexString(offset)+": ");
}else if(offset%8==0){
System.out.print("-");
}else{
System.out.print(" ");
}
System.out.print(byteToHexString(b));
if(offset%16==15){
System.out.println("");
}
offset++;
}
プログラミング第18回
25
FileDump1.java (4)
}catch(FileNotFoundException e){
System.out.println(args[0]
+"が見つかりません。");
}catch(EOFException e){
System.out.println("");
}catch(IOException e){
System.out.println(""+e);
}
プログラミング第18回
26
FileDump1.java (5)
try{
if(in!=null){
in.close();
}
}catch(IOException e){
System.out.println(""+e);
}
}
プログラミング第18回
27
FileDump1.java (6)
public static String intToHexString(int n){
return byteToHexString((byte)(n>>>24))
+byteToHexString((byte)(n>>>16))
+byteToHexString((byte)(n>>>8))
+byteToHexString((byte)n);
}
プログラミング第18回
28
FileDump1.java (7)
public static String byteToHexString(byte b){
int n=(int)b;
if(n<0){
n=256+n;
}
if(n<16){
return
"0"+Integer.toHexString(n).toUpperCase();
}else{
return Integer.toHexString(n).toUpperCase();
}
}
}
プログラミング第18回
29
実行例
JavaLessons>
00000000: CA
00000010: 00
00000020: 00
00000030: 56
00000040: 75
00000050: 6E
00000060: 2F
00000070: 72
00000080: 6A
00000090: 19
000000A0: 00
........
java FileDump1
FE BA BE 00 03
10 00 11 08 00
16 01 00 06 3C
01 00 04 43 6F
6D 62 65 72 54
01 00 16 28 5B
53 74 72 69 6E
63 65 46 69 6C
61 76 61 0C 00
01 00 06 48 65
1C 01 00 05 48
Hello.class
00 2D-00 1D
12 0A-00 13
69 6E-69 74
64 65-01 00
61 62-6C 65
4C 6A-61 76
67 3B-29 56
65 01-00 0A
07 00-08 07
6C 6C-6F 21
65 6C-6C 6F
プログラミング第18回
0A
00
3E
0F
01
61
01
48
00
07
01
00
14
01
4C
00
2F
00
65
17
00
00
06
07
00
69
04
6C
0A
6C
0C
1A
10
00
00
03
6E
6D
61
53
6C
00
0C
6A
0F
15
28
65
61
6E
6F
6F
18
00
61
09
07
29
4E
69
67
75
2E
00
1B
76
30