Java学习基础- I/O流
一、输入输出流的分类
什么叫输入流?什么叫输出流?用一根管道插入文件里,然后开始读数据,如果站在文件的角度这叫输出,如果站在程序角度这叫输入。记住以后说输入输出流都是站在程序的角度上来说的
二、节点流讲解
以File这个类型作为讲解节点流的典型
范例:使用FileInputStream流来读取FileInputStream.java的内容
package cn.galc.test; import java.io.*; public class TestFileInputStream { public static void main(String args[]) { int b = 0;// 使用变量b来装调用read()方法时返回的整数 FileInputStream in = null; // 使用FileInputStream流来读取有中文的内容时,读出来的是乱码,因为使用InputStream流里面的read()方法读取内容时是一个字节一个字节地读取的,而一个汉字是占用两个字节的,所以读取出来的汉字无法正确显示。 // FileReader in = null;//使用FileReader流来读取内容时,中英文都可以正确显示,因为Reader流里面的read()方法是一个字符一个字符地读取的,这样每次读取出来的都是一个完整的汉字,这样就可以正确显示了。 try { in = new FileInputStream("D:\\Java\\MyEclipse 10\\Workspaces\\AnnotationTest\\src\\cn\\galc\\test\\FileInputStream.java"); // in = new FileReader("D:/java/io/TestFileInputStream.java"); } catch (FileNotFoundException e) { System.out.println("系统找不到指定文件!"); System.exit(-1);// 系统非正常退出 } long num = 0;// 使用变量num来记录读取到的字符数 try {// 调用read()方法时会抛异常,所以需要捕获异常 while ((b = in.read()) != -1) { // 调用int read() throws Exception方法时,返回的是一个int类型的整数 // 循环结束的条件就是返回一个值-1,表示此时已经读取到文件的末尾了。 // System.out.print(b+"\t");//如果没有使用“(char)b”进行转换,那么直接打印出来的b就是数字,而不是英文和中文了 System.out.print((char) b); // “char(b)”把使用数字表示的汉字和英文字母转换成字符输入 num++; } in.close();// 关闭输入流 System.out.println(); System.out.println("总共读取了" + num + "个字节的文件"); } catch (IOException e1) { System.out.println("文件读取错误!"); } } }
范例:使用FileOutputStream流往一个文件里写入数据
package cn.galc.test; import java.io.*; public class TestFileOutputStream { public static void main(String args[]) { int b = 0; FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("D:\\Java\\MyEclipse 10\\Workspaces\\AnnotationTest\\src\\cn\\galc\\test\\MyMouseAdapter.java"); out = new FileOutputStream("D:/java/TestFileOutputStream1.java"); // 指明要写入数据的文件,如果指定的路径中不存在TestFileOutputStream1.java这样的文件,则系统会自动创建一个 while ((b = in.read()) != -1) { out.write(b); // 调用write(int c)方法把读取到的字符全部写入到指定文件中去 } in.close(); out.close(); } catch (FileNotFoundException e) { System.out.println("文件读取失败"); System.exit(-1);// 非正常退出 } catch (IOException e1) { System.out.println("文件复制失败!"); System.exit(-1); } System.out .println("TestFileInputStream.java文件里面的内容已经成功复制到文件TestFileOutStream1.java里面"); } }
FileInputStream和FileOutputStream这两个流都是字节流,都是以一个字节的形式进行输入输出的。所以对于占用两个字节存储空间的字符来进行读取的时候就会显示成乱码。
范例:使用FileWriter(字符流)向指定文件写入数据。
package cn.galc.test; /*使用FileWriter(字符流)向指定文件中写入数据 写入数据时以1个字符为单位进行写入*/ import java.io.*; public class TestFileWriter{ public static void main(String args[]){ /*使用FileWriter输出流从程序把数据写入到Uicode.dat文件中 使用FileWriter流向文件写入数据时是一个字符一个字符写入的*/ FileWriter fw = null; try{ fw = new FileWriter("D:/java/Uicode.dat"); //字符的本质是一个无符号的16位整数 //字符在计算机内部占用2个字节 //这里使用for循环把0~60000里面的所有整数都输出 //这里相当于是把全世界各个国家的文字都0~60000内的整数的形式来表示 for(int c=0;c<=60000;c++){ fw.write(c); //使用write(int c)把0~60000内的整数写入到指定文件内 //调用write()方法时,我认为在执行的过程中应该使用了“(char)c”进行强制转换,即把整数转换成字符来显示 //因为打开写入数据的文件可以看到,里面显示的数据并不是0~60000内的整数,而是不同国家的文字的表示方式 } /*使用FileReader(字符流)读取指定文件里面的内容 读取内容时是以一个字符为单位进行读取的*/ int b = 0; long num = 0; FileReader fr = null; fr = new FileReader("D:/java/Uicode.dat"); while((b = fr.read())!= -1){ System.out.print((char)b + "\t"); num++; } System.out.println(); System.out.println("总共读取了"+num+"个字符"); }catch(Exception e){ e.printStackTrace(); } } }