较深入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("释放资源失败");

}

}

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容