1-18(第一天)IO流

 


学习内容:

1.1复习Java基础 

(Java语言程序设计     附书内代码 提取码: fv6k)

  1. io流
  2. 集合框架

1.2寻找相应视频学习(SSM+Maven+IDEA开发)


 学习效果:

2.1复习Java基础 

  1. io流

关于io流的一些具体的类及其方法可以自己查看api(在没有大量练习或者实践就去强行记忆方法实在是下策),今天主要去了解它的一些思想。

文件可分为文本(.txt)和二进制(.bat)

文本IO建立在二进制IO(效率高,可移植)的基础上,是一层抽象。

例如:

文本的199存储为0x31 0x39 0x39(把199当成“199”,逐字编码)

二进制的199存储为0xC7

输入流:将外部数据输入到程序

输出流:将程序数据输入到外部

统一码:由两个字节组成,java使用统一码。

ASCII:只有8位(一个字节),是统一码的子集。

UTF-8:有1、2、3个字节(更高效)

writeBytes(String s)方法只将字符串s的每个字符统一码的低字节的输出,所以适用于ASCII码(因为ASCII码只有0-127,正好一个字节)

示例代码:【注意:下面使用的是 try-with-resources 语句,在这个例子中,数据流会在 try 执行完毕后自动被关闭,前提是,这些可关闭的资源必须实现 java.lang.AutoCloseable 接口。】

import java.io.*;

public class TestDataStream {
  public static void main(String[] args) throws IOException {
    try ( // Create an output stream for file temp.dat
      DataOutputStream output =
        new DataOutputStream(new FileOutputStream("temp.dat"));
    ) {
      // Write student test scores to the file
      output.writeUTF("John");
      output.writeDouble(85.5);
      output.writeUTF("Jim");
      output.writeDouble(185.5);
      output.writeUTF("George");
      output.writeDouble(105.25);
    }
    
    try ( // Create an input stream for file temp.dat
      DataInputStream input =
        new DataInputStream(new FileInputStream("temp.dat"));
    ) {
      // Read student test scores from the file
      System.out.println(input.readUTF() + " " + input.readDouble());
      System.out.println(input.readUTF() + " " + input.readDouble());
      System.out.println(input.readUTF() + " " + input.readDouble());
    }
  }
}

二进制IO类

  1. 要try-catch(或者抛出异常)

复制文件的核心代码:

 try (
      // Create an input stream
      BufferedInputStream input = 
        new BufferedInputStream(new FileInputStream(sourceFile));
  
      // Create an output stream
      BufferedOutputStream output = 
        new BufferedOutputStream(new FileOutputStream(targetFile));
    ) {
      // Continuously read a byte from input and write it to output
      int r, numberOfBytesCopied = 0;
      while ((r = input.read()) != -1) {
        output.write((byte)r);
        numberOfBytesCopied++;
      }

      // Display the file size
      System.out.println(numberOfBytesCopied + " bytes copied");
    }

 

对象IO类

除了可以输入输出字符,还可以输出对象

例子:

输出字符及对象

import java.io.*;

public class TestObjectOutputStream {
  public static void main(String[] args) throws IOException {
    try ( // Create an output stream for file object.dat
      ObjectOutputStream output =
        new ObjectOutputStream(new FileOutputStream("object.dat"));
    ) {
      // Write a string, double value, and object to the file
      output.writeUTF("John");
      output.writeDouble(85.5);
      output.writeObject(new java.util.Date());
    }
  }
}

输入字符及对象:

import java.io.*;

public class TestObjectInputStream {
  public static void main(String[] args)
    throws ClassNotFoundException, IOException {
    try ( // Create an input stream for file object.dat
      ObjectInputStream input =
        new ObjectInputStream(new FileInputStream("object.dat"));
    ) {
      // Read a string, double value, and object from the file
      String name = input.readUTF();
      double score = input.readDouble();
      java.util.Date date = (java.util.Date)(input.readObject());
      System.out.println(name + " " + score + " " + date);
    }
  }
}

【注意:只有可序列化的类才可被写入输出流,可序列化对象的类必须实现java.io.Serializable接口】

Serializable接口

当存储一个可序列化对象时,会对该对象的类进行编码。编码包括类名、类的签名、对
    象实例变量的值以及该对象引用的任何其他对象的闭包,但是不存储对象静态变量的值

如果一个对象是 Serializable 的实例,但它包含了非序列化的实例数据域,那么可以序
    列化这个对象吗?答案是否定的。为了使该对象是可序列化的,需要给这些数据域加上关
    键字 transient, 告诉 Java 虚拟机将对象写入对象流时忽略这些数据域。

例如:

public class C implements java.io.Serializable {
    private int vl;
    private static double v2;
    private transient A v3 = new A();
}

class A { }// A is not serializable

 

第一次写入一个对象时,就会为它创建一个序列号。

 

关键术语


binary I/O (二进制输人 / 输出)
deserialization (反序列化)
file pointer (文件指针)
random-access file (随机访问文件)

sequential-access file (顺序访问文件)
serialization (序列化)
stream (流)
text I/O (文本输入 / 输出)

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值