java io操作 包括什么_java的IO操作

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

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

流的概念

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

有这些流操作:

1.标准的输入输出流。

2.文件的操作。

3.网路数据流操作。

4.字符串流

5.对象流操作。

流定义:

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

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

分别由4个抽象类来表示

【字节流】InputStream OutStream

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

[字符流] 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中继承的代码如下:

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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 方法把字节发送给输出流 ,使用文件顺出流写入文件。

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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 类

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

FileReader 类

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

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

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

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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方法,关闭文件。

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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类的操作包括文件的创建、删除、重命名、得到路径、创建时间等,以下是文件操作常用的函数。

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

File类的操作:

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

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

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

(2)文件的类型函数

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

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

(3)列出目录的内容

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

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

(2)字节操作流(byte)

(1)字节输出流OutputStream

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

(2)字节输入流InputStream

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

(3)字符输出流Write

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

(4)字符输入流Reader

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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

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

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

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

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

(7)打印流 PrintStream

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

(3)对象序列化

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

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

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

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

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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

(4)内存流

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

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

(5)System类对IO的支持

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

(6)缓存读取

4dada23c71b8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值