IO流


  • I:input - 输入(读取),eg:把硬盘的内容读取到内存
  • O: output - 输出(写入) eg:把内存中的东西写入硬盘保存
  • 流:数字(字符/字节) 一般1个字符=2Byte,1Byte = 8bit

字节流可以读取任意文件:音乐/图片/...,

  • 抛出文件不存在异常,这里统一throws扔给JVm处理,也可以try catch

字节输出流 -所有字节输出的父类


  • java.io.OutputStream -字节输出流的顶级抽象父类,有以下几种抽象方法

    1. void close()

      关闭此输出流并释放与此流有关的所有系统资源。

    2. void flush()

      刷新此输出流并强制写出所有缓冲的输出字节。

    3. void write(byte[] b)

      将 b.length 个字节从指定的 byte 数组写入此输出流。

    4. void write(byte[] b, int off, int len)

      将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

    5. abstract void write(int b)

      将指定的字节写入此输出流。

java.io.FileOutpuStream extends OutputStream


  • FileOutputStream: 文件字节输出流

    1. 作用:把把内存中的东西写入文件

    2. 构造方法:

    FileOutputStream(String name)

    创建一个向具有指定名称的文件中写入数据的输出文件流。

    FileOutputStream(File file)

    创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

    1. FileOutputStream(File file, boolean append)

      append为追加写开关,true为追加写,false为创建一个新文件

    2. 构造方法的作用:

      1. 创建一个FileOutputStream对象
      2. 会根据构造方法中传递的文件/文件路径,创建一个空的文件
      3. 会把FileOutputStream对象指向创建好的文件
  • 数据写入原理(内存->硬盘)

    1. java程序 - JVM虚拟机 - OS - OS调用写数据的方法 - 写入文件
  • 字节输出流的使用步骤

    1. 创建FileOUtputStream对象,并传递写入数据的目的地
    2. 调用FileOutputStream对象中的方法,write方法写入文件中
    3. 流会占用内存,要释放资源
  1. import java.io.FileOutputStream;
  2. import java.io.IOException;
  3. public class IOApi {
  4. public static void main(String[] args) throws IOException {
  5. //构造方法中绑定要写入数据的目的地
  6. FileOutputStream output = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\java_code\\test.txt");
  7. output.write(65); //十进制65 -> 二进制100 0001‬
  8. /*
  9. 任意的文本编辑器,在打开文件时都会查询编码表,把字节表示转换
  10. 字符表示
  11. 若是0-127,则会查询ASCII表
  12. 其他值:查询系统默认表(中文系统查询JDK编码表)
  13. 即:上文写入A
  14. */
  15. //一次写多个字节
  16. output.close();
  17. }
  18. }

  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. public class IOApi {
  6. public static void main(String[] args) throws IOException {
  7. //使用File生成写入数据目的地,相对路径(不使用File也可以)
  8. FileOutputStream output = new FileOutputStream(new File("b.txt"));
  9. output.write(49); //写入三个字节显示为1
  10. output.write(48); //写入三个字节显示为0
  11. output.write(48); //写入三个字节显示为0
  12. output.close();
  13. }
  14. }
  • 连续写入多个字节,优化上述内容

    1. 如果写的第一个字节是正整数(0-127),那么显示时会查询ASCII码表
    2. 如果写的第一个是负数,那么第一个字节会和第二个字节显示中文字

      符,查询的是系统默认码表(GBK)
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. public class IOApi {
  6. public static void main(String[] args) throws IOException {
  7. //使用File生成写入数据目的地,相对路径(不使用File也可以)
  8. FileOutputStream output = new FileOutputStream(new File("b.txt"));
  9. byte[] bytes ={49,48,48};
  10. output.write(bytes); //100
  11. byte[] bytes1 ={-56,78,48};
  12. output.write(bytes1); //100萅0
  13. //public void write(byte[],int off,int len) :把字节数组的一部分写入到文件中
  14. //从偏移量off开始输出到此输出流,从指定的字节数组写入len字节
  15. output.write(bytes,1,2); //100萅000
  16. //String,出现乱码,可能是上面字节与下面字符转换的字节配对
  17. //写在第一行没问题
  18. output.write("你好呀".getBytes()); //00萅000浣犲ソ鍛€
  19. output.close();
  20. }
  21. }
  • 数据的追加与换行
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. public class IOApi {
  6. public static void main(String[] args) throws IOException {
  7. //打开追加写开关,false创建新文件,覆盖源文件。
  8. FileOutputStream output = new FileOutputStream("b.txt",true);
  9. //String
  10. output.write("你好呀".getBytes());
  11. //Windows: \r\n
  12. //Linux:/n
  13. //Mac:/r
  14. output.write("\n好呀".getBytes());
  15. output.close();
  16. }
  17. }

字节输入流 -所有字节输入的超类


  • java.io.InputStream extends Object 所有子类的部分共性方法:

    1. abstract int read()

      从输入流中读取数据的下一个字节。

    2. int read(byte[] b)

      从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。

    3. int read(byte[] b, int off, int len)

      将输入流中最多 len 个数据字节读入 byte 数组。

    4. void close()

      关闭此输入流并释放与该流关联的所有系统资源。

java.io.FileInputStream extends InputStream


  • 作用:将硬盘里的文件读取到内存中

  • 构造方法:

    1. FileInputStream(File file)

      file:数据源
    2. FileInputStream(FileDescriptor fdObj)

      通过使用文件描述符 fdObj 创建一个 FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。
    3. FileInputStream(String name)

      name:文件路径
    • 构造方法的作用:

      1. 会创建一个FileInputSteam对象
      2. 会把FileInputStream对象指定的构造方法中要读取的文件
  • 读取数据原理: java程序 - JVM - OS - 调用OS读取数据的方法 - 读取文件

  • 字节输入流步骤

    1. 创建FileInputStream对象,构造方法中绑定要读取的数据源
    2. 使用FileInputStream的方法read,读取文件
    3. 释放资源
  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. public class IOApi {
  4. public static void main(String[] args) throws IOException {
  5. //相对路径获取数据源
  6. FileInputStream input = new FileInputStream("b.txt");
  7. //使用read方法读取,一次读取一个字节,会返回一个Int值
  8. System.out.println(input.read()); //239 你
  9. //读取的第二个值
  10. System.out.println(input.read()); //187 好
  11. //当input.read返回 -1 时代表读取结束,说明读取到了结束标记
  12. while(input.read() != -1){
  13. System.out.println(input.read());
  14. }
  15. //关闭输入数据流,释放资源
  16. input.close();
  17. }
  18. }
  • 字节输入流一次读入多个字节

int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区

数组 b 中。

byte[] b:起到缓冲作用,长度一般定义为1024(1kB)或者1024的整数倍

int:返回值是一个有效字节数

  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. import java.util.Arrays;
  4. public class IOApi {
  5. public static void main(String[] args) throws IOException {
  6. //相对路径获取数据源
  7. FileInputStream input = new FileInputStream("b.txt");
  8. //连续读,给定一个字节数组,中文字符如果设置的数组不足够长,会有乱码
  9. //byte[] inp = new byte[10];出现中文乱码,读取不完全
  10. //数组作用:起到缓冲作用
  11. byte[] inp = new byte[20];
  12. //read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中,字节数组 b 实际是一个不断重复覆盖的过程
  13. //input.read(inp)返回的是读取的有效字节的个数
  14. System.out.println(input.read(inp)); //19
  15. //使用数组工具类转换为码值
  16. //当数组长度为10时 [-17, -69, -65, -28, -67, -96, -27, -91, -67, -27]
  17. //当数组长度为20时 [-17, -69, -65, -28, -67, -96, -27, -91, -67, -27, -111, -128, 10, -27, -91, -67, -27, -111, -128, 0]
  18. System.out.println(Arrays.toString(inp));
  19. /*
  20. String类的构造方法转换
  21. String[byte[] bytes] : 把字节数组转换为字符串
  22. String(byte[] bytes,int offset,int length)把字符数组的一部分转换为字符串,
  23. offset:偏移位置,length:转换个数
  24. */
  25. //出现乱码,是因为给的byte[10]长度不够,换为byte[20]正常
  26. //长度为10 你好� ;长度为20 显示正常
  27. //主要是idea中用的UTF-8编码,一个中文需要读取三个字节
  28. System.out.println(new String(inp));
  29. /*********************************************
  30. 为什么要用偏移量0,因为如果数组过大,容易浪费空间
  31. 所以可以设置长度为input.read(inp)的返回值,也就是19,如下
  32. System.out.println(new String(inp,0,19));
  33. *********************************************/
  34. //关闭输入数据流,释放资源
  35. input.close();
  36. }
  37. }

文件复制


  • 原理:一读,一写,凡是字节流文件都可以复制
  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.util.Arrays;
  5. public class IOApi {
  6. public static void main(String[] args) throws IOException {
  7. //读,相对路径获取数据源
  8. FileInputStream input = new FileInputStream("b.txt");
  9. byte[] inp = new byte[1024];
  10. //len为读取的有效字节位数
  11. int len = input.read(inp);
  12. //写,相对路径给出文件写入抽象位置
  13. FileOutputStream output = new FileOutputStream("b_copy.txt");
  14. //给出写入数据,从0开始到有效位置结束
  15. output.write(inp,0,len);
  16. //优化代码
  17. FileInputStream inputJpg = new FileInputStream("C:\\Users\\Administrator\\Pictures\\1.jpg");
  18. FileOutputStream outputJpg = new FileOutputStream("C:\\Users\\Administrator\\Pictures\\1_copy.jpg");
  19. //注,中文结束位会报错,陷入死循环,可复制图片,图片大,用字节数组处理快
  20. byte[] bytes= new byte[1024*1024];
  21. int lenJpg = 0;
  22. while((lenJpg = inputJpg.read(bytes)) != -1){
  23. outputJpg.write(bytes,0,lenJpg);
  24. }
  25. //先释放写的,写完一定读完了
  26. outputJpg.close();
  27. inputJpg.close();
  28. }
  29. }

字节流读取中文文件


  • 一个中文:GBK编码占用两个字节 UTF-8:占用三个字节

IO流 - 字节输入输出流,文件的复制的更多相关文章

  1. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  2. java学习笔记IO之字节输入输出流

    IO字节输入输出流 OutputStream:字节输出流 该抽象类是所有字节输出流的超类: 定义了一些共性的成员方法: 1.写入一个字节 void write(int b);//b表示字节 2.写入字 ...

  3. Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Properties集合、打印流)

    1.IO简介 IO(输入输出)通过java.io包下的类和接口来支持,包下包括输入.输出两种IO流,每种输入输出流又可分为字符流和字节流两大类. 2.File类 File类是io包下与平台无关的文件和 ...

  4. Java Io 流(输入输出流)

    IO流,也就是输入和输出流,可分为字节流和字符流. 1. 字节流 (1). InputStream 输入流,用于读取文件 输入流常用API: inputStream.read()  读取一个字节 in ...

  5. IO流07_输入输出流总体系

    [javaIO体系中常用的流] [关于字符流和字节流的注意点] 通常,字节流比字符流功能更加强大,因为字节流可以处理所有的二进制文件. 但是字节流来处理字符,又需要将字节转换成字符,增加了编程复杂度. ...

  6. Java基础IO类之字节输入输出流

    一.IO流概述 1.IO流:输入输出流(Input/Output) 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象,即数据在设备间的传输流, 流的本质是数据传输,根据数据传输特性将 ...

  7. Java修炼——文件字节输入输出流复制和缓冲流复制

    一:文件字节输入输出流复制 首先明确数据源和目的文件,然后就是"中转站",最后就是关闭 package com.bjsxt.ioproject; import java.io.Fi ...

  8. Java IO详解(一)------字节输入输出流

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  9. Java IO详解(三)------字节输入输出流

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

随机推荐

  1. git使用WebHook实现自动构建

    说明 我们使用git进行版本管理常常会遇到这样的一个需求,希望git push的时候服务器上代码的代码也能自动更新,这次我使用了coding进行示范 一.编写git pull 更新脚本 auth_pu ...

  2. 查看centos中的用户和用户组和修改密码

    查看centos中的用户和用户组 1.用户列表文件: vim /etc/passwd/ 2.用户组列表文件: vim /etc/group 3.查看系统中有哪些用户: cut -d : -f /etc ...

  3. com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect

    com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: con ...

  4. java性能使用

    1.慎用异常 j写在for循环外面 2.使用局部变量 局部变量在栈(stack)里面,速度快;全局变量在堆(heap)里面 int a =0; public static int ta =0; 3.位 ...

  5. DES加解密工具类

    这两天在跟友商对接接口,在对外暴露接口的时候,因为友商不需要登录即可访问对于系统来说存在安全隐患,所以需要友商在调用接口的时候需要将数据加密,系统解密验证后才执行业务.所有的加密方式并不是万能的,只是 ...

  6. 读书分享全网学习资源大合集,推荐Python3标准库等五本书「02」

    0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.PYTHON开发利器之VS Code使 ...

  7. unity编辑器扩展_05(删除游戏对象并具有撤回功能)

    代码: [MenuItem("Tools/Delete",false,1)]    static void Delete()    {        GameObject[] go ...

  8. Javaweb之国际化

    Javaweb之国际化 一.前言 软件的本地化:一个软件在某个国家或地区使用时,采用该国家或地区的语言,数字,货币,日期等习惯. 软件的国际化:软件开发时,让它能支持多个国家和地区的本地化应用.使得应 ...

  9. Python 基础 2-3 列表的反转与排序

    引言 列表是按照特定格式排序而成的,有时候这种排序方式我们并不喜欢,我们希望它可以按照我们的方式来进行正序或者倒序排序,或其他的排序方式 反转与排序 比如说我这里有一组列表,里面存放的全部都是数值,但 ...

  10. ParquetDecodingException: Can not read value at 0 in block -1 in file hdfs:...

    : jdbc:hive2://master01.hadoop.dtmobile.cn:1> select * from cell_random_grid_tmp2 limit 1; INFO : ...