java io笔记_Java IO学习笔记一

概述

Java io流类主要分为2大类,一类是原生字节流包括InputStream 和 OutputStream 及它们的子类,另外一类是字符流包括Reader和Writer及它们的子类。能够从其中读取一个字节的流就是输入流,同理能够从其中读取一个字符的流就是字符流。由于原生的字节流只提供了原生的read和write方法,而应用系统中更多是关注数字,字符串,对象这些结构化的对象,所以相对来说,使用字节流会较少。字节流有往往在socket网络编程中出现。

IO流类继承图

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

常用流类及用法

字节流相关的类

1、FileInputStream类

该类的功能是从一个文件构造一个字节流,该类直接继承 InputStream类,只是提供了从文件读取字节的原始read()方法,在nio中,FileInputstream添加了getChannel()方法,该类经常需要组合DataInputStream和InputStreamReader类来使用

//从文本文件构造一个文件字节流

FileInputStream fin = new FileInputStream("data.txt");

FileChannel channel = fin.getChannel();

2、DataInputStream 类

该类经常在Java中被用到,该类除了读入原生的字节流,更重要的是实现了DataInput接口。该接口提供了以二进制的形式读写数组,整形,字符串等方法。 该类提供了从原生字节流中读取Java基本类型的方法,例如readInt,readLong等方法,使用方法如下。

需要说明的是,该类的readLine方法被废弃,改由 BufferReader.readLine()方法代替

DataInputStream ds = new DataInputStream(

new FileInputStream(

new File("data.txt")));

ds.readInt(); // 从文件流读取一个整形数据

DataInputStream ds1 = new DataInputStream(System.in);

ds1.readInt();// 从控制台读取一个整形数据

3、BufferInputStream类

给类能够给流类添加缓存功能,因此在实际使用中,为了使程序拥有良好的性能,经常需要对底层的流包装到该类中,该类继承FilterInputStream,但是该类除了原始的read和write方法外,并没有提供更多读取结构化数据的方法

使用方法类似于

DataInputStream ds = new DataInputStream(

new BufferedInputStream(

new FileInputStream(

new File("data.txt"))));

ds.readInt(); // 从文件流读取一个整形数据

DataInputStream ds1 = new DataInputStream(

new BufferedInputStream(System.in));

ds1.readInt();// 从控制台读取一个整形数据

4、PrintStream类

PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。

PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用

//

PrintStream out = new PrintStream(new File("data.txt"));

out.print(100);

out.print("hello,world");

PrintStream out2 = System.out;

out2.print("hello,world");

字符流相关的类

4、InputStreamReader类

该类提供的功能是字节流通向字符流的桥梁,它使用指定的

charset 读取字节并将其解码为字符,InputStreamReader的构造方法都是接受一个InputStream字节流对象和字符集对象,从字节流构造一个字符流。

该类只提供了read()方法,从流中读取一个字符,而没有提供读取结构化数据的方法。但是该类是Reader的子类,可以包装到功能丰富的其他Reader子类中使用。 该类在使用的时候一般需要包装到 BufferReader 对象中

//从网络读取字节流,然后封装为字符流

HttpURLConnection conn = (HttpURLConnection)new URL("www.baidu.com").openConnection();

nputStream in = conn.getInputStream();

InputStreamReader inr0 = new InputStreamReader(in);

//从控制台读取字符

InputStreamReader isr = new InputStreamReader(System.in);

int a = isr.read();

5、FileReader类

读取字符文件的便捷类,FileReader类除了构造方法外,没有自己的方法,所有的方法都是从InputStreamReader类继承过来的。所以也没有读取结构化数据的方法

public class FileReader extends InputStreamReader {

public FileReader(File file);

public FileReader(String filename);

}

6、BufferedReader类

对字符流进行缓冲的类,可以实现字符,数组,行的高效读取,该类提供了一个经常被使用的方法,从字符流中按照行读取 readLine()。无论对于字符流还是字节流,想想逐行读取,都需要使用BufferedReader。对于字节流,先使用InputStreamReader封装成字符流然后,然后封装到BufferedReader中

//从网络读取字节流,然后封装为字符流

HttpURLConnection conn = (HttpURLConnection)new URL("www.baidu.com").openConnection();

InputStream in = conn.getInputStream();

InputStreamReader inr0 = new InputStreamReader(in);

//从控制台读取字符

InputStreamReader isr = new InputStreamReader(System.in);

int a = isr.read();

//FileReader fr;

BufferedReader br = new BufferedReader(inr0); //将网络字节流封装得到的字符流 进行封装

br.readLine(); //从网络中逐行读取内容

BufferedReader br1 = new BufferedReader(isr); //

br1.readLine(); //从控制台逐行读取

BufferedReader br2 = new BufferedReader(new FileReader("data.txt"));

br2.readLine(); //从文本文件逐行读取

7、PrintWriter类

该类在功能上类似DataOutputStream,可以将结构化对象写到文件或者字节输出流中,该类提供一系列重载的构造方法pring(int i),print(String s)等等。该类构造方法接受File,OutputStream两种类型数据目的地。

//

PrintWriter pw = new PrintWriter(new File("data.txt"));

pw.print(100);

pw.print("hello,world");

PrintWriter pw1= new PrintWriter(new FileOutputStream("data.txt"));

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

pw1.print(100); // 写入基本类型

pw1.print("hello,world");

pw1.write(array); // 写入char数组,PrintWriter也提供一个print(char[])的方法,这两个方法直接的差别自己还没清楚

9、Scanner类

一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。 Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。

该类的用法十分灵活,而且从文件,字节输入流中读取基本类型,字符串,逐行读取等方面有广泛的应用。

// Scanner

Scanner scan = new Scanner(System.in); //从控制台字节流中构造一个Scanner

while(scan.hasNext()){ // 1 2 3 4 5

scan.nextInt();

}

if(scan.hasNext())

scan.nextLine(); // 从控制台读取一行内容

Scanner scann = new Scanner(new File("data.txt")); //从文本文件构造一个扫描器

scann.nextLine();//行分隔符,根据操作系统平台自动选择,windows "\r\n" Linux "\n"

10、RandomAccessFile随机访问文件

该类的的对象可以在文件的任何位置进行文件读写,所有的磁盘文件的可以随机访问的,也就是支持从文件的任意位置读写,但是网络中的数据流却不是随机的。随机文件有一指针指向当前读入或者写出的位置。

该类实现了DataInput和DataOutput接口,也就是向文件总读写数组,整形,字符串等对象。

//RandomAccessFile

RandomAccessFile raf = new RandomAccessFile("data.txt","rw");

byte[] buf = new byte[1024];

raf.read(buf); //从字节数组 buf 中读取数据到 随机文件中

raf.write(buf);//将随机文件中的内容写到buf数组中

【说明】由于某些原因,System.in  ,  System.out  ,   System.err  这三个经常使用的流类都是字节流,而并非想象的字符流。写出Java基本类型例如int,String可以使用字节流类PrintStream ,DataOutputStream。也可以使用字符流类 PrintWriter。但是读取Java基本类型,只有字节流类DataInputStream可以实现,字符流类没有提供readInt等方法

未完待续,后面还会写Java IO操作的一些具体的实例,例如从网络下载图片,读取网页上内容等等 ……

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值