字节缓冲流:(BufferedInputStream,BufferedOutStream)

*按照流的功能来分:节点流和处理流
*节点流可以直接操作数据源:
*InputStream
*--FileInputStream
*OutputStream
*--FileOutputStream
*Reader
*--FileReader
*Writer
*--FileWriter
*处理流:不能直接操作数据源,要结合节点流进行使用,主要作用是用于简化操作和提高效率。
*--缓冲流
*字节缓冲流:BufferedInputStream/BufferedOutputStream
* 优点:降低对磁盘IO的访问频率,提高读写效率。
*java.io.BufferedInputStream类
*常用构造方法:
* BufferedInputStream(InputStream in):创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用
* BufferedInputStream(InputStream in, int size)创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
*常用方法:
* read() 参见 InputStream 的 read 方法的常规协定。
* read(byte[] b, int off, int len) 从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中。
* close() 关闭此输入流并释放与该流关联的所有系统资源。
*java.io.BufferdOutputStream类:该类实现缓冲的输出流
* 常用的构造方法:
* BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
* BufferedOutputStream(OutputStream out, int size)
* 常用的方法:
* write(int b)将指定的字节写入此缓冲的输出流。
* write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。
* flush()刷新此缓冲的输出流。
*
*字符缓冲流:BufferedReader/BufferedWriter
*--转换流:将字节流转换为字符流
*InputStreamReader:将字节输入流转换为字符输入流。
*OutputStreamWriter:将字节输出流转为字符输出流。

  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7.  
  8. public class TestBufferedStream {
  9. /**
  10. * 利用缓冲流将D:/mp3/test.mp3复制E:/
  11. * @param args
  12. */
  13. public static void main(String[] args) {
  14. FileInputStream fis=null;
  15. FileOutputStream fos =null;
  16. BufferedInputStream bis=null;
  17. BufferedOutputStream bos =null;
  18. try {
  19. fis = new FileInputStream("D:/mp3/test.mp3");
  20. fos = new FileOutputStream("E:/test.mp3");
  21. //创建缓冲流
  22. bis = new BufferedInputStream(fis);
  23. bos = new BufferedOutputStream(fos);
  24. int i;
  25. while((i=bis.read())!=-){
  26. bos.write(i);
  27. }
  28. bos.flush();//刷新缓冲流(将缓冲流与磁盘同步)
  29. System.out.println("复制完成!");
  30. } catch (FileNotFoundException e) {
  31. e.printStackTrace();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }finally{
  35. try {
  36. bos.close();
  37. bis.close();
  38. fos.close();
  39. fis.close();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }
  45. }

字符缓冲流:( BufferedReader/BufferedWriter)

* 字符缓冲流:BufferedReader/BufferedWriter
* java.io.BufferedReader类:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
* 构造方法:
* BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流
* BufferedReader(Reader in, int sz)创建一个使用指定大小输入缓冲区的缓冲字符输入流。
* 常用的方法:
* readLine() 读取一个文本行。
*
* java.io.BufferedWriter类:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
* 构造方法:
* BufferedWriter(Writer out): 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
* BufferedWriter(Writer out,int size):创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
* 常用方法:
* newLine()写入一个行分隔符。
* flush()刷新该流的缓冲。
* writer(String str):将写入一个字符串。
* close():关闭此流,但要先刷新它。

  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7.  
  8. public class TestBufferedReaderWriter {
  9. public static void main(String[] args) {
  10. FileReader reader=null;
  11. FileWriter writer=null;
  12. BufferedReader br=null;
  13. BufferedWriter bw =null;
  14. try {
  15. reader = new FileReader("D:/reader.txt");
  16. writer = new FileWriter("E:/reader.txt");
  17. br = new BufferedReader(reader);
  18. bw = new BufferedWriter(writer);
  19. String str;
  20. while((str=br.readLine())!=null){
  21. bw.write(str);
  22. bw.newLine();
  23. }
  24. bw.flush();
  25. System.out.println("复制完成!");
  26. } catch (FileNotFoundException e) {
  27. e.printStackTrace();
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }finally{
  31. try {
  32. bw.close();
  33. br.close();
  34. writer.close();
  35. reader.close();
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40.  
  41. }
  42. }

* 编写一个代码统计器,统计某个目录下的所有代码的行数

  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6.  
  7. public class CodeCounter {
  8. static long line;
  9. /**
  10. * 统计代码的行数
  11. */
  12. public static void calcCounter(File file){
  13. if(file.exists()){
  14. if(file.isDirectory()){
  15. File[] fs = file.listFiles();//获取指定目录下的子目录或子文件
  16. for (File f : fs) {
  17. calcCounter(f);//递归调用
  18. }
  19. }else{
  20. //如果是文件,统计该文件中的行数
  21. String fileName = file.getName();//获取文件名称
  22. //判断该文件是否为java源文件(后缀为.java)或c的源文件(后缀为.c)
  23. if(fileName.endsWith(".java")||fileName.endsWith(".c")){
  24. try {
  25. //使用输入流读取源文件中行数
  26. FileReader fr = new FileReader(file);
  27. BufferedReader br = new BufferedReader(fr);
  28. String str;
  29. while((str=br.readLine())!=null){
  30. line++;//统计行数
  31. }
  32. br.close();
  33. fr.close();
  34. } catch (FileNotFoundException e) {
  35. e.printStackTrace();
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }
  41. }else{
  42. System.out.println("目录有误!");
  43. }
  44. }
  45.  
  46. public static void main(String[] args) {
  47. File file = new File("D:/CFree");
  48. calcCounter(file);
  49. System.out.println("总共有"+line+"行代码");
  50. }
  51. }

转换流: (InputStreamReader/OutputStreamWriter)

* InputStreamReader:将字节输入流转换为字符输入流,继承了Reader类
* 常用的构造函数:
* InputStreamReader(InputStream in)创建一个使用默认字符集的 InputStreamReader。
*
* OutputStreamWriter:将字节输出流转换为字符输出流
* System.in---->InputStream:标准输入流
* System.out---->PrintStream:标准输出流

  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7.  
  8. public class TestConverterIO {
  9. public static void main(String[] args) {
  10. // Scanner input = new Scanner(System.in);
  11. // String line = input.nextLine();
  12. InputStreamReader isr = new InputStreamReader(System.in);
  13. BufferedReader br = new BufferedReader(isr);
  14. OutputStreamWriter osw =null;
  15. BufferedWriter bw=null;
  16. try {
  17. osw = new OutputStreamWriter(new FileOutputStream("D:/aa.txt"));
  18. bw = new BufferedWriter(osw);//创建一个字符输出缓冲流
  19. String str = br.readLine()
  20. while(!str.equals("exit")){
  21. // System.out.println(str);
  22. bw.write(str);//将控制台输入的字符串写入到D:/aa.txt文件中
  23. bw.newLine();//换行
  24. str = br.readLine();
  25. }
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }finally{
  29. try {
  30. br.close();
  31. isr.close();
  32. bw.close();
  33. osw.close();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38.  
  39. }
  40. }

常用处理流(关闭处理流使用关闭里面的节点流)

  • 缓冲流:BufferedInputStrean BufferedOutputStream BufferedReader BufferedWriter

     ---增加缓冲功能,避免频繁读写硬盘。

  •   转换流:InputStreamReader OutputStreamReader实现字节流和字符流之间的转换。
  •   数据流 DataInputStream DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来.  

*处理流:
*DataInputStream/DataOutputStream类:方便对java中的基本数据类型和字符串进行操作。二进制文件
*java.io.DataInputStream类:
* 构造方法:DataInputStream(InputStream in)
*常用的方法:readXxx():xxx代表数据类型。
* readInt():读取int类型的数据
* readDouble():读取double类型的数据
* readBoolean():读取boolean类型的数据
* ...
* readUTF():读取字符串类型的数据。
*java.io.DataOutputStream类:
* 构造方法:DataOutputStream(OutputStream out)
*常用的方法:writeXxx():Xxx代表数据类型
* writeInt(int i):写入一个int类型的值
* writeDouble(double d):写入double类型的值

在使用数据流的时候,必须先写入文件内容,再用输入流去读该文件,不然会出现二进制之前转换的错误。

  1. import java.io.BufferedInputStream;
  2. import java.io.DataInputStream;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6.  
  7. public class TestDataInputStream {
  8. public static void main(String[] args) {
  9. try {
  10. FileInputStream fis = new FileInputStream("D:/data.txt");
  11. BufferedInputStream bis = new BufferedInputStream(fis);
  12. DataInputStream dis = new DataInputStream(bis);
  13. int i = dis.readInt();
  14. System.out.println("i="+i);
  15. double d = dis.readDouble();
  16. System.out.println("d="+d);
  17. String str = dis.readUTF();
  18. System.out.println("str="+str);
  19. //关闭资源
  20. dis.close();
  21. } catch (FileNotFoundException e) {
  22. e.printStackTrace();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26.  
  27. }
  28. }
  1. import java.io.BufferedOutputStream;
  2. import java.io.DataOutputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6.  
  7. public class TestDataOutputStream {
  8. public static void main(String[] args) {
  9. try {
  10. FileOutputStream fos = new FileOutputStream("D:/data.txt");
  11. BufferedOutputStream bos = new BufferedOutputStream(fos);
  12. DataOutputStream dos = new DataOutputStream(bos);
  13. dos.writeInt();
  14. dos.writeDouble(3.14);
  15. dos.writeUTF("hello");
  16. dos.flush();
  17. dos.close();
  18. System.out.println("写入完毕!");
  19. } catch (FileNotFoundException e) {
  20. e.printStackTrace();
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24.  
  25. }
  26. }

对象的序列化 ObjectOutputStream:

*对象的反序列化:将字节序列转化为java对象的过程。
*为什么要序列化:将对象序列化后变成字节序列可以保存在磁盘或通过网络传输,以实现对象共享(字节序列可以跨平台)。
*序列化的条件:必须实现Serializable 接口
*序列化需要使用ObjectOutputStream类将对象写入到磁盘或网络
*java.io.ObjectOutputStream类继承了OutputStream类,按照功能划分的话属于处理流。
*构造方法:ObjectOutputStream(OutputStream out)
*常用的方法:
* writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。

  1. import java.io.FileNotFoundException;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.ObjectOutputStream;
  5. import java.io.OutputStream;
  6.  
  7. public class TestObjectOutputStream {
  8. public static void main(String[] args) {
  9. Student stu = new Student("张三", , "郑州尚学堂");
  10. try {
  11. OutputStream ops = new FileOutputStream("D:/test.obj");
  12. ObjectOutputStream oos = new ObjectOutputStream(ops);
  13. oos.writeObject(stu);
  14. oos.flush();
  15. oos.close();
  16. System.out.println("对象写入完成!");
  17. } catch (FileNotFoundException e) {
  18. e.printStackTrace();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

对象的序列化 ObjectInputStream:

*对象的反序列化:将字节序列转化为java对象的过程。
*为什么要序列化:将对象序列化后变成字节序列可以保存在磁盘或通过网络传输,以实现对象共享(字节序列可以跨平台)。
*序列化的条件:必须实现Serializable 接口
*反序列化需要ObjectInputStream使用类将字节序列转化为对象
*java.io.ObjectInputStream类继承了InputStream类,按照功能划分的话属于处理流。
*构造方法:ObjectInputStream(InputStream in)
*常用的方法:
* readObject() 将字节序列转为对象。

  1. import java.io.FileInputStream;
  2. import java.io.FileNotFoundException;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.ObjectInputStream;
  6.  
  7. public class TestObjectInputStream {
  8. public static void main(String[] args) {
  9. try {
  10. InputStream ips = new FileInputStream("D:/test.obj");
  11. ObjectInputStream ois= new ObjectInputStream(ips);
  12. Object obj = ois.readObject();
  13. Student student = (Student)obj; //若有多个对象,可以用循环
  14. System.out.println(student);
  15. ois.close();
  16. } catch (FileNotFoundException e) {
  17. e.printStackTrace();
  18. } catch (ClassNotFoundException e) {
  19. e.printStackTrace();
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23.  
  24. }
  25. }

Properties:

* java.util.Properties类:继承了Hashtable类,采用键值对的方式进行存储。
* *.properties文件存储方式是按照键值对的方式进行存储:key=value 常用的构造方法:
* Properties():创建一个无默认值的空属性列表。 常用的方法: load(InputStream
* inStream)从输入流中读取属性列表(键和元素对)。 getProperty(String key)用指定的键在此属性列表中搜索属性。

  1. import java.io.FileInputStream;
  2. import java.io.FileNotFoundException;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.util.Properties;
  6.  
  7. public class TestProperties {
  8. public static void main(String[] args) {
  9. Properties props = new Properties();
  10. try {
  11. // InputStream ips = new FileInputStream("D:\\code\\ioDemo\\jdbc.properties");//绝对路径
  12. InputStream ips = new FileInputStream("jdbc.properties");//相对路径(相对于当前项目的根目录)
  13. props.load(ips);
  14. String driver = props.getProperty("driver");
  15. String url = props.getProperty("url");
  16. String username = props.getProperty("username");
  17. String password = props.getProperty("password");
  18. System.out.println("驱动名称:" + driver);
  19. System.out.println("资源路径:" + url);
  20. System.out.println("用户名:" + username);
  21. System.out.println("密码:" + password);
  22. } catch (FileNotFoundException e) {
  23. e.printStackTrace();
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  1. world=
  2. china=
  3. henan=
  4. zhengzhou=asdsa

java:IO流(处理流(缓冲流,转换流,数据流),对象的序列化,Properties)的更多相关文章

  1. Java IO学习笔记(三)转换流、数据流、字节数组流

    转换流 1.转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和 ...

  2. 1.java.io包中定义了多个流类型来实现输入和输出功能,

    1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分 类,按功能分为:(C),如果为读取的内容进行处理后再输出,需要使用下列哪种流?(G)   A.输入流和输出流 B ...

  3. Java IO流学习总结五:转换流-InputStreamReader、OutputStreamWriter

    类的继承关系 Reader |__ BufferedReader.StringReader.InputStreamReader |__ FileReader Writer |__ BufferedWr ...

  4. Java:IO流-流的操作规律和转换流

    首先我们先来了解一些IO流基本知识. 一,基本知识概括 具体的IO流有很多种,针对不同的应用场景应该使用相应的流对象.但怎么确定应该使用哪个IO流对象呢? 一般要有四个明确: 1)明确源和目的 源:I ...

  5. [19/04/02-星期二] IO技术_字符流分类总结(含字符转换流InputStreamReader/ OutputStreamWriter,实现字节转字符)

    一.概念 ------->1.BufferedReader/BufferedWriter [参考19.03.31文章] *Reader/Writer-------->2.InputStre ...

  6. (19)IO流之字符流FileReader和FileWriter,缓冲字符流---缓冲输入字符流BufferedReader和缓冲输出字符流BufferedWriter

    字符流,读取的文件是字符的时候,有两个基类一个是Reader,一个是Writer这有点拟人的感觉,人直接看懂的是文字 字符流 字节流:读取的是文件中的二进制字节流并不会帮你转换成看的懂得字符 字符流: ...

  7. Java IO学习笔记(四)打印流

    1.只有输出流才有打印流:PrintWriter和PrintStream分别针对字符和字节,提供了重载的print,Println方法用于多种数据类型的输出.PrintWriter和PrintStre ...

  8. java io 学习笔记(三) 字符流读写

    1.字符流读取 字符流读取的所有类都是从Reader这个超类继承的,都是用于读取字符的,这些类分别是InputSteamReader(从字符流读取).FileReader(继承与InputStream ...

  9. 系统学习 Java IO (五)----使用 SequenceInputStream 组合多个流

    目录:系统学习 Java IO---- 目录,概览 SequenceInputStream 可以将两个或多个其他 InputStream 合并为一个. 首先,SequenceInputStream 将 ...

  10. Java IO 转换流 字节转字符流

    Java IO 转换流 字节转字符流 @author ixenos 字节流 输入字节流:---------| InputStream 所有输入字节流的基类. 抽象类.------------| Fil ...

随机推荐

  1. Codeforces Manthan, Codefest 18 (rated, Div. 1 + Div. 2) E.Trips

    比赛的时候想到怎么做了 没调出来(感觉自己是个睿智) 给你N个点M条边,这M条边是一条一条加进去的 要求你求出加入每一条边时图中极大'K度'子图的大小 极大'K度'子图的意思是 要求出一个有尽量多的点 ...

  2. 线段树(SegmentTree)基础模板

    线段树模板题来源:https://www.lintcode.com/problem/segment-tree-build/description 201. 线段树的构造 /** * Definitio ...

  3. ES数据架构与关系数据库Mysql

    ES数据架构的主要概念(与关系数据库Mysql对比) MySQL ElasticSearch Database Index Table Type Row Document Column Field S ...

  4. 关于order_by

  5. HTML5日期时间输入类型注意事项(time,date)

    原文链接:http://www.webhek.com/post/html5-date.html 1.HTML5规范里只规定date新型input输入类型,并没有规定日历弹出框的实现和样式.所以,各浏览 ...

  6. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    $ POJ~1038~~\times Bugs~Integrated~Inc: $ (复杂的状压DP) $ solution: $ 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前 ...

  7. 【CF160E】Buses and People

    题目大意:给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a<a', b'<b, c'<c 的最小 c 对应的元组编号. ...

  8. Jenkins环境搭建遇到的问题

    参考文章 https://www.cnblogs.com/yuanluo9898/p/10724252.html 问题一:tomcat启动乱码,如图所示 解决方案:https://blog.csdn. ...

  9. JPA的常用Annotation

    http://www.blogjava.net/zJun/archive/2007/01/24/95747.html @transient 忽略该方法 一. @Entity:通过@Entity注解将一 ...

  10. Wpf自动滚动效果

    一.思路 1.使用ScrollView的Scroll.ScrollToVerticalOffset(offset)方法进行滚动 2.ScrollView中放置2个ListView,第一个滚动出边界后, ...