java的IO操作

        之所以写这个是因为Hadoop的IO与·这个类似 但要比这个深入,而且都还涉及到网络传输原理的五个层次。所以,一步一个脚印。


已知: Java程序是通过“流”的形式进行数据的输入和输出的,输入和输出是指应用程序与外部设备及其他计算机进行数据交流的操作。

流的概念

    流是一个抽象的概念,如同电流,可以看做是水流,可以理解是一个输入输出途径。在Java体系中IO是非常庞大的。

有这些流操作:

1.标准的输入输出流。

2.文件的操作。

3.网路数据流操作。

4.字符串流

5.对象流操作。




流定义:

流是指一台计算机或网路中不同的计算机之间有序运动的数据序列。Java把这些不同来源和目标的数据都统一抽象为数据流。

流序列中可以使原始数据【二进制文件】,也可以是经过编码符合某种规定的数据,Java流分两种。一种是字节流,一种是字符流

分别由4个抽象类来表示

【字节流】 InputStream OutStream


[字符流] Reader Writer



输入流和输出流


流可以分为2类,输入流和输出流,用户可以从输入流中读取信息,但不能写它,相反,对于输出流只能往其中写,而不能读它。说人话就是输入流支持写不支持读,输出流支持读不支持写。


输入流:

既然是输入流就会有信息源的,信息源可以位于文件,内存或网络套接字等地方【scoket】,信息源类型可包括对象,字符,图像,声音在内的任何类型,一旦打开输入流后,程序就可以从输入流串行的读取数据。

输出流:

输出流和输入流相似, 程序也能够通过打开一个输出流并顺序地写入数据来将信息送至目的地。

字节流和字符流:

Java包括两种流 字节流和字符流。

字节流:字节流是通过I/O设备以字节数据的方式读入。而字符流则是通过字节流读入数据转换成字符‘流’的形式由用户驱使。

字节流:

 对于字节流来说,InputStream 是所有字节输入流的父类。 outputstream是所有字节输出流的父类

在Java的I/O流中,所有对字节流处理的类,都是继承inputstream和outputstream,这两个抽象类。

inputstream类。

该类是一个抽象类,作为字节输入流的直接或间接父类,它定义了许多有用的,所有子类必须的方法。

inputstream 常用的方法有以下几种。

public abstractintread() :------读取一个byte的数据,返回值是高位补0的int 类型

public int read(byte b[]):------- 读取b.length 字节的数据放到b数组中,返回值是读取的字节数,该方法实际是调用下一个方法的实现。

public int read (byte  b[],int off,int len)----从输入流中最多读取len个字节的数据,存放到偏移量为off的b的数组中

public int avaiable():   返回输入流中可以读取的字节数;

注意。如输入阻塞,当前线程将被挂起,如果inputstream 对象电泳这个方法的话,它只会返回0,这个方法必须由inputstream 类的子类对象调用才有用。

public long ship(long n) : 忽略输入流中的n个字节,返回值是实际忽略的字节数,跳过一些字段来读取,

public int close():    在使用完后,必须对打开的流进行关闭。

outputstream类:常用方法

public void write(byte b[])将参数b中的字节写入到输入流中。

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

pubic abstract void write (int b ):先将int 转换为byte类形。把低字节写入到输出流中。

public void flush(); 将数据缓冲区中的数据全部输出,并清空缓冲区。

public void close ();   关闭输出流并释放与流相关的系统资源。


FileInputStream 类:


FileInputStrem 和OutputStream 类中第一个类的源端和第二个类的目的端都是此盘文件,他们的构造方法允许通过磁盘文件的路径名来构造相应的流

FileInputStream infile=new FileinputStream("myfile.data");

OutputStream outfile=new OutputStream("results.data")

构造Fileinputstream 对象时,对应的文件必须存在并且是可读的,而构造后者对象时,如输出文件已存在,则必须是可覆盖的。

如果用户的文件读取需求比较简单,那么用户可以使用FileinputStream类,该类是从InputStream 中派生出来的简单输入类,该类的方法都是从InputStream中继承的代码如下:


package fileinputstream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

public class Demo {

public static void main(String[] args) {

try {

FileInputStream in = new FileInputStream("/asd.txt");

int n = 512; // 设定读取的字节数

byte[] buffer = new byte[n]; // 读取输入流

// 读取n 个字节,放置到以下标0开始字节数组buffer中,返回为实际读取的字节的数量

while ((in.read(buffer, 0, n) != -1) && (n > 0)) {

System.out.print(new String(buffer));

}

System.out.println();

in.close();

} catch (FileNotFoundException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

} catch (IOException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

}

这是fileinputstream 中的read(buffer)方法,每次从文件中读取512B存储在缓存区buffer上。再将以buffer中的值构造的字符串newString(buffer)显示到屏幕上,使文件输入流构造器建立通往文件的输入流时,可能出现错误,这是应该进行异常处理。

FileoutStream 类

两个构造器 FileOutputStream(String name)

FileOutputStream(File file)

第一个构造器使用给定的文件名name 创建一个FileOutputStream对象。第二个构造器使用File 对象创建FileOutputStream 对象。 该类是可以使用write 方法把字节发送给输出流 ,使用文件顺出流写入文件。


package fileinputstream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

public class Demo1 {

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

try {

System.out.print("输入保存的内容");

int count ,n=512;

byte [] buffer =new byte[n];        // 定义存放读入信息的字节数组

count=System.in.read(buffer); // 读取标准输入流

FileOutputStream out=new FileOutputStream("asd.txt");      // 创建文件输出对象

out.write(buffer,n,count);  //这是开始写入,把字节数组buffer中从下标0开化寺,长度为count的字节写入流中

out.close();

System.out.print("文件已保存");

} catch (FileNotFoundException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

}

BuffererInputStream 类和BufferedOutputStream 类

前者主要是提供在流的输入过程中提供了缓存的功能,它是和其他类一起搭配使用的,两者类一样,不同的是,前者读数据,后者写数据。

字符流

   Reader 类和Writer 类

  


FileReader 类

该类是用于读取文件,每次读取文件中第一个未读去过的字符,然后以ASCII码或者utf-8 码的形式输入到程序中

语法格式:  FileReader fr=new FileReader(filename);

其中,文件名必须是文件的完整路径和文件名,如果程序和该文件保存在同一目录下,则可以只用文件名而不需要其路径,该类中的read()方法用来读取字符并返回一个相应的int 类型数据。



package fileinputstream;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

public class Demo2 {

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

try {

FileReader fr = new FileReader("love.txt");

int c = fr.read();

while (c != -1) {

System.out.println((char) c);

c = fr.read();

}

fr.close();

} catch (FileNotFoundException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

}



这段代码中,构建了一个文件阅读器FileReader 的对象实例fr。通过while循环语句调用其read()方法依次读取一个字符。并判断是否到了文件的结束处。

FileWrite 类

该类是用于将数据写入到文件,语法格式如下:

FileWrite fr= new FileWrite(filename);

其中,文件名必须是文件的完整路径名和文件名,如果该程序和该文件保存在同一目录下,则可以只用文件名而不需要其路径名,如果该文件存在,则系统会自动创建该文件,FileWrite类中的write()方法,可以将字符或者字符串写入到文件中去,当数据写入操作完后,使用close方法,关闭文件。



package fileinputstream;

import java.io.FileWriter;

import java.io.IOException;

public class Demo3 {

public static void main(String[] args) {

try {

FileWriter fw = new FileWriter("完整路径名+文件名");

fw.write("my");

fw.write("dream");

fw.write("will");

fw.write("come");

fw.write("true");

fw.write("one");

fw.write("day");

fw.close();

} catch (IOException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}

}


File 代表一个文件或者文件夹

File(String pathname)

File(String parent,String child)

File(File file,String child)

createNewFile 创建文件

mkdirs 生成多层文件夹

mkdir  生成一层文件夹

delete 删除一个文件或文件夹

deleteOnExite 删除文件或文件夹在程序退出时

isDirectory 判断file是否代表一个文件夹

isFile  判断file是否代表一个文件

getPath  获得文件路径

getAbsoultePath 获得绝对路径

getCanonicalPath 获得规格化以后的路径

listFiles 返回当前文件夹下的所有文件

Io:

方向: 输出/输入

单位: 字节流(可以传输一切数据)/字符流(主要文本文档)

功能: 节点流/过滤流

InputStream/OutputStream 所有节点流的父类

FileInputStream/FileOutputStream 实现类

FileInputStream(String pathname);

FileInputStream(File file)

read() 返回读到的字节  直到读到末尾返回-1

close() 关闭流,释放流资源

raad(byte[]) 读入一个数组长度的数据

read(byte[],start,len) 从起始下标读入len长度字节到byte数组

FileOutputStream

FileOutputStream(File file,boolean append) true代表追加

FileOutputStream(String pathname,boolean append); false代表不追加

异常的处理:

1.创建io对象时

2.进行读入操作时

3.关闭资源时  放在finally代码块中

过滤流:

1.DataInputStream/DataOutputStream 读写八种基本类型

1.创建节点流对象

2.包装过滤流

3.读写操作

4.关闭流资源

2.BufferedInputStream/BufferOutputStream  缓冲流

1.关闭流操作  缓冲区数据写出

2.缓冲区满的时候 缓冲区数据写出

3.调用flush  清空缓冲区

3.ObjectInputStream/ObjectOutputStream  读写对象

NotSerizableException  未序列化对象错误

Serializable  序列化对象

transient  不序列化






以下是借鉴的





Java的IO类操作主要包括如下几类

1、File类的使用。

2、字节操作流:OutputStream、InputStream

3、字符操作流:Reader、Writer

4、对象序列化:serializable

从定义看,File类是Object的直接子类,同时它继承了Comparable接口可以进行数组的排序。

File类的操作包括文件的创建、删除、重命名、得到路径、创建时间等,以下是文件操作常用的函数。

File类的操作:

(1)创建文件,注意File.separator可以解决跨操作系统的问题。

下面的例子是一创建一个文件,如果该文件存在则删除,否则创建该文件。


(2)文件的类型函数

file.isFile(); //判断是不是文件

file.isDirectory();//判断是不是目录

(3)列出目录的内容

pulbic String[] list();//列出所有文件名和目录名

public File[] listFiles();//列出所有文件和目录

(2)字节操作流(byte)

(1)字节输出流OutputStream






(2)字节输入流InputStream


(3)字符输出流Write





(4)字符输入流Reader






(5)字节流和字符流的区别(重点)

字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法。

(6)转换流:在io中还存在一类是转换流,将字节流转换为字符流,同时可以将字符流转化为字节流。

OutputStreamWriter(OutStream out):j将字节流以字符流输出。

InputStreamReader(InputStream in):将字节流以字符流输入。

(7)打印流 PrintStream

在操作中要求输出信息时,可以采用PrintStream进行输出,它包括PrintWrite和PrintReader

(3)对象序列化

对象序列化是指将一个对象可以转化为二进制的byte流,可以以文件的方式进行保存。

将对象保存在文件的操作叫做对象的序列化操作。

将对象从文件中恢复的操作叫做反序列化操作。

一个对象如果要能序列化,它必须继承Serizliable。在实现序列化是则需要ObjectOurputStream完成,而需要反序列化时则采用ObjectInputStream。

transient关键字:变量声明为Transient后,该变量不可序列化。

(4)内存流

在项目的开发过程中,有时希望只产生临时文件,将信息输出的内存中,此时会用到内存流,内存流基本方法如下:





(5)System类对IO的支持

(6)缓存读取

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

推荐阅读更多精彩内容