黑马程序员—java技术blog—第四篇 IO流中其他流概述总结

 ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
一、内存操作流
 * 操作字节数组
  ByteArrayInputStream
  ByteArrayOutputStream
 操作字符数组
  CharArrayReader
  CharArrayWriter
 操作字符串
  StringReader
  StringWriter

例:
public class MemoryStreamDemo {
 public static void main(String[] args) throws IOException {
  //创建内存操作字节数组 字节输出流
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  //写数据 到内存中的 字节数组里
  baos.write("hello".getBytes());
  //关闭流
  baos.close();
 
  //获取内存中 字节数组里的 Hello
  //可使用 toByteArray() 和 toString() 获取数据
  byte[] byteArray = baos.toByteArray();
 
 
  //byte[] buffer = new byte[10];//存储获取到了内存数据的, 不会用到
  ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
 
  int ch = -1;
  while ((ch = bais.read()) != -1) {
   System.out.print((char)ch);
  }
  //关闭流
  bais.close();
二、打印流概述------------------只有输出流| 最后必须得有刷新,否则写不出数据
  字节流打印流  PrintStream
  字符打印流      PrintWriter
 打印流特点
  只能操作目的地,不能操作数据。
  可以操作任意类型的数据。
  如果启动了自动刷新,能够自动刷新。
  可以操作文件的流

 构造 方法
PrintWriter(File file)-----------------------------文件
 PrintWriter(String fileName)-------------------文件名

 PrintWriter(OutputStream out)----------------字节输出流
 PrintWriter(Writer out)-------------------------字符输出流
 
 PrintWriter(OutputStream out, boolean autoFlush)----------字节输出流+自动刷新
 PrintWriter(Writer out, boolean autoFlush)  ------------------字符输出流+自动刷新
 注:如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作

 方法:
       print()
       println()
       write()

print()方法与println()方法的区别?
  print():
   不会换行
   使用的时候 必须有参数使用
  println()
   会换行
   使用的时候 可以没有参数

 //创建打印流-- 输出流
  PrintWriter pw = new PrintWriter("pw.txt");
  PrintWriter pw = new PrintWriter(new FileWriter("pw.txt"));
  PrintWriter pw = new PrintWriter(new FileWriter("pw.txt")  ,true);//开启自动刷新
  PrintWriter pw = new PrintWriter(new FileWriter("pw.txt", true)  ,true);//开启自动刷新, 开启自动追加
                                                                                             |           |
                                                                                           追加     刷新
  //写数据
  pw.write("hello");                                              注:使用打印流时,一定得加刷新,或自动
  pw.print("haha");                                                     刷新,否则,写不进数据
  pw.println("hehe");
 
  //使用字符流的时候, 要记得刷新流              
 pw.flush();
 
  //关闭流
  pw.close();
三、系统的输入输出流  
 -----------------
  public static InputStream in
           “标准”输入流。 默认输入设备是键盘,字节输入流
 
  public static PrintStream err
           “标准”错误输出流。 输出设备是显示器。字节输出打印流
  public static PrintStream out
           “标准”输出流。 输出设备是显示器。 字节输出打印流

四、常见的键盘输入数据方式
  1,Scanner (推荐使用)
  2,System.in
 
 常见的数据输出方式
  1,System.out.println();  (推荐使用)
  2,System.out

例:
推荐使用的输出输入方式:
 输出----System.out.println("你好");
 输入---- String line = new Scanner(System.in).nextLine();-------//Scanner ,jdk5存在的
              System.out.println(line);
原始输出输入方式:
  输出-----------------  //2,System.out
  OutputStream ps = System.out;// 字节输出流
  //通过转换流,完成 字节流 转换郑 字符流
  Writer osw = new OutputStreamWriter(ps);
  BufferedWriter bw = new BufferedWriter(osw);//需要一个字符输出流
  bw.write("你好");
  bw.newLine();
  bw.flush();
输入-------------       //2,System.in 原始的方式
  InputStream is = System.in;//字节流
  //通过转换流, 完成 字节流  转换成 字符流的操作
  Reader isr = new InputStreamReader(is);
  BufferedReader br = new BufferedReader(isr);//需要一个字符流,而我现在有的是字节流,
  String line = br.readLine();
  System.out.println(line); 
五、Serializable: 序列化    ------------把对象写到流中
序列化流(对象字节输出流): ObjectOutputStream   
反序列化流(对象字节输入流): ObjectInputStream
注意:可将一个对象(对象中有其属性、自定义类)加到流中进行读写,一般是读写字节、字符的,这个是
         读写对象的。
         序列化流(对象流),要使用这个类时,他的子类、自定义类是需要实现Serializable接口的。

 写数据
//创建流对象
  ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("UserInfo.txt"));
  //写对象到流中
  User u = new User("admin", "admin", 18);
  oos.writeObject(u);
  //关闭流
  oos.close();

 读数据
//创建流对象
  ObjectInputStream ois = new ObjectInputStream(new FileInputStream("UserInfo.txt"));
  //从流中读对象
  Object obj = ois.readObject();
  System.out.println(obj);
  //关闭流
  ois.close();

要使对象可以在流中传输注意事项:
           User类必须得实现Serializable类
 解析:1. java.io.NotSerializableException: cn.itcast_05_SerializableIOStream.User
              说明,User类 没有实现序列化接口,导致该User对象 不能够在 对象的输入输出流中传输
              只能将支持 java.io.Serializable 接口的对象写入流中
           2. public interface Serializable类通过实现 java.io.Serializable
              接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化
              序列化接口没有方法或字段,仅用于标识可序列化的语义。
           public class User implements Serializable {
                        改变User.java文件内容后,新生成的Class文件的版本号
                private static final long serialVersionUID = 7026963615909981798L;

 使对象在流中传输的前提条件:
                 public class User implements Serializable {
----------------------------------------------------------------------------------
 案例:把一个类作为对象,使其在流中进行读写
User.java
SerializableIOStreamDemo.java


transient关键字
用来声明不需要序列化的成员变量----一个类被包装成了流对象,但其中的某个成员变量不想显示出来,即可
用trarsient修饰这个成员变量。

六、NIO流
概述
 NIO: 新IO的集合 ------效率高
  新IO和传统的IO有相同的目的,都是用于进行输入输出的,
  但新IO使用了不同的方式来处理输入输出,采用内存映射文件的方式,
  将文件或者文件的一段区域映射到内存中,就可以像访问内存一样的来访问文件了,这种方式效率比旧IO要高很多

方法
Files工具类中的方法
 * public static long copy(Path source, OutputStream out)
 * 复制文件
 * public static Path write(Path path, Iterable<? extends CharSequence> lines,  Charset cs, OpenOption... options) 
 * 把集合中的元素存储到文件中
 *
 * Paths: 路径工具类
 * public static Path get(String first, String... more)------------得到绝对路径
 * Charset字符编码表类
 * public static Charset forName(String charsetName)

例:
 public class NIODemo {
 public static void main(String[] args) throws IOException {
  复制文件
  Files.copy(Paths.get("prop.txt"), new FileOutputStream("NIO.txt"));
 
  把集合中的元素存储到文件中
  ArrayList<String> list = new ArrayList<String>();
  list.add("IO");
  list.add("Thread");
  list.add("GUI");
  list.add("net");
  list.add("reflect");
  list.add("中国");
 
  Files.write(Paths.get("files.txt"), list, Charset.forName("UTF-8"));
 
  //commons-io
  //CollectionUtil
  //FileUtil
 
 
 
 }
}
 ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
















           



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值