美文网首页
四、文件传输基础——Java IO流

四、文件传输基础——Java IO流

作者: Lord丶轩莫言弃 | 来源:发表于2019-07-19 17:36 被阅读0次

1、文件的编码(Java是双字符编码UTF-16be编码)

  • GBK编码中文占2个字节,英文占1个字节。
  • UTF-8编码中文占3个字节,英文占1个字节。
  • UTF-16be中文占2个字节,英文占2个字节。

2、 File 类常用 API 介绍

  • file.exists():判断文件/文件夹是否存在。
  • file.mkdir():创建文件夹。
  • file.mkdirs():创建文件夹(多级目录)。
  • file.delete():删除文件/文件夹。
  • File.separator:设置分隔符。
  • file.isDirectory():是否是一个目录。
  • file.isFile():是否是一个文件。
  • file.createNewFile():创建文件。
  • file.getParent():获取父目录。
  • file.list():列出当前目录下的子目录和文件。

3、遍历目录

public class FileUtils {

    /**
     * 列出指定目录下(包括其子目录)的所有文件
     * @param dir
     * @throws IOException
     */
    public static void listDirectory(File dir) throws IOException {
        if (!dir.exists()) {
            throw new IllegalArgumentException("目录" + dir + "不存在.");
        }
        if (!dir.isDirectory()) {
            throw new IllegalArgumentException(dir + "不是目录.");
        }

        // 返回的是,直接子目录(文件)的抽象
        File[] files = dir.listFiles();
        if (files != null && files.length > 0) {
            for (File file : files) {
                if (file.isDirectory()) {
                    // 递归
                    listDirectory(file);
                } else {
                    System.out.println(file);
                }
            }
        }
    }

}

4、RandomAccessFile基本操作

  • RandomAccessFile Java提供的对文件内容的访问,既可以读文件,也可以写文件。
  • RandomAccessFile 支持随机访问文件,可以访问文件的任意位置。

5、字节流之文件输入流FileInputStream

  • InputStream抽象了应用程序读取数据的方式。
  • EOF = End 读到-1就是读到结尾。
  • in.read() 读取一个字节无符号填充到int低八位。-1是EOF。
  • in.read(byte[] buf) 读取数据填充到字节数组buf。
  • in.read(byte[] buf,int start,int size) 读取数据到字节数组buf,从buf的start位置开始,存放size长度的数据。
public class IOUtils {

    /**
     * 读取指定文件内容,按照16进制输出到控制台
     * 并且每输出10个byte换行
     * @param fileName
     * @throws IOException 
     */
    public static void printHex(String fileName) throws IOException {
        // 把文件作为字节流进行读操作
        FileInputStream in = new FileInputStream(fileName);
        int b;
        int i = 1;
        while ((b = in.read()) != -1) {
            if (b <= 0xf) {
                // 单位数前面补0
                System.out.println("0");
            }
            System.out.print(Integer.toHexString(b) + "  ");
            if (i++ % 10 == 0) {
                System.out.println();
            }
        }
        in.close();
    }
    
    public static void printHexByByteArray(String fileName) throws IOException {
        FileInputStream in = new FileInputStream(fileName);
        byte[] buf = new byte[2 * 1024];

        /**
         * 从in中批量读取字节,放到buf这个字节数组中,
         * 从第0个位置开始放,最多放buf.length个,
         * 返回的是读到的字节个数
         */
        int bytes = 0;// 一次性读完,说明字节数组足够大
        int j = 1;
        while ((bytes = in.read(buf, 0, buf.length)) != -1) {
            for (int i = 0; i < bytes; i++) {
                if (buf[i] <= 0xf) {
                    System.out.println("0");
                }
                System.out.print(Integer.toHexString(buf[i] & 0xff) + "  ");
                if (j++ % 10 == 0) {
                    System.out.println();
                }
            }
        }
        in.close();
    }

}

6、字节流之文件输出流FileOutputStream

  • OutputStream抽象了应用程序写出数据的方式。
  • out.write(int b) 写出一个byte到流,b的低8位。
  • out.write(byte[] buf) 将buf字节数组写入到流。
  • out.write(byte[] buf,int start,int size)。
public static void copyFile(File srcFile, File destFile) throws IOException {
    if (!srcFile.exists()) {
        throw new IllegalArgumentException("文件" + srcFile + "不存在.");
    }
    if (!destFile.isFile()) {
        throw new IllegalArgumentException(destFile + "不是文件.");
    }

    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    byte[] buf = new byte[8 * 1024];
    int b;
    while ((b = in.read(buf, 0, buf.length)) != -1) {
        out.write(buf, 0, b);
        out.flush();
    }
    in.close();
    out.close();
}

7、 字节流之数据输入输出流

  • DataOutputStream/DataInputStream对“流”功能的扩展,可以更加方便的读取int、long,字符等类型数据。
  • DataOutputStream writerInt()/writeDouble()/writeUTF()都是以装饰模式实现的。
public static void main(String[] args) throws IOException {
    String file = "demo/test.txt";
    DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
    dos.writeInt(10);
    dos.writeInt(-10);
    dos.writeLong(10L);
    dos.writeDouble(10.12D);
    // 采用UTF-8编码写出
    dos.writeUTF("中国");
    // 采用UTF-16be编码写出
    dos.writeChars("Java");
    dos.close();
}

8、字节缓冲流

  • BufferedInputStream&BufferedOutStream 这两个流类为IO提供了带缓冲区的操作,一般打开文件进行写入或读取操作时,都会加上缓冲,这种流模式提高了IO的性能
/**
* 进行文件的拷贝,利用带缓冲的字节流
* @param srcFile
* @param destFile
* @throws IOException
*/
public static void copyFileByBuffer(File srcFile, File destFile) throws IOException {
    if (!srcFile.exists()) {
        throw new IllegalArgumentException("文件" + srcFile + "不存在.");
    }
    if (!destFile.isFile()) {
        throw new IllegalArgumentException(destFile + "不是文件.");
    }

    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));

    int c;
    while ((c = bis.read()) != -1) {
        bos.write(c);
        bos.flush();// 刷新缓冲区
    }
    bis.close();
    bos.close();
}

9、字节字符转换流

  • 认识文本和文本文件
    • Java的文本是(char)是16位无符号整数,是字符的unicode编码(双字节编码)
    • 文件是byte byte byte ...的数据序列
    • 文本文件是文本(char)序列,按照某种编码方案(UTF-8、UTF-16be、GBK)序列化为byte的存储结果
  • 字符流(Reader、Writer)
    • 字符的处理,一次处理一个字符
    • 字符的底层仍然是基本的字节序列
  • InputStreamReader 完成byte流解析为char流,按照编码解析
  • OutputStreamWriter 提供char流到byte流,按照编码解析

相关文章

  • 四、文件传输基础——Java IO流

    1、文件的编码(Java是双字符编码UTF-16be编码) GBK编码中文占2个字节,英文占1个字节。 UTF-8...

  • 文件传输基础-Java IO流

    文件的编码 java.io.File类用于表示文件(目录)File类只用于表示文件(目录)的信息(名称、大小等),...

  • 文件传输基础——Java IO流

    了解 文件的编码 File类的使用 RandomAccessFile类的使用 字节流 字符流 对象的序列化和反序列...

  • java IO入门笔记

    1.java IO流的概念,分类,类图 1.1. java IO 流的概念 java的io是实现输入和输出的基础,...

  • Java IO详解

    1 Java IO流的概念,分类 1.1 Java IO流的概念 java的IO是实现输入和输出的基础,可以方便的...

  • java基础之IO流

    IO流上:概述、字符流、缓冲区(java基础) IO流结构图 FilterInputStream、FilterOu...

  • java io 流

    java io 流 io 流总览 io 流主要提供四个接口 InputStream: 输入字节流 OutputSt...

  • 文件的编码,文件传输基础-Java IO流

    Java IO流 编码问题 gbk编码,英文占1个字节,中文占2个字节utf-8编码,英文占1个字节,中文占3个字...

  • Java之IO流详解

    title: Java之IO流详解tags: Java IO流categories: Java IO流 大多数应用...

  • Java基础之IO流

    ##Java基础之IO流IO流常用几个类的关系如下: 字节流 字节输入流FileInputStream 读取文件用...

网友评论

      本文标题:四、文件传输基础——Java IO流

      本文链接:https://www.haomeiwen.com/subject/cmislctx.html