Java IO总结

Posted yuwenS.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java IO总结相关的知识,希望对你有一定的参考价值。

1、Java IO

Java中的IO流大概可以分为以下几类:

  • 磁盘操作:FIie
  • 字节操作:InputStream 和 OutputStream 针对二进制文件
  • 字符操作:Reader 和 Writer 针对文本文件
  • 对象操作:Serializable
  • 网络操作:Socket
  • 新的输入和输出:NIO

1.1、磁盘操作

File可以用于表示文件和目录的信息,但是它不包括文件的内容

递归的列出文件夹中的所有文件

public static void getFileName(File file){
        if (file==null || !file.exists()){
            System.out.println("没有文件");
            return;
        }
        if (file.isFile()){
            System.out.println(file.getName());
            return;
        }
        for (File f :file.listFiles()) {
            getFileName(f);
        }
    }

从Java7开始,可以使用Paths和Files代替File

1.2、字节操作

实现文件复制

 public static void copy(String src, String dist) throws IOException {
        FileInputStream fis = new FileInputStream(src);
        FileOutputStream fos = new FileOutputStream(dist);
        byte[] buffer = new byte[1024];
        int b;
        // read() 最多读取 buffer.length 个字节
        // 返回的是实际读取的个数
        // 返回 -1 的时候表示读到 eof,即⽂件尾
        while ((b = fis.read(buffer,0,buffer.length)) != -1){
            fos.write(buffer,0,buffer.length);
        }
        fis.close();
        fos.close();
    }

使用一个具有缓存功能的字节流对象时。只需要在FileInputStream对象上再套一层BufferedInputStream对象即可

FileInputStream fis = new FileInputStream(src);
BufferedInputStream bis = new BufferedInputStream(fis);

1.3、字符操作

1.3.1、编码与解码

编码就是把字符转化为字节,而解码就是把字节重新转化为字符

如果编码和解码过程中使用了不同的编码方式就会出现乱码

  • GBK 编码中,中⽂字符占 2 个字节,英⽂字符占 1 个字节

  • UTF-8 编码中,中⽂字符占 3 个字节,英⽂字符占 1 个字节

  • UTF-16be 编码中,中⽂字符和英⽂字符都占 2 个字节

Java 的内存编码使⽤双字节编码 UTF-16be,这不是指 Java 只⽀持这⼀种编码⽅式,⽽是说 char 这种 类型使⽤ UTF-16be 进⾏编码。char 类型占 16 位,也就是两个字节,Java 使⽤这种双字节编码是为了 让⼀个中⽂或者⼀个英⽂都能使⽤⼀个 char 来存储

1.3.2、String的编码方式

String 可以看成⼀个字符序列,可以指定⼀个编码⽅式将它编码为字节序列,也可以指定⼀个编码⽅式 将⼀个字节序列解码为 String

String str = "Hello";
byte[] byte = str.getBytes("UTF-8");
String str1 = new String(bytes,"UTF-8");
System.out.println(str1);

在调⽤⽆参数 getBytes() ⽅法时,默认的编码⽅式不是 UTF-16be。双字节编码的好处是可以使⽤⼀个 char 存储中⽂和英⽂,⽽将 String 转为 bytes[] 字节数组就不再需要这个好处,因此也就不再需要双字 节编码。getBytes() 的默认编码⽅式与平台有关,⼀般为 UTF-8

String str = "Hello";
byte[] byte = str.getBytes();

1.3.3、Reader和Writer

不管是磁盘还是⽹络传输,最⼩的存储单元都是字节,⽽不是字符。但是在程序中操作的通常是字符形式的数据,因此需要提供对字符进⾏操作的⽅法

  • InputStreamReader 将字符解码为字节流
  • OutputStreamWriter 将字节流编码为字符流

实现逐行输出文本内容

public static void readFile(String fileName) throws IOException {
        FileReader fr = new FileReader(fileName);
        BufferedReader br = new BufferedReader(fr);
        String line;
        while ((line = br.readLine()) != null){
            System.out.println(line);
        }
        br.close();
    }

1.4、对象操作

1.4.1、序列化

序列化就是将对象转化成字节序列,方便存储和传输

  • 序列化:ObjectOutputStream.writeObject()
  • 反序列化:ObjectInputStream.readObject()

不会对静态变量进行序列化,因为序列化只是保存对象的状态,静态变量属于类的变量

1.4.2、Serializable

序列化的类需要实现 Serializable 接⼝,它只是⼀个标准,没有任何⽅法需要实现,但是如果不去实现它的话⽽进⾏序列化,会抛出异常

1.4.3、transient

transient 关键字可以使⼀些属性不会被序列化

以上是关于Java IO总结的主要内容,如果未能解决你的问题,请参考以下文章

java.io.ByteArrayInputStream

java大对象存取的简单实现的代码

Java IO 学习总结 学习手册总结

Java IO流基础总结

201621123062《java程序设计》第九周作业总结

Java 网络IO编程总结(BIONIOAIO均含完整实例代码)