IO流的分类: 1.流对象划分例子: 操作内存中的流对象:InputStreamReader 操作外界设备中的流对象:InputStream,OutputStream 如何区别:所有流对象后缀名称包含Reader又或者Writer 都是属于内存中操作的流对象,否则都视为外界设备流.其中PrintStream例外 2.数据流向划分: 输出流:写入数据 属于程序内存到外界设备 例如jvm运行的程序直接操作到本地硬盘上 输入流:当然事读取数据 与上面反则的道理 一般输入流名称带有Input 而输出流Output 3.流数据格式划分: 对于数据的处理,每个流不同都有其自身操作的优势. 字符流处理声音或者图片等数据比较好,比如InputStream 字符流处理文本格式的数据如InputStreamReader 区分方法 操作内存是字符流,操作外界设备属于字节流
4.流数据包装 原始流:实例化对象过程不需传入另外的流为自己构造参数成为原始流 包装流:实例化对象需要传入另外流为自己构造参数叫包装流
下面是一些流对象使用demo /* * 字节流缓冲区流读写字节数组 */ private static void copyFile(File srcFile, File destFile) throws IOException { // 计数器加一 count ++; // 创建字节输入流 FileInputStream fis = new FileInputStream(srcFile); // 创建字节输出流 FileOutputStream fos = new FileOutputStream(destFile);
int len = 0; byte[] buffer = new byte[1024]; // 循环读取数据 while((len = fis.read(buffer)) !=-1) { // 利用输出流往输出目的写数据 fos.write(buffer,0,len); }
// 关闭资源 fis.close(); fos.close(); } //文件输入流写入数据 public static void calc(Character a) throws IOException { Map<Character,Integer> maps = new HashMap<>(); FileInputStream fis = new FileInputStream("lhh.txt"); int len = -1; while ( (len = fis.read()) != -1){ char ch = (char) len; if(maps.get(ch) == null){ maps.put(ch,1); }else { Integer cout = maps.get(ch); maps.put(ch,cout+1); } } System.out.println(a+"出现"+maps.get(a)+"次");
} BufferedWriter 字符缓冲流操作 private static void reverseCopy() throws Exception { BufferedWriter bw = new BufferedWriter(new FileWriter("test.txt")); bw.write("我爱黑马"); bw.newLine(); bw.write("123456"); bw.close(); BufferedReader br = new BufferedReader(new FileReader("test.txt")); String line = null; List<String> list = new ArrayList<>(); while ((line = br.readLine()) != null) list.add(line); //br.close(); Collections.reverse(list); BufferedWriter bw0 = new BufferedWriter(new FileWriter("test1.txt")); for(String s : list) { bw0.write(s); bw0.newLine(); } bw0.close(); } |