Java的IO

在 Java 中,IO(输入输出)操作是程序与外界交互的主要手段。无论是从文件中读取数据,还是将数据写入文件,或者是通过网络进行通信,IO 都在其中扮演着至关重要的角色。

一、Java IO 基础概念

在 Java 中,IO 操作主要分为两大类:

字节流(Byte Stream):以字节为单位处理数据,适合处理所有类型的I/O,如图片、视频等。

字符流(Character Stream):以字符为单位处理数据,适合处理文本数据。

类别

字节流

字符流

处理单位

字节(byte)

字符(char)

适用场景

任何类型的数据(包括文本、图片等)

仅适用于文本数据

基类

InputStream / OutputStream

Reader / Writer

性能差异

处理速度较快,支持所有文件类型

对文本文件处理更高效

示例类

FileInputStream, FileOutputStream

FileReader, FileWriter

 

二、字节流操作详解

1、字节输入流:读取文件的原始字节

字节输入流的核心类是 InputStream,它的子类 FileInputStream 可以用来读取文件中的字节数据。下面是一个简单的字节输入流示例:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class ByteInputStreamExample {
	public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
		FileInputStream fis = new FileInputStream("文件路径");
		InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
		// 读取单个字节
		int data;
		try {
			while((data= isr.read())!=-1) {
				System.out.print((char) data);
			}
			
			byte[] buffer = new byte[1024];
			int bytesRead;
			while((bytesRead=  fis.read(buffer))!=-1) {
				for(int i =0;i<bytesRead;i++) {
					System.out.println((char) buffer[i]);
				}
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2、字节输出流:将数据写入文件

字节输出流的核心类是 OutputStream,它的子类 FileOutputStream 用于将数据以字节的形式写入文件。下面是一个字节输出流的示例:

import java.io.FileOutputStream;
import java.io.IOException;

public class ByteOutputStreamExample {
	public static void main(String[] args) {
		try(FileOutputStream fos = new FileOutputStream("文件路径")){
			String data = "喝中国劲酒,揍亲朋好友";
			byte[] bytes = data.getBytes();
			fos.write(bytes);
			System.out.println("成功写入");
		}catch(IOException e) {
			e.printStackTrace();
		}
				
	}
}

三、字符流操作详解

1、字符输入流:读取文本文件的字符

字符输入流的核心类是 Reader,它的子类 FileReader 用来读取文本文件的字符。与字节流不同,字符流会自动根据平台的默认编码格式转换字符。

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class CharacterInputExample {
	public static void main(String[] arg) throws FileNotFoundException {
		FileReader reader = new FileReader("文件路径");
		int data ;
		try {
			while((data=reader.read())!=-1) {
				System.out.println((char) data);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2、字符输出流:将字符写入文本文件

字符输出流的核心类是 Writer,它的子类 FileWriter 用于将字符写入文件。

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class CharactorOutputExample {
	public static void main(String[] args)  {
		try(FileWriter writer = new FileWriter("文件路径")) {
			writer.write("喝中国劲酒\n");
			writer.write("揍亲朋好友\n");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try(BufferedWriter bw = new BufferedWriter(new FileWriter("文件路径"))){
			
			bw.append("喝泸州老窖");
			bw.newLine();
			bw.append("当北京老炮");
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try{
			FileWriter writer = new FileWriter("文件路径");
			writer.write("喝泸州老窖");
			writer.write("当北京老炮");
			// 没有关闭输出流会导致数据写不进去
			writer.close(); 
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
	}
}

3、Writer的五种写入的方法

1.write(int c)

功能:写入单个字符。

参数:c 是要写入的字符(以 int 形式表示,低 16 位有效)。

2.write(char[] cbuf)

功能:写入字符数组中的所有字符

参数:cbuf 是要写入的字符数组。

3.write(char[] cbuf, int off, int len)

功能:写入字符数组的一部分。

参数:

  • cbuf:字符数组。
  • off:起始偏移量(从数组的哪个位置开始写入)。
  • len:要写入的字符数。

4.write(String str)

功能:写入字符串。

参数:str 是要写入的字符串。

5.write(String str, int off, int len)

功能:写入字符串的一部分。

参数:

  • str:字符串。
  • off:起始偏移量(从字符串的哪个位置开始写入)。
  • len:要写入的字符数
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class WriterExample {
	public static void main(String[] args) {
		try {
			Writer writer = new FileWriter("文件路径");
			//1、写入单个字符
			writer.write('H');
			// 2、写入字符数组
			char[] array= {'e','l','l','o'};
			writer.write(array);
			// 3、写入字符数组的一部分
			writer.write(array,1,2);
			// 4、写入字符串
			writer.write(",李焕英");
			// 5、写入字符串的一部分
			String str = "\n新的一行";
			writer.write(str,0,str.length());
			System.out.println("数据已写入文件");
			writer.close();
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}

四、文件复制

文件复制是 Java IO 中常见的操作

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy {
	public static void main(String[] args) throws IOException {
		try(FileInputStream fis = new FileInputStream("复制的文件路径");
			FileOutputStream fos = new FileOutputStream("写入的文件路径")
					){
			byte[] bytes = new byte[1024];
			int byteRead;
			while((byteRead = fis.read(bytes))!=-1) {
				fos.write(bytes,0,byteRead);
			}
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值