JAVA之IO流

IO流概述

 IO:输入/输出(Input/Output)

流:流是一种抽象概念,是对数据传输的总称.即数据在设备间的传输称为流,流的本质是数据传输

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出 。

IO流是用来处理设备间数据传输问题的

IO流分类 

 按照数据的流向:

        输入流:读数据

        输出流:写数据

按照数据类型:

        字节流:字节输入流,字节输出流

        字符流:字符输入流,字符输出流

一般来说,IO流的分类是按照数据类型来分的

字节流 

647e86fa3e1542b7a66e617542c755c0.jpg

字节流读数据:

        int read() :一次读取一个字节

        int read( byte[ ] bys) :一次读取一个字节数组

 字节流写数据:

        void write( int by) :一次写一个字节

        void write( byte[ ] bys) :一次写一个字节数组

        void write( byte[ ] bys,int index,int len) :一次写一个字节数组的一部分

释放资源:

        void close( ) :关闭流

小结:字节流可以复制任意文件数据,有4种方式,一般采用字节缓冲流一次读写一个字节数组的方式

//方法1
FileInputStream fis = new FileInputStream("文件路径名");
FileOutputStream fos = new FileOutputStream("文件路径名");
		
int ch;
while((ch = fis.read()) != -1) {
	fos.write(ch);
}
		
fis.close();
fos.close();


//方法2
FileInputStream fis = new FileInputStream("文件路径名");
FileOutputStream fos = new FileOutputStream("文件路径名");
		
byte[] bys = new byte[1024];
int len;
while((len = fis.read(bys)) != -1) {
	fos.write(bys, 0, len);
}
		
fis.close();
fos.close();


//方法3
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件路径名"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("文件路径名"));
		
int ch;
while((ch = bis.read()) != -1) {
	bos.write(ch);
}
		
bis.close();
bos.close();


//方法4
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("文件路径名"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("文件路径名"));
		
byte[] bys = new byte[1024];
int len;
while((len = bis.read(bys)) != -1) {
	bos.write(bys, 0, len);
}
		
bis.close();
bos.close();

字符流 

645ea7deb41a4e50aa950e3b5bef970a.jpg

字符流读数据:

        int read() :一次读取一个字符

        int read( char[ ] chs) :一次读取一个字符数组

        String readLine( ) :一次读取一行,不包含任何终止字符(字符缓冲流特有)

 字符流写数据:

        void write( int ch) :一次写一个字符

        void write( char[ ] chs) :一次写一个字符数组

        void write( char[ ] chs,int index,int len) :一次写一个字符数组的一部分

        void flush( ) :刷新流,刷新流后,数据才会写入

        void newLine( ) :写一个换行符(字符缓冲流特有)

        void write( String line) :一次写一个字符串(字符缓冲流特有)

释放资源:

        void close( ) :关闭流,关闭时先刷新流,再关闭流

        注:flush刷新缓冲后可以继续写入数据,close刷新缓冲后关闭流,不能再写入数据

小结:字符流只能复制文本文件,有5种方式,一般采用字符缓冲流的特有功能

//字符缓冲流写入数据
BufferedWriter bw = new BufferedWriter(new FileWriter("文件路径名"));
		
for(int i = 0;i<5;i++) {
	bw.write("hello"+i);
	bw.newLine();
	bw.flush();
}
		
bw.close();

//字符缓冲流读取数据
BufferedReader br = new BufferedReader(new FileReader("文件路径名"));

String line;
while((line = br.readLine()) != null) {
	System.out.println(line);
}
		
br.close();

递归

 程序调用自身的编程技巧称为递归,一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归遍历目录示例:

public static void main(String[] args) {

	File f = new File("Z:\\Learn\\Learn2");
	getFilesPath(f);
}

public static void getFilesPath(File file) {//遍历目录得到所有文件的绝对路径
	File[] files = file.listFiles();
	if (files != null) {
		for (File f : files) {
			if (f.isDirectory()) {
				getFilesPath(f);
			} else {
				System.out.println(f.getAbsolutePath());
			}
		}
	}
}

字符串编码解码

 

String str = "中国";
		
        //平台默认字符集编码
		byte[] bys = str.getBytes();//[-28, -72, -83, -27, -101, -67]
		
        //UTF-8编码
//		byte[] bys = str.getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]
		
        //GBK编码
//		byte[] bys = str.getBytes("GBK");//[-42, -48, -71, -6]
		
		System.out.println(Arrays.toString(bys));//输出字符串编码后生成的字节数组数据
		
        //平台默认解码
		String s = new String(bys);
		
        //指定字符集解码
//		String s = new String(bys,"UTF-8");
		
//		String s = new String(bys,"GBK");
		
		System.out.println(s);//输出解码后的字符串

注:字符流为简化使用FileReader和FileWriter,但若涉及到编码解码问题,还需使用InputStreamReader和OutputStreamWriter

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅释kkk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值