Java IO 详细解释 datainputstream和fileinputstream区别 char数组 byte数组 String toCharArray 和getBytes 区别

Java IO
IO流的概念
计算机中的数据时基于随着时间变化高低电压信号传输的,这些数据信号连续不断,有着固定的传输方向,类似于水管中的水的流动,因此,抽象数据流是指一组有顺序的、有起点和终点的字节集合

IO流的作用
抽象出数据流是为了实现程序逻辑与底层硬件的解耦:通过引入数据流作为程序与硬件设备之间的抽象层,面向通用的数据流输入输出接口编程,而不是具体硬件特性,程序和底层硬件可以独立灵活替换和扩展

IO流的类型
IO是指对数据流的输入和输出

流向类型:输入/输出流
流的数据单位:字节流(可以处理任何类型的数据)、字符流(只能处理字符类型的数据)
流的功能角色:节点流、处理流(对一个已有流进行连接和封装)
节点类型:File(文件)、Piped(进程内线程通信管道)、ByteArray/CharArray(字节/字符数组)、StringBuffer/String(字符串缓冲区/字符串)
抽象流类型:InputStream、OutputStream、Reader、Writer
功能:Buffered(缓冲)、Data(基本数据类型)、Object(对象)

BIO(同步阻塞型IO)blocking I/O:适用于连接数目小且固定的架构
NIO(同步非阻塞型IO)【JDK1.4】non-blocking I/O:适用于连接数目多且连接比较短的架构
AIO(异步非阻塞型IO)【JDK1.7】asynchronous I/O:适用于连接数目多且连接比较长的架构

涉及的设计策略与设计模式
设计策略:链接机制、对称性
设计模式:装饰模式、适配模式

outputStream中的三个基本的写方法
abstract void write(int?b):往输出流中写入一个字节。
void write(byte[]?b) :往输出流中写入数组b中的所有字节。
void write(byte[]?b, int?off, int?len) :往输出流中写入数组b中从偏移量off开始的len个字节的数据。


其它方法
   void flush() :刷新输出流,强制缓冲区中的输出字节被写出。
     void close() :关闭输出流,释放和这个流相关的系统资源。


 

Java流类的类结构图:

 

字符流的由来: Java中字符是采用Unicode标准,一个字符是16位,即一个字符使用两个字节来表示。为此,JAVA中引入了处理字符的流。因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。

 

3)特性

  相对于程序来说,输出流是往存储介质或数据通道写入数据,而输入流是从存储介质或数据通道中读取数据,一般来说关于流的特性有下面几点:

1、先进先出,最先写入输出流的数据最先被输入流读取到。

2、顺序存取,可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile可以从文件的任意位置进行存取(输入输出)操作

3、只读或只写,每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。 

 

1File 类

如何创建创建一个文件对象

File f1 =new File(“绝对路径”);


package demo7;

import java.io.File;
import java.io.IOException;

public class IO01 {
	public static void main(String[] args) throws Exception {
		File f1=new File("a.txt");
		if(!f1.exists()) {
			f1.createNewFile();
		}
		
		System.out.println(f1.isFile());
		System.out.println(f1.isDirectory());		
		System.out.println(f1.getName());
		System.out.println(f1.getParent());
		System.out.println(f1.getPath());
		System.out.println(f1.getAbsolutePath());
		System.out.println(f1.length());
		System.out.println(f1.delete());
		
		
	}
}

2


package demo7;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class IO02 {
	 public static void main(String[] args) throws Exception {
		File fl=new File("a.txt");
		if(!fl.exists()) {
			fl.createNewFile();
		}
		FileInputStream fis=new FileInputStream(fl);
		
		byte[] bt=new byte[(int)fl.length()];
		
		fis.read(bt);
		for (byte b : bt) {
			System.out.print((char)b);
		}
		fis.close();
		
		
		
		
	}
}


 


3

package demo7;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class IO03 {
	public static void main(String[] args) throws Exception {
		File fl=new File("b.txt");
		//String 调 getBytes方法变成byte数组
		String s="我心中的那团火是不会熄灭滴!!";
		byte[] bt=s.getBytes();
		FileOutputStream fs;
		fs=new FileOutputStream(fl);
		fs.write(bt);
		fs.close();
		System.out.println("执行成功");
		
	}
}

4


package demo7;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class IO04 {
	public static void main(String[] args) throws Exception {
		File fl=new File("b.txt");
		File f2=new File("d.txt");
		FileInputStream fis;
		FileOutputStream fos;
		//复制文件 位置
		fis =new FileInputStream(fl);
		fos =new FileOutputStream(f2);
		//方式一
//		byte[] bt=new byte[(int)fl.length()];
//		fis.read(bt);
//		fos.write(bt);
		//方式二
		int i;
		while((i=fis.read())!=-1) {			
			fos.write(i);
		}
		fos.close();
		fis.close();
		System.out.println("成功啦");
		
		
	}
}

5


package demo7;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class IO05 {
	public static void main(String[] args) throws Exception {
		File fl =new File("e.txt");
		FileWriter fw=null;
		
		fw=new FileWriter(fl);
		//String 调 toCharArray方法变成 char数组
		String s="Hellow";		
		char[] cr=s.toCharArray();
		fw.write(221);//输入的数字对应ascll码
		fw.write(s);
		fw.write("apple");//输入的数字对应ascll码
		fw.write(221);
		fw.write(cr);
		fw.close();
		System.out.println("成功啦!!");
		
		
		
	}
}

6

package demo7;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;

public class IO06 {
	public static void main(String[] args) throws Exception {
		File fl=new File("e.txt");
		FileInputStream fis;
		InputStreamReader isr;
		//定义输入流
		fis= new FileInputStream(fl);
		isr=new InputStreamReader(fis);
		//定义一个char数组 把文件内容传进去
		char[] cr=new char[(int)fl.length()];
		isr.read(cr);
		//遍历char数组 输出
		for (char c : cr) {
			System.out.print(c);
		}
		
	
		
	}
}

7

package demo7;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class IO07 {
	public static void main(String[] args) throws Exception {
		FileInputStream fis=null;
		InputStreamReader isr=null;
		BufferedReader br=null;
		
		File ff=new File("a.txt");

		 fis=new FileInputStream(ff);
		 isr=new InputStreamReader(fis);
		 //加入缓冲区
		 br=new BufferedReader(isr);
		
		 //输出一行 只有一行helloWorld
		 System.out.println(br.readLine());
		 
		br.close();
		isr.close();
		fis.close();
	}
}

8

package demo7;

import java.io.*;


public class IO08 {
	public static void main(String[] args) throws Exception {
		FileOutputStream fis=null;
		OutputStreamWriter isr=null;
		BufferedWriter br=null;
		
		File ff=new File("e.txt");
		
		 fis=new FileOutputStream(ff);
		 isr=new OutputStreamWriter(fis);
		 //加入缓冲区
		 br=new BufferedWriter(isr);
		 String s="banana";
		 char[] ch= s.toCharArray();
		 br.write(ch);
		 br.write(s+"+apple");
		 br.write(111);
		 
		 
		br.close();
		isr.close();
		fis.close();
		System.out.println("成功了");
		System.out.println(ff.exists());
	}
}

9

package demo7;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;

public class IO09 {
	public static void main(String[] args) throws Exception {
		//使用 字符流 缓冲流实现文件的复制
		File fl=new File("e.txt");
		File f2=new File("f.txt");
		FileReader fr=null;
		FileWriter fw=null;
		BufferedReader br=null;
		BufferedWriter bw=null;
		
		fr=new FileReader(fl);
		fw=new FileWriter(f2);
		
		br=new BufferedReader(fr);
		bw=new BufferedWriter(fw);
		String line ;
		while((line=br.readLine())!=null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		bw.close();
		br.close();
		fw.close();
		fr.close();	
		System.out.println("成功啦!!");
	}
}

10

package demo7;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class IO10 {
	public static void main(String[] args) throws Exception {
		long start=System.currentTimeMillis();
		//使用字节流 File Date 实现 视频的复制
		File fl=new File("D:\\JavaVideo\\javaBase\\io类2.mp4");
		File f2=new File("D:\\JavaVideo\\javaBase\\io类201.mp4");
		
		FileInputStream fis=null;
		FileOutputStream fos=null;
		DataInputStream dis=null;
		DataOutputStream dos=null;
		
		fis=new FileInputStream(fl);
		fos=new FileOutputStream(f2);
		dis=new DataInputStream(fis);
		dos=new DataOutputStream(fos);
		
		//创建数组 接受视频
		byte[] bt=new byte[(int)fl.length()];
		dis.read(bt);
		dos.write(bt);
		dos.close();
		dis.close();
		fos.close();
		fis.close();
		long end=System.currentTimeMillis();
		System.out.println("系统花费时间==="+(end-start));
	}
}

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

字节流和字符流的区别

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

·        读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

·        处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

结论:只要是处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

kjshuan

点个赞就好啦!!!

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

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

打赏作者

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

抵扣说明:

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

余额充值