Java IO操作
文件操作相關
列出某個目錄中的所有文件
例子:
package com.ylfeiu.io;import java.io.File;public class ShowFileInfo {public static void main(String[] args) {File f = new File("d:" + File.separator + "txt");show(f);}private static void show(File f) {if (f.isDirectory()) {File[] res = f.listFiles();if (res != null) {for (int i = 0; i < res.length; i++) {show(res[i]);}}}System.err.println(f);}}創建帶目錄的文件
例子:
package com.ylfeiu.io;import java.io.File; import java.io.IOException;public class CreateDirectorFile {public static void main(String[] args) {File f = new File("d:" + File.separator + "test" + File.separator+ "hello.txt");if (!f.getParentFile().exists()) {f.getParentFile().mkdirs();} else {try {f.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}字節流與字符流
輸入輸出流,分為字節流(InputStream,OutPutStream),字符流(Writer,Reader),它們4個都是抽象類,實例化靠其子類對象;傳輸中用字節流.字符流在操作時用到了緩沖區,若在使用字符流操作后,不關閉輸出流操作,那么該緩沖區的內容不會被輸出,這個時候得去調用flush()強制清空緩沖區的內容進行輸出.字節流這不存在該情況
java.lang.Object
???????? |-java.io.InputStream
?????????????????? |-java.io.FileInputStream
java.lang.Object
???????? |-java.io.Reader
?????????????????? |-java.io.InputStreamReader
??????????????????????????? |-java.io.FileReader
通過以上繼承關系可以看出,所有字符數據都是需要轉換的,依靠轉換流操作,真正保存或傳輸的數據是以字節流來完成的
轉換操作流
字節流與字符流的轉換采用:OutputStreamWriter,InputStreamReader
package com.ylfeiu.io;import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer;public class CreateDirectorFile {public static void main(String[] args) throws Exception {File f = new File("d:" + File.separator + "test" + File.separator+ "hello.txt");if (!f.getParentFile().exists()) {f.getParentFile().mkdirs();} else {f.createNewFile();}OutputStream out = new FileOutputStream(f);Writer w = new OutputStreamWriter(out);w.write("你好啊");w.flush();}}內存操作流
構造:輸入流構造需要傳參(操作對象),輸出流構造函數中沒有操作對象
public ByteArrayInputStream(byte buf[])
?
使用ByteArrayInputStream,ByteArrayOutputStream對內存進行輸入輸出操作
例子:
package com.ylfeiu.io;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream;public class ByteArrayIO {public static void main(String[] args) throws Exception {String str = "hello";InputStream in = new ByteArrayInputStream(str.getBytes());OutputStream w = new ByteArrayOutputStream();int tmp = 0;while ((tmp = in.read()) != -1) {w.write((char)Character.toUpperCase(tmp));}w.close();in.close();String newStr = w.toString();System.err.println(newStr);}}字節打印流與字符打印流
PrintStream,PrintWriter
構造public PrintStream (OutputStream out)
這里雖然傳參的是OutputStream型的對象,但是打印流使用的是打印流的方法,并不是使用OutputStream的子類的實際對象的方法
System類的err,out,in這三個常量都是PrintStream的實例(該3個常量在JDK早期出現,所以并不是大寫的)
System.out本身就屬于PrintStream的對象,而它又是OutputStream的子類,所以有了下面的代碼:
package com.ylfeiu.io;import java.io.OutputStream;public class SysIn {public static void main(String[] args) throws Exception {OutputStream out = System.out;String info = "你好啊 world";out.write(info.getBytes());}} 打印流例子 package com.ylfeiu.io;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream;public class PrintIO {public static void main(String[] args) throws Exception {String str = "hello world!";InputStream in = new ByteArrayInputStream(str.getBytes());OutputStream out = new ByteArrayOutputStream();PrintStream echo = new PrintStream(out);int tmp = 0;while ((tmp = in.read()) != -1) {echo.print((char)Character.toUpperCase(tmp));}String newStr = out.toString();out.close();in.close();System.err.println(newStr);}} 中文亂碼的產生 package com.ylfeiu.io;import java.io.InputStream;/*** * @author Administrator 本程序演示中文亂碼的產生*/ public class MessyCode {public static void main(String[] args) throws Exception {InputStream in = System.in;StringBuffer buf = new StringBuffer();System.out.println("請輸入數據");int tmp = 0;while ((tmp = in.read()) != -1) {if (tmp == '\n') {break;}buf.append((char) tmp);}System.err.println("輸入的內容是:" + buf);}} BufferedReader緩沖區操作 從緩沖區讀取數據解決中文輸入產生的亂碼 package com.ylfeiu.io;import java.io.BufferedReader; import java.io.InputStreamReader;public class BufRead {public static void main(String[] args) throws Exception {BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));System.out.println("請輸入數據");String info = buf.readLine();System.err.println("輸入地 數據是:" + info);} Scanner(放在java.utils包中) Jdk1.5之后推出的,方便進行輸入操作,在程序開發過程中,如果通過程序輸出,則采用PrintStream打印流,若存在中文,推薦使用PrintWriter,而對于程序輸入數據,建議使用Scanner 例子 package com.ylfeiu.io;import java.util.Scanner;public class ScannerInput {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.err.println("請輸入數據");if (in.hasNext()) {String info = in.next();System.err.println("輸入的數據是:" + info);}}}對象輸入/出流
采用ObjectInputStream,ObjectOutputStream進行對象的輸入與輸出,這兩個類與打印流的設計相似,都是需要接收父類的實例化對象
例子
?
對象序列化
對象序列化可以將內存中的對象轉換成2進制數據(必須實現Serializable接口),如果不想某個對象的屬性被序列化,則采用transient關鍵字
例子
把對象信息寫入到文件中:
package com.ylfeiu.io;import java.io.File; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.io.Serializable;public class ObjInputIO {public static void main(String[] args) throws Exception {Person p = new Person(20, "ylfeiu");File f = new File("d:" + File.separator + "p.ser");ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));out.writeObject(p);out.close();}}class Person implements Serializable {transient int age;String name;Person(int age, String name) {this.age = age;this.name = name;}} 從二進制文件中讀取數據 package com.ylfeiu.io;import java.io.File; import java.io.FileInputStream; import java.io.ObjectInputStream;public class ObjReadIO {public static void main(String[] args) throws Exception {File f = new File("d:" + File.separator + "p.ser");ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));Person p = (Person) in.readObject();in.close();System.err.println(p.name);// 若給age字段添加private屬性,則編譯不通過System.err.println(p.age);}}字符編碼
GBK/GB2312:表示國際中文編碼,其中GBK包含簡體與繁體中文,而GB2312只包含簡體中文ISO 8859-1:一種國際通用編碼,可以表示任何文字?查一下
Unicode:一種16進制編碼,可以便是任何語言文字?
UTF-8:部分編碼使用了Unicode,而另一些則采用了ISO-8859-1,它適合網絡傳輸,在項目開發過程中推薦采用此編碼?(為什么)
產生亂碼的原因:編碼與解碼不統一
轉載于:https://www.cnblogs.com/ylfeiu/p/3597315.html
總結
- 上一篇: Bash 文件夹操作
- 下一篇: ios 学习常用网站