目录

Java IO

Java定义了两个超类(抽象类)

Java将流分为两类:节点流与处理流

文件流

文件输出流

文件输入流

文件的复制

块读写的文件复制操作

写文本数据

文件输出流 (追加模式)

读取文本数据


Java IO

  1. java io 可以让我们用标准的读写操作来完成对不同设备的读写数据工作
  2. java将IO按照方向划分为输入与输出,参照点是我们写的程序
  3. 输入:用来读取数据的,是从外界到程序的方向,用于获取数据
  4. 输出:用来写出数据的,是从程序到外界的方向,用于发送数据

java将IO比喻为“流”,即:stream,就想生活中的“电流”,“水流”一样,他是以同一个方向顺序移动的过程,只不过这里流动的是字节(2进制数据),所以在IO中有输入流和输出流之分,我们理解他们是连接程序与另一端的“管道”,用于获取或发送数据到另一端

Java定义了两个超类(抽象类)

  • java.io.InputStream:所有字节输入流的超类,其中定义了读取数据的方法,因此将来不管读取的是什么设备(连接该设备的流)都有这些读取的方法,因此我们可以用相同的方法读取不同设备中的数据
  • java.io.OutputStream:所有字节输出流的超类,其中定义了写出数据的方法

Java将流分为两类:节点流与处理流

  • 节点流:也称为低级流,节点流的另一端是明确的,是实际读写数据的流,读写一定是建立在节点流基础上进行的
  • 处理流:也称为高级流,处理流不能独立存在,必须连接在其他流上,目的是当数据流经当前流时对数据进行加工处理来简化我们对数据的操作

实际应用中,我们可以通过串联一组高级流到某个低级流上以流水线式的加工处理对某设备的数据进行读写,这个过程也成为流的连接,这也是IO的精髓所在

文件流

文件流是一对低级流,用于读写文件数据的流,用于连接程序与文件(硬盘)的“管道”,负责读写文件数据

文件输出流

import java.io.FileOutputStream;
import java.io.IOException;public class FOSDemo {public static void main(String[] args) throws IOException {//向当前目录下的fos.dat文件中写入数据/*FileOutputStream提供的常用构造器FileOutputStream(String path)FileOutputStream(File file)*///文件流创建时,如果该文件不存在会自动将其创建(前提是该文件所在目录必须存在)FileOutputStream fos = new FileOutputStream("fos.dat");/*** void write(int d)* 向文件中写入1个字节,写入的内容是给定的int值对应的2进制的“低八位”* int值 1:*                                  vvvvvvvv* 二进制:00000000 00000000 00000000 00000001* demo.txt文件内容:* 00000001* */fos.write(1);/*** int值 2:*                                  vvvvvvvv* 二进制:00000000 00000000 00000000 00000010* demo.txt文件内容:* 00000001 00000010* */fos.write(2);fos.close();//关闭输出流System.out.println("执行完了");}
}

文件输入流

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class FISDemo {public static void main(String[] args) throws IOException {/*** fos.dat文件内容:* 00000001 00000010* */FileInputStream fis = new FileInputStream("fos.dat");/*** int read()* 读取一个字节,并以int型返回,返回的整数中读取的字节部分在该整数2进制的最后* 8位上* 如果返回值为整数-1,则表示流读取到了末尾,对于读取文件而言就是EOF(end of file文件末尾)** 第一次调用read():*             int d = fis.read();*             fos.dat文件内容*             00000001 00000011*             ^^^^^^^^*             读取该字节**             返回int值时,2进制样子:*             00000000 00000000 00000000 00000001*                                        ^^^^^^^^*             |-----补充24个0(3字节)-----| 读取的字节**             返回的int值d就是上述内容* */int d = fis.read();System.out.println(d);/*第二次调用read()d = fis.read();fos.dat文件内容00000001 00000011^^^^^^^^读取该字节返回int值时,2进制样子:00000000 00000000 00000000 00000011^^^^^^^^|-----补充24个0(3字节)-----| 读取的字节返回的int值d就是上述内容*/d = fis.read();System.out.println(d);/*第三次调用read()d = fis.read();fos.dat文件内容00000001 00000011^^^^^^^^文件末尾了返回int值时,2进制样子:11111111 11111111 11111111 11111111^^^^^^^^|-----补充32个1(4字节,来表示-1)-----|返回的int值d就是上述内容*/d = fis.read();System.out.println(d);fis.close();}
}

文件的复制

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class CopyDemo {public static void main(String[] args) throws IOException {//创建文件输入流读取原文件FileInputStream fis = new FileInputStream("image.jpg");//创建文件输出流写入复制文件FileOutputStream fos = new FileOutputStream("image_cp.jpg");int d;//保存每次读取到的字节/*原文件数据:11000011 10101010 00001111 11001100 00110011 ...^^^^^^^^d = fis.read();d:00000000 00000000 00000000 10101010fos.write(d);复制文件的数据:11000011 10101010*/long start = System.currentTimeMillis();//获取当前系统时间的毫秒值(UTC时间)while((d = fis.read()) != -1) {fos.write(d);}long end = System.currentTimeMillis();//获取当前系统时间的毫秒值(UTC时间)System.out.println("复制完毕!耗时:"+(end-start)+"ms");fis.close();fos.close();}
}

块读写的文件复制操作

int read(byte[] data)

  • 一次性从文件中读取给定的字节数组总长度的字节量,并存入到该数组中
  • 返回值为实际读取到的字节量,若返回值为-1,则表示读取到了文件末尾

块写操作 void write(byte[] data)

  • 一次性将给定的字节数组所有字节写入到文件中

void write(byte[] data, int offset, int len)

  • 一次性将给定的字节数组从下标offset处开始的连续len个字节写入文件
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*** 通过提高每次读写的数据量,减少实际读写的次数,可以提高读写效率。* 单字节读写是一种随机读写形式。而一组一组字节的读写是块读写形式。*/
public class CopyDemo2 {public static void main(String[] args) throws IOException {//使用块读写形式完成文件复制//创建文件输入流读取原文件FileInputStream fis = new FileInputStream("wnwb.exe");//创建文件输出流写复制文件FileOutputStream fos = new FileOutputStream("wnwb_cp.exe");/*流提供了块读写的方法int read(byte[] data)一次性从文件中读取给定的字节数组总长度的字节量,并存入到该数组中。返回值为实际读取到的字节量。若返回值为-1则表示读取到了文件末尾。文件数据11001100 11110000 10101010 00001111 00110011^^^^^^^^ ^^^^^^^^ ^^^^^^^^int d;byte[] data = new byte[3];[00000000 00000000 00000000]第一次调用d = fis.read(data);[11001100 11110000 10101010]d = 3 本次读取到了3个字节文件数据11001100 11110000 10101010 00001111 00110011^^^^^^^^ ^^^^^^^^第二次调用d = fis.read(data);//仅读取了最后两个字节[00001111 00110011 10101010]//前两个字节为本次读取的内容^^^^^^^^ ^^^^^^^^d = 2 本次读取到了2个字节文件数据11001100 11110000 10101010 00001111 00110011 文件末尾!^^^^^^^^第三次调用d = fis.read(data);//一个字节都没有读取到[00001111 00110011 10101010]数组没变化d = -1 文件末尾块写操作void write(byte[] data)一次性将给定的字节数组所有字节写入到文件中void write(byte[] data,int offset,int len)一次性将给定的字节数组从下标offset处开始的连续len个字节写入文件*/int len;//记录每次实际读取的字节量/*00000000  1byte   8位2进制称为1字节1024byte  1kb1024kb    1mb1024mb    1gb*/byte[] data = new byte[1024*10];//10kblong start = System.currentTimeMillis();while((len = fis.read(data))!=-1){fos.write(data,0,len);//读取多少就写多少}long end = System.currentTimeMillis();System.out.println("复制完毕!耗时:"+(end-start)+"ms");fis.close();fos.close();}
}

写文本数据

String提供方法:

byte[] getBytes(String charsetName) :将当前字符串转换为一组字节

参数为字符集的名字,常用的是UTF-8,其中文文字3字节表示1个,英文1字节表示1个

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;/*** 向文件中写入文本数据*/
public class WriteStringDemo {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("demo.txt");String str = "super idol的笑容都没你的甜,";/*支持中文的常见字符集有:GBK:国标编码。英文每个字符占1个字节,中文每个字符占2个字节UTF-8:内部是unicode编码,在这个基础上不同了少部分2进制信息作为长度描述英文每个字符占1字节中文每个字符占3字节String提供了将字符串转换为一组字节的方法byte[] getBytes(String charsetName)参数为字符集的名字,名字不区分大小写,但是拼写错误会引发异常:UnsupportedEncodingException不支持      字符集   异常*/byte[] data = str.getBytes("UTF-8");fos.write(data);fos.write("八月正午的阳光,都没你耀眼。".getBytes("UTF-8"));System.out.println("写出完毕!");fos.close();}
}

文件输出流 (追加模式)

重载的构造方法可以将文件输出流创建为追加模式

  • FileOutputStream(String path, boolean append)
  • FileOutputStream(File file, boolean append)

当第二个参数传入true时,文件流为追加模式,即:指定的文件若存在,则原有数据保留,新写入的数据会被顺序的追加到文件中

import java.io.FileOutputStream;
import java.io.IOException;/*** 文件流的追加写模式*/
public class FileAppendDemo {public static void main(String[] args) throws IOException {/*FileOutputStream默认创建方式为覆盖模式,即:如果连接的文件存在,则会将该文件原有数据全部删除。然后将通过当前流写出的内容保存到文件中。重载的构造方法允许我们再传入一个boolean型参数,如果这个值为true,则文件流为追加模式,即:若连接文件时该文件存在,原有数据全部保留,通过当前流写出的数据会顺序的追加到文件中。*/FileOutputStream fos = new FileOutputStream("demo.txt",true);fos.write("热爱105°的你,".getBytes("UTF-8"));fos.write("滴滴清纯的蒸馏水。".getBytes("UTF-8"));System.out.println("写出完毕!");fos.close();}
}

读取文本数据

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;/*** 从文件中读取文本数据*/
public class ReadStringDemo {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("fos.txt");byte[] data = new byte[1024];int len = fis.read(data);//块读操作System.out.println("实际读取到了"+len+"个字节");/*String提供了将字节数组转换为字符串的构造方法:String(byte[]data,String charsetName)将给定的字节数组中所有字节按照指定的字符集转换为字符串String(byte[]data,int offset,int len,String charsetName)将给定的字节数组从下标offset处开始的连续len个字节按照指定的字符集转换为字符串*/String line = new String(data,0,len,"UTF-8");System.out.println(line);System.out.println(line.length());fis.close();}
}

Java IO(文件流)相关推荐

  1. java io文件流序列化_Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类...

    一.properties集合 集合对象Properties类,继承Hashtable,实现Map接口,可以和IO对象结合使用,实现数据的持久存储. 特点: Hashtable的子类,map集合中的方法 ...

  2. Java.IO 字符流读写文件

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达! 一.序 上一篇我们谈了 java.IO 文件字节流读写操作(能懂系列Java.io文件字节流读写)大家应该都很熟悉了.但是中文和英文在字符 ...

  3. Java之文件流操作的文件读写

    Java之文件流操作的文件读写 本人非常喜欢Java的代码风格,今天记录一下文件字符串的读写,但是Java对于 制作exe文件非常不友好,而本人业务的要求,基本上都是制作exe文件,或者程序,Java ...

  4. Java File文件流读取文件夹内的文件并替换文件内容

    Java File文件流读取文件夹内的文件并替换文件内容 一.前言 二.代码 三.运行结果 一.前言 批量读取文件夹内的文件,并替换各个文件的内容 二.代码 新建一个普通 Java 项目就可以,创建文 ...

  5. Java IO: 字符流的Buffered和Filter

    作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍缓冲与过滤相关的reader和writer,主要涉及BufferedReader.B ...

  6. java io文件操作_java IO 文件操作方法总结

    java IO 文件操作方法总结 对于输入输出的理解: 输入输出,以程序为参考点,外部数据进入程序,通过输入流完成.程序将数据给外部设备,通过输出流完成. 文件Io的操作 //获取文件 File fi ...

  7. Java IO: 文件

    转载自  Java IO: 文件 译文链接  作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 在Java应用程序中,文件是一种常用的数据源或者存储数 ...

  8. Java IO: 字符流的Piped和CharArray

    转载自   Java IO: 字符流的Piped和CharArray 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍管道与字符数组相 ...

  9. react接收后端文件_React获取Java后台文件流并下载Excel文件流程解析

    记录使用blob对象接收java后台文件流并下载为xlsx格式的详细过程,关键部分代码如下. 首先在java后台中设置response中的参数: public void exportExcel(Htt ...

  10. java文件流下载excel_React获取Java后台文件流下载Excel文件

    记录使用blob对象接收java后台文件流并下载为xlsx格式的详细过程,关键部分代码如下. 首先在java后台中设置response中的参数: public void exportExcel(Htt ...

最新文章

  1. 如何在三个月学习三年的生活经验
  2. Drupal 7.31 SQL注射分析POC
  3. Spark机器学习库(MLlib)指南
  4. joomla 3.4.5 php版本,Joomla3.4.6漏洞最强总结
  5. An easy problem(hdu2055)
  6. Java最大公共子串(动态规划)
  7. mariab修改mysql端口_修改mysql/MariaDB数据库的端口号+远程
  8. 04-02 接口协议分析工具
  9. 微信语音麦克风静音_智能语音专题(二):语音信号处理
  10. 弹出浮动页面html怎么写,C# 浮动窗体实现(自定义弹出窗口)
  11. c代码格式化_Python 只用一行代码,可以实现哪些事儿?
  12. JavaScript自调用匿名函数
  13. 一次 HashSet 所引起的并发问题 1
  14. 教务系统自动评教_「四川大学教务处本科登陆系统」四川大学本科教务系统 - 一键评教 - seo实验室...
  15. iOS语音转文字实现
  16. excel条件格式标记一整行
  17. 手机里微信更换了头像电脑没同步
  18. Bootstrap项目之微金所
  19. 电商产品展示,选360°全景还是3D展示?
  20. 怎么在RHEL7上禁用transparent hugepages (THP)

热门文章

  1. cmos逻辑门传输延迟时间_半导体学习日记-CMOS器件面临的挑战
  2. 全国计算机等级考试怎么卸载,教你三种方法卸载Windows7SP1Beta
  3. wincc做皮带动画_WinCC里怎样做动画呢
  4. 扫描仪显示没有服务器,扫描仪安装好了,点击显示寻找扫描仪怎么显示未找出扫描仪...
  5. 扫描文件怎么设置到服务器,如何为扫描仪添加局域网功能
  6. 这个小众副业,一次200,有人月入3万!
  7. 使用 String[] values = request.getParameterValues(key);出现的问题 ,Ajax Post 提交数组参数后台无法接收
  8. 数学分析教程(科大)——1.9笔记+习题
  9. 基于单片机的十字路口交通灯设计(带左转带紧急按钮带调时间)
  10. C++ 7:深拷贝和浅拷贝,,值类型,构造函数和拷贝构造函数,函数重载,移动构造函数和移动赋值函数