较深入I/O

字节输出流OutputStream

  • IO流用来处理设备之间的数据传输

  • Java对数据的操作是通过流的方式

  • Java用于操作流的类都在IO包中

  • 流按流向分为两种:输入流,输出流。

  • 流按操作类型分为两种:

  • 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的

  • 字符流 : 字符流只能操作纯字符数据,比较方便。

.IO流常用父类

* 字节流的抽象父类:

    * InputStream

    * OutputStream
  • 字符流的抽象父类:

      * Reader
    
      * Writer
    
  • IO程序书写

      * 使用前,导入IO包中的类
    
      * 使用时,进行IO异常处理
    
      * 使用后,释放资源
    

void close(): 关闭此输出流并释放与此流有关的所有系统资源。

void write(byte[] b): 将 b.length 个字节从指定的 byte 数组写入此输出流\

void write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

abstract void write(int b) : 将指定的字节写入此输出流。

字节输出流FileOutputStream写字节

FileOutputStream构造方法

  • 作用:绑定输出的输出目的

  • FileOutputStream(File file)

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

  • FileOutputStream(File file, boolean append)

  • 创建一个向指定 File 对象表示的文件中写入数据的文件输出流,以追加的方式写入。

  • FileOutputStream(String name)

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

  • FileOutputStream(String name, boolean append)

  • 创建一个向具有指定 name 的文件中写入数据的输出文件流,以追加的方式写入。

  • : 流对象使用步骤

  • 1. 创建流子类的对象,绑定数据目的

  • 2. 调用流对象的方法write写

  • 3. close释放资源

  • : 注意事项

  • 流对象的构造方法,可以创建文件,如果文件存在,直接覆盖


/*

*  FileOutputStream

*  写入数据文件,学习父类方法,使用子类对象

* 

*  子类中的构造方法: 作用:绑定输出的输出目的

*    参数:

*      File    封装文件

*      String  字符串的文件名

* 

*  流对象使用步骤

*    1\. 创建流子类的对象,绑定数据目的

*    2\. 调用流对象的方法write写

*    3\. close释放资源

*   

*    流对象的构造方法,可以创建文件,如果文件存在,直接覆盖

*/

public class FileOutputStreamDemo {

public static void main(String[] args)throws IOException {

FileOutputStream fos = new FileOutputStream("c:\\a.txt");

//流对象的方法write写数据

//写1个字节

fos.write(97);

//关闭资源

fos.close();

}

}

字节输出流FileOutputStream写字节数组

  • void write(byte[] b): 将 b.length 个字节从指定的 byte 数组写入此输出流

  • void write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字


/*

*  FileOutputStream

*  写入数据文件,学习父类方法,使用子类对象

* 

*  子类中的构造方法: 作用:绑定输出的输出目的

*    参数:

*      File    封装文件

*      String  字符串的文件名

* 

*  流对象使用步骤

*    1\. 创建流子类的对象,绑定数据目的

*    2\. 调用流对象的方法write写

*    3\. close释放资源

*   

*    流对象的构造方法,可以创建文件,如果文件存在,直接覆盖

*/

public class FileOutputStreamDemo {

public static void main(String[] args)throws IOException {

FileOutputStream fos = new FileOutputStream("c:\\a.txt");

//流对象的方法write写数据

//写字节数组

byte[] bytes = {65,66,67,68};

fos.write(bytes);

//写字节数组的一部分,开始索引,写几个

fos.write(bytes, 1, 2);

//写入字节数组的简便方式

//写字符串

fos.write("hello".getBytes());

//关闭资源

fos.close();

}

}

文件的续写和换行符号

文件的续写

  • FileOutputStream构造方法, 的第二个参数中,加入true

换行符号

  • 在文件中,写入换行,符号换行 \r\n

  • \r\n 可以写在上一行的末尾, 也可以写在下一行的开头


/*

*  FileOutputStream 文件的续写和换行问题

*  续写: FileOutputStream构造方法, 的第二个参数中,加入true

*  在文件中,写入换行,符号换行  \r\n

*  \r\n 可以写在上一行的末尾, 也可以写在下一行的开头

*/

public class FileOutputStreamDemo1 {

public static void main(String[] args)throws IOException {

File file = new File("c:\\b.txt");

FileOutputStream fos = new FileOutputStream(file,true);

fos.write("hello\r\n".getBytes());

fos.write("world".getBytes());

fos.close();

}

}

字节输入流InputStream

  • abstract int read() :

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

  • int read(byte[] b)

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

  • int read(byte[] b, int off, int len)

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

  • void close()

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

字节输入流FileInputStream读取字节

  • a: 方法介绍

  • abstract int read() :

  • 从输入流中读取数据的下一个字节,返回-1表示文件结束

  • int read(byte[] b)

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

  • 读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。

  • int read(byte[] b, int off, int len)

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

  • void close()

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


/*

*  FileInputStream读取文件

* 

*  构造方法: 为这个流对象绑定数据源

* 

*    参数:

*      File 类型对象

*      String 对象

*  输入流读取文件的步骤

*    1\. 创建字节输入流的子类对象

*    2\. 调用读取方法read读取

*    3\. 关闭资源

*   

*    read()方法,

*      read()执行一次,就会自动读取下一个字节

*      返回值,返回的是读取到的字节, 读取到结尾返回-1

*/

public class FileInputStreamDemo {

public static void main(String[] args) throws IOException{

FileInputStream fis = new FileInputStream("c:\\a.txt");

//读取一个字节,调用方法read 返回int

//使用循环方式,读取文件,  循环结束的条件  read()方法返回-1

int len = 0;//接受read方法的返回值

while( (len = fis.read()) != -1){

System.out.print((char)len);

}

//关闭资源

fis.close();

}

}

/*

* int i = fis.read();

System.out.println(i);

i = fis.read();

System.out.println(i);

i = fis.read();

System.out.println(i);

i = fis.read();

System.out.println(i);

*/

字节输入流FileInputStream读取字节数组

  • int read(byte[] b)

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

  • 读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。

  • int read(byte[] b, int off, int len)

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


/*

*  FileInputStream读取文件

*  读取方法  int read(byte[] b) 读取字节数组

*  数组作用: 缓冲的作用, 提高效率

*  read返回的int,表示什么含义 读取到多少个有效的字节数

*/

public class FileInputStreamDemo1 {

public static void main(String[] args) throws IOException {

FileInputStream fis = new FileInputStream("c:\\a.txt");

// 创建字节数组

byte[] b = new byte[2];

int len = fis.read(b);

System.out.println(new String(b));// ab

System.out.println(len);// 2

len = fis.read(b);

System.out.println(new String(b));// cd

System.out.println(len);// 2

len = fis.read(b);

System.out.println(new String(b));// ed

System.out.println(len);// 1

len = fis.read(b);

System.out.println(new String(b));// ed

System.out.println(len);// -1

fis.close();

}

}

字节输入流FileInputStream读取字节数组的实现原理

image

public class FileInputStreamDemo1 {

public static void main(String[] args) throws IOException {

FileInputStream fis = new FileInputStream("c:\\a.txt");

//创建字节数组

byte[] b = new byte[1024];

int len = 0 ;

while( (len = fis.read(b)) !=-1){

System.out.print(new String(b,0,len));

}

fis.close();

}

}

文件复制原理

image

/*

*  将数据源 c:\\a.txt

*  复制到 d:\\a.txt  数据目的

*  字节输入流,绑定数据源

*  字节输出流,绑定数据目的

* 

*  输入,读取1个字节

*  输出,写1个字节

*/

public class Copy {

public static void main(String[] args) {

//定义两个流的对象变量

FileInputStream fis = null;

FileOutputStream fos = null;

try{

//建立两个流的对象,绑定数据源和数据目的

fis = new FileInputStream("c:\\t.zip");

fos = new FileOutputStream("d:\\t.zip");

//字节输入流,读取1个字节,输出流写1个字节

int len = 0 ;

while((len = fis.read())!=-1){

fos.write(len);

}

}catch(IOException ex){

System.out.println(ex);

throw new RuntimeException("文件复制失败");

}finally{

try{

if(fos!=null)

fos.close();

}catch(IOException ex){

throw new RuntimeException("释放资源失败");

}finally{

try{

if(fis!=null)

fis.close();

}catch(IOException ex){

throw new RuntimeException("释放资源失败");

}

}

}

}

}

字节流复制文件读取字节数组


/*

*  字节流复制文件

*  采用数组缓冲提高效率

*  字节数组

*  FileInputStream 读取字节数组

*  FileOutputStream 写字节数组

*/

public class Copy_1 {

public static void main(String[] args) {

long s = System.currentTimeMillis();

FileInputStream fis = null;

FileOutputStream fos = null;

try{

fis = new FileInputStream("c:\\t.zip");

fos = new FileOutputStream("d:\\t.zip");

//定义字节数组,缓冲

byte[] bytes = new byte[1024*10];

//读取数组,写入数组

int len = 0 ;

while((len = fis.read(bytes))!=-1){

fos.write(bytes, 0, len);

}

}catch(IOException ex){

System.out.println(ex);

throw new RuntimeException("文件复制失败");

}finally{

try{

if(fos!=null)

fos.close();

}catch(IOException ex){

throw new RuntimeException("释放资源失败");

}finally{

try{

if(fis!=null)

fis.close();

}catch(IOException ex){

throw new RuntimeException("释放资源失败");

}

}

}

long e = System.currentTimeMillis();

System.out.println(e-s);

}

}

字符输出流写文本FileWriter类

  • void write(int c)

  • 写入单个字符

  • void write(String str)

  • 写入字符串

  • void write(String str, int off, int len)

  • 写入字符串的某一部分

  • void write(char[] cbuf)

  • 写入字符数组

  • abstract void write(char[] cbuf, int off, int len)

  • 写入字符数组的某一部分


/*

*  字符输出流

*    java.io.Writer 所有字符输出流的超类

*  写文件,写文本文件

* 

*  写的方法 write

*    write(int c) 写1个字符

*    write(char[] c)写字符数组

*    write(char[] c,int,int)字符数组一部分,开始索引,写几个

*    write(String s) 写入字符串

*   

*  Writer类的子类对象 FileWriter

* 

*  构造方法:  写入的数据目的

*    File 类型对象

*    String 文件名

*   

*  字符输出流写数据的时候,必须要运行一个功能,刷新功能

*  flush()

*/

public class WriterDemo {

public static void main(String[] args) throws IOException{

FileWriter fw = new FileWriter("c:\\1.txt");

//写1个字符

fw.write(100);

fw.flush();

//写1个字符数组

char[] c = {'a','b','c','d','e'};

fw.write(c);

fw.flush();

//写字符数组一部分

fw.write(c, 2, 2);

fw.flush();

//写如字符串

fw.write("hello");

fw.flush();

fw.close();

}

}

字符输入流读取文本FileReader类

/*

*  字符输入流读取文本文件,所有字符输入流的超类

*    java.io.Reader

*  专门读取文本文件

* 

*  读取的方法 : read()

*  int read() 读取1个字符

*  int read(char[] c) 读取字符数组

* 

*  Reader类是抽象类,找到子类对象 FileReader

* 

*  构造方法: 绑定数据源

*    参数:

*        File  类型对象

*        String文件名

*/

public class ReaderDemo {

public static void main(String[] args) throws IOException{

FileReader fr = new FileReader("c:\\1.txt");

/*int len = 0 ;

while((len = fr.read())!=-1){

System.out.print((char)len);

}*/

char[] ch = new char[1024];

int len = 0 ;

while((len = fr.read(ch))!=-1){

System.out.print(new String(ch,0,len));

}

fr.close();

}

}

字符流复制文本文件


/*

*  字符流复制文本文件,必须文本文件

*  字符流查询本机默认的编码表,简体中文GBK

*  FileReader读取数据源

*  FileWriter写入到数据目的

*/

public class Copy_2 {

public static void main(String[] args) {

FileReader fr = null;

FileWriter fw = null;

try{

fr = new FileReader("c:\\1.txt");

fw = new FileWriter("d:\\1.txt");

char[] cbuf = new char[1024];

int len = 0 ;

while(( len = fr.read(cbuf))!=-1){

fw.write(cbuf, 0, len);

fw.flush();

}

}catch(IOException ex){

System.out.println(ex);

throw new RuntimeException("复制失败");

}finally{

try{

if(fw!=null)

fw.close();

}catch(IOException ex){

throw new RuntimeException("释放资源失败");

}finally{

try{

if(fr!=null)

fr.close();

}catch(IOException ex){

throw new RuntimeException("释放资源失败");

}

}

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 7,055评论 0 4
  • 五、IO流 1、IO流概述 (1)用来处理设备(硬盘,控制台,内存)间的数据。(2)java中对数据的操作都是通过...
    佘大将军阅读 3,499评论 0 0
  • 前提 参考资料: 《Java I/O》 -- 这本书没有翻译版,需要自己啃一下。 《Java I/O》这本书主要介...
    zhrowable阅读 4,940评论 0 1
  • I/O的学习之字节流 今天的主要内容 File类的使用File类概述和构造方法File类的创建功能File类的重命...
    须臾之北阅读 3,142评论 0 0
  • IO简单概述 IO解决问题 : 解决设备与设备之间的数据传输问题(硬盘 -> 内存 内存 -> 硬盘) 读和写文...
    奋斗的老王阅读 8,750评论 0 53