蓝旭第三次培训预习
-
I : Input
-
O : Output
通过IO可以完成硬盘文件的读和写
-
按照
字符
的方式读取数据的,一次读取一个字符.
流的分类:
-
输入流、输出流
-
字节流、字符流
java.io.InputStream 字节输入流
java.io.OutputStream 字节输出流
java.io.Reader 字符输入流
java.io.Writer 字符输出流
注意:
四大家族的首领都是抽象类。(abstract class) 所有的流都实现了: java.io.Closeable接口,都是可关闭的,都有 close() 方法。 流是一个管道,这个是内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费(占用)很多资源。 所有的 输出流 都实现了: java.io.Flushable接口,都是可刷新的,都有 flush() 方法。 进行flush操作清空管道。
在java中只要“类名”以 Stream
结尾的都是字节流。以“ Reader/Writer
”结尾的都是字符流。
实例:
public class FileInputStreamTest04 { public static void main(String[] args) { FileInputStream fis = null; try { fis = new FileInputStream("chapter23/src/tempfile3"); // 开始读,采用byte数组,一次读取多个字节。最多读取“数组.length”个字节。 byte[] bytes = new byte[4];// 准备一个4个长度的byte数组,一次最多读取4个字节。 int readCount = 0; // 这个方法的返回值是:读取到的字节数量。(不是字节本身);1个字节都没有读取到返回-1(文件读到末尾) while((readCount = fis.read(bytes)) != -1) { // 不应该全部都转换,应该是读取了多少个字节,转换多少个。 System.out.print(new String(bytes, 0, readCount)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 在finally语句块当中确保流一定关闭。 if (fis != null) {// 避免空指针异常! // 关闭流的前提是:流不是空。流是null的时候没必要关闭。 try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
public class FileInputStreamTest05 { public static void main(String[] args) { FileInputStream fis = null; try { fis = new FileInputStream("tempfile"); System.out.println("总字节数量:" + fis.available()); // 读1个字节 //int readByte = fis.read(); // 还剩下可以读的字节数量是:5 //System.out.println("剩下多少个字节没有读:" + fis.available()); // 这个方法有什么用? byte[] bytes = new byte[fis.available()]; // 这种方式不太适合太大的文件,因为byte[]数组不能太大。 // 不需要循环了。 // 直接读一次就行了。 int readCount = fis.read(bytes); // 6 System.out.println(new String(bytes)); // abcdef // skip跳过几个字节不读取,这个方法也可能以后会用! fis.skip(3); System.out.println(fis.read()); //100 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
工程Project的根就是IDEA的默认当前路径
java.io.FileInputStream
文件字节输入流,万能的,任何类型的文件都可以采用这个流来读
public class FileInputStreamTest04 { public static void main(String[] args) { FileInputStream fis = null; try { fis = new FileInputStream("chapter23/src/tempfile3"); // 开始读,采用byte数组,一次读取多个字节。最多读取“数组.length”个字节。 byte[] bytes = new byte[4];// 准备一个4个长度的byte数组,一次最多读取4个字节。 int readCount = 0; // 这个方法的返回值是:读取到的字节数量。(不是字节本身);1个字节都没有读取到返回-1(文件读到末尾) while((readCount = fis.read(bytes)) != -1) { // 不应该全部都转换,应该是读取了多少个字节,转换多少个。 System.out.print(new String(bytes, 0, readCount)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 在finally语句块当中确保流一定关闭。 if (fis != null) {// 避免空指针异常! // 关闭流的前提是:流不是空。流是null的时候没必要关闭。 try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
public class FileInputStreamTest05 { public static void main(String[] args) { FileInputStream fis = null; try { fis = new FileInputStream("tempfile"); System.out.println("总字节数量:" + fis.available()); // 读1个字节 //int readByte = fis.read(); // 还剩下可以读的字节数量是:5 //System.out.println("剩下多少个字节没有读:" + fis.available()); // 这个方法有什么用? byte[] bytes = new byte[fis.available()]; // 这种方式不太适合太大的文件,因为byte[]数组不能太大。 // 不需要循环了。 // 直接读一次就行了。 int readCount = fis.read(bytes); // 6 System.out.println(new String(bytes)); // abcdef // skip跳过几个字节不读取,这个方法也可能以后会用! fis.skip(3); System.out.println(fis.read()); //100 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
java.io.FileOutputStream
public class FileOutputStreamTest01 { public static void main(String[] args) { FileOutputStream fos = null; try { // myfile文件不存在的时候会自动新建! // 这种方式谨慎使用,这种方式会先将原文件清空,然后重新写入。 //fos = new FileOutputStream("myfile"); // 以追加的方式在文件末尾写入。不会清空原文件内容。 fos = new FileOutputStream("tempfile3", true); // 开始写。 byte[] bytes = {97, 98, 99, 100}; // 将byte数组全部写出! fos.write(bytes); // abcd // 将byte数组的一部分写出! fos.write(bytes, 0, 2); // 再写出ab // 字符串 String s = "我是一个中国人,我骄傲!!!"; // 将字符串转换成byte数组。 byte[] bs = s.getBytes(); // 写 fos.write(bs); // 写完之后,最后一定要刷新 fos.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
java.io.BufferedWriter、 java.io.OutputStreamWriter
BufferedWriter:带有缓冲的字符输出流。 OutputStreamWriter:字节输出流转字符输出流
java.io.DataInputStream
DataInputStream:数据字节输入流。
DataOutputStream写的文件,只能使用DataInputStream去读。并且读的时候你需要提前知道写入的顺序。
读的顺序需要和写的顺序一致。才可以正常取出数据