基础知识整理之Java I/O操作实例(附源码+运行结果)
先贴一张最重要的结构图:
-
从控制台读取输入
* Char Stream - Reader - BufferedReader * - InputStreamReader
public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Input a char"); char c = (char)reader.read(); System.out.println("Char:" + c); reader.readLine(); // 缓冲作用,否则输入字符时按下的回车会让下面的readLine()直接执行到程序结束 System.out.println("Input a line"); String s = reader.readLine(); System.out.println("String:" + s); reader.close(); }
运行结果:
Input a char e Char:e Input a line Hello WOrld! String:Hello WOrld!
-
文件I/O:借助字符流下的FileReader/FileWriter
* Char Stream - Reader - InputStreamReader - FileReader * - Writer - OutputStreamWriter - FileWriter
public static void main(String[] args) throws IOException { File file = new File("path/Hello1.txt"); //file.createNewFile(); FileWriter fileWriter = new FileWriter(file); //fileWriter.write("HelloHello"); fileWriter.append("append"); fileWriter.flush(); fileWriter.close(); FileReader fileReader = new FileReader(file); char[] chars = new char[50]; fileReader.read(chars); for(char c:chars) { System.out.print(c); } System.out.println((byte)chars[6]); fileReader.close(); }
运行结果:
append0
-
文件I/O:借助字节流下的FileInputStream/FileOutputStream
* Byte Stream - InputStream - FileInputStream * - OutputStream - FileOutputStream * Char Stream - Reader - BufferedReader * - InputStreamReader * - Writer - OutputStreamWriter
public static void main(String[] args) throws IOException { /*byte bytes[] = {'a','b','c','d'}; OutputStream outputStream = new FileOutputStream("path/stream"); outputStream.write(bytes); outputStream.close();*/ FileOutputStream fileOutputStream = new FileOutputStream("path/stream"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8"); outputStreamWriter.write("Hello"); //实际上写入到缓冲区,调用flush()/close()后写入到文件。 //fileOutputStream.close(); //此句可省略,否则报java.io.IOException: Stream Closed outputStreamWriter.close(); //必须要在这里close,否则可能不写入 InputStream inputStream = new FileInputStream("path/stream"); /*int size = inputStream.available(); for(int i=0;i<size;i++){ System.out.print((char)inputStream.read()); }*/ /*BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8")); String s; while( (s=bufferedReader.readLine())!=null) { System.out.print(s); } inputStream.close(); bufferedReader.close();*/ InputStreamReader inputStreamReader = new InputStreamReader(inputStream); int c; while( (c=inputStreamReader.read()) != -1){ System.out.print((char)c); } inputStream.close(); inputStreamReader.close(); }
对代码的简单说明:
-
写入文件列出2种:
- FileOutputStream.write(byte[])
- OutputStreamWriter.write(String)
-
读取文件列出3种:
- FileInputStream.read() - 返回单字符
- BufferedReader.readLine() - 读取一行
- InputStreamReader.read() - 返回单字符,-1代表已读取完毕
-
官网上给出的方法说明:
OutputStreamWriter.close(): Closes the stream, flushing it first.
FileOutputStream.close(): Closes this file output stream and releases any system resources associated with this stream. This file output stream may no longer be used for writing bytes.
运行结果:
(./path/下存在一个stream文件,内容为Hello)
Hello
-
-
文件I/O:借助字节流下的ObjectInputStream/ObjectOutputStream
* Byte Stream - InputStream - ObjectInputStream * - FileInputStream * - OutputStream - ObjectOutputStream * - FileOutputStream
public static void main(String[] args) throws Exception { String s = "Hello World"; byte[] bytes = {'e','x','a','m','p','l','e'}; FileOutputStream fileOutputStream = new FileOutputStream("path/objectstream"); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); objectOutputStream.writeObject(s); objectOutputStream.writeObject(bytes); objectOutputStream.close(); fileOutputStream.close(); FileInputStream fileInputStream = new FileInputStream("path/objectstream"); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); System.out.println((String)objectInputStream.readObject()); byte[] reads = (byte[])objectInputStream.readObject(); for(byte b:reads) { System.out.print((char)b); } objectInputStream.close(); fileInputStream.close(); }
运行结果:
Hello World example
-
目录操作
public static void main(String[] args) { String dirName = "path/testDir"; File dir = new File(dirName); //创建目录 //System.out.println(dir.mkdir()?"成功":"失败"); //读取目录 // if(dir.isDirectory()) { // System.out.println("Dir:" + dir.getName()); // String entrys[] = dir.list(); // for(String entry:entrys){ // File file = new File(dir.getName() + "/" + entry); // if(file.isDirectory()) { // System.out.println("Dir -"+file.getName()); // } else { // System.out.println("File -"+file.getName()); // } // } // } //删除目录 File[] files = dir.listFiles(); if(files != null) { for(File file:files) { String fileName = file.getName(); if(file.isDirectory()) { //对于目录,只能删除空目录。 System.out.println((file.delete()?"成功删除目录":"删除目录失败")+fileName); } else { System.out.println((file.delete()?"成功删除文件":"删除文件失败")+fileName); } } } }
运行结果:
(三块代码分别运行,运行时注释掉其他两块)
-
创建目录(略)
-
读取目录
(path/testDir下的目录结构:
-rw-rw-r-- 1 adam adam 0 Mar 6 12:05 test1 -rw-rw-r-- 1 adam adam 0 Mar 6 12:05 test2 drwxrwxr-x 2 adam adam 4096 Mar 6 11:00 test4/
)
Dir:testDir File -test1 File -test2 File -test4
-
删除目录
成功删除文件test1 成功删除文件test2 删除目录失败test4
-