300 likes | 398 Views
プログラミング 第18回. ファイル入出力 yukita@k.hosei.ac.jp. 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); }
E N D
プログラミング 第18回 ファイル入出力 yukita@k.hosei.ac.jp プログラミング第18回
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回
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回
ShowFile1.java (3) }catch(FileNotFoundException e){ System.out.println( filename+"が見つかりません。"); }catch(IOException e){ System.out.println(e); } } } プログラミング第18回
実行例(error処理のケースのみ) JavaLessons> java ShowFile1 java ShowFile1 使用法:java ShowFile1 ファイル JavaLessons> java ShowFile1 temp java ShowFile1 temp tempが見つかりません。 プログラミング第18回
バッファリング 他のプログラム バッファからデータを取り出す 読み込み要求 :BufferedReader :バッファ バッファが空になってから読み込み要求 読んだデータはバッファに :FileReader 最もコストがかかるところ。 読み込み要求 OS この間でもバッファリングあり プログラミング第18回
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); } String filename=args[0]; プログラミング第18回
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回
WriteFile1.java (3) reader.close(); writer.close(); }catch(IOException e){ System.out.println(e); } } } プログラミング第18回
実行方法 • java WriteFile1 test.txt • 入力待ちになるので,適当なテキストを入力し,最後に^Z(コントロール-Z)+改行。 • test.txt の内容を確認する。 プログラミング第18回
バッファリング 他のプログラム (PrintWriterは省いている) バッファにデータを書き込む 書き込み要求 :BufferedWriter :バッファ バッファがいっぱいになってから書き込み要求 バッファからデータをもらう :FileWriter 最もコストがかかるところ。 書き込み要求 OS この間でもバッファリングあり プログラミング第18回
注意 • println は PrintWriter のメソッド • System.out は実は PrintWriter クラスのインスタンスであった。 プログラミング第18回
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回
DeleteFile1.java (2) File file=new File(filename); if(file.delete()){ System.out.println(filename +"を削除しました。"); }else{ System.out.println(filename +"を削除できませんでした。"); } } } プログラミング第18回
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回
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回
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回
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回
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回
File dir=new File(dirname); if(dir.mkdirs()){ System.out.println(dirname +"を作成しました。"); System.out.println("絶対パスは" +dir.getAbsolutePath()+"です。"); }else{ System.out.println(dirname +"を作成できませんでした。"); } } } MakeDir1.java (2) プログラミング第18回
Character stream と byte stream • Reader や Writer オブジェクトが扱うのが文字ストリーム。16ビット単位の入出力。 • InputStream オブジェクトが扱うのがバイトストリーム。8ビット単位の入出力。 • FileInputStream: ファイルから読むためのもの • BufferedInputStream: バッファリングつき • DataInputStream: byte,short,int,...などのかたまりを読み込める。 プログラミング第18回
Character stream の役目 日本語EUCコードのバイト列 Unicode文字列 InputStreamReader 日本語SJISコードのバイト列 日本語EUCコードのバイト列 Unicode文字列 OutStreamWriter 日本語SJISコードのバイト列 プログラミング第18回
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回
FileDump1.java (2) try{ in=new DataInputStream( new BufferedInputStream( new FileInputStream(args[0]))); int offset=0; プログラミング第18回
while(true){ byte b=in.readByte(); if(offset%16==0){ 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++; } FileDump1.java (3) プログラミング第18回
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回
FileDump1.java (5) try{ if(in!=null){ in.close(); } }catch(IOException e){ System.out.println(""+e); } } プログラミング第18回
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回
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回
実行例 JavaLessons> java FileDump1 Hello.class 00000000: CA FE BA BE 00 03 00 2D-00 1D 0A 00 06 00 0F 09 00000010: 00 10 00 11 08 00 12 0A-00 13 00 14 07 00 15 07 00000020: 00 16 01 00 06 3C 69 6E-69 74 3E 01 00 03 28 29 00000030: 56 01 00 04 43 6F 64 65-01 00 0F 4C 69 6E 65 4E 00000040: 75 6D 62 65 72 54 61 62-6C 65 01 00 04 6D 61 69 00000050: 6E 01 00 16 28 5B 4C 6A-61 76 61 2F 6C 61 6E 67 00000060: 2F 53 74 72 69 6E 67 3B-29 56 01 00 0A 53 6F 75 00000070: 72 63 65 46 69 6C 65 01-00 0A 48 65 6C 6C 6F 2E 00000080: 6A 61 76 61 0C 00 07 00-08 07 00 17 0C 00 18 00 00000090: 19 01 00 06 48 65 6C 6C-6F 21 07 00 1A 0C 00 1B 000000A0: 00 1C 01 00 05 48 65 6C-6C 6F 01 00 10 6A 61 76 ........ プログラミング第18回