Java应用编程_I/O编程(File文件操作 | 字节字符流 | I/O操作深入 | 输入与输出支持 | 对象序列化)

总览【Java SE】
在这里插入图片描述



一,File文件操作

在这里插入图片描述

demo_文件列表显示

package cn.io.demo;
import java.io.File;
public class 案例_文件列表显示 {
	public static void main(String[] args) {
		File file=new File("E:"+File.separator);
		listDir(file);
	}
	public static void listDir(File file){
		if(file.isDirectory()){
			File result[]=file.listFiles();
			if(result!=null){
				for (int i = 0; i < result.length; i++) {
					listDir(result[i]);	//递归将是目录的文件路径递归到文件然后输出文件的路径			
				}
			}
		}
		System.out.println(file);
	}
}

demo_文件批量更名

package cn.io.demo;
import java.io.File;
public class 案例_文件批量更名 {
	public static void main(String[] args) {
		File file=new File("F:"+File.separator);
		renameDir(file);
	}
	public static void renameDir(File file){
		if(file.isDirectory()){
			File result[]=file.listFiles();
			if(result!=null){
				for (int i = 0; i < result.length; i++) {
					renameDir(result[i]);
				}
			}
		}else{
			if(file.isFile()){//排除空文件夹的干扰
				String fileName=null;
				if(file.getName().endsWith(".txts")){
					//public int lastIndexOf(String str)从尾查找指定字符串的位置:找不到返回-1,找到了返回对应字符数组下标
					fileName=file.getName().substring(0, file.getName().lastIndexOf("."))+".txt";
					File newFile=new File(file.getParentFile(),fileName);
					file.renameTo(newFile);
				}
			}
		}
	}
}

注意不要将代码中要修改的文件后缀名修改成重要的后缀名,以防止文件被破坏。该程序将F盘中的所有后缀名为“.txts”的修改为“.txt”。

demo_File文件基本操作

package cn.io.demo;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
class MathUtil{
	private MathUtil(){}
	public static double round(double data,int scale){
		return Math.round(data*Math.pow(10, scale))/Math.pow(10, scale);
	}
}
public class File文件基本操作  {
	public static void main(String[] args)throws Exception {
		File file = new File("F:"+File.separator+"demo.txt");
		if(!file.getParentFile().exists()){
			file.getParentFile().mkdirs();
		}
		if(file.exists()){
			file.delete();
		}else{
			file.createNewFile();
		}
		
		File fileB=new File("C:"+File.separator+"Finish.log");
		System.out.println("存在:"+fileB.exists());
		System.out.println("读取:"+fileB.canRead());
		System.out.println("写入:"+fileB.canWrite());
		System.out.println("执行:"+fileB.canExecute());
		System.out.println("大小:"+MathUtil.round(fileB.length(), 2)+"KB");
		System.out.println("时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( new Date(fileB.lastModified())));
		System.out.println("目录:"+fileB.isDirectory());
		System.out.println("文件:"+fileB.isFile());
		
		File fileC=new File("E:"+File.separator);
		if(fileC.isDirectory()){
			File result[]=fileC.listFiles();
			for (int i = 0; i < result.length; i++) {
				System.out.println(result[i]);
			}
		}
	}
}

运行结果

存在:true
读取:true
写入:true
执行:true
大小:9.0KB
时间:2019-01-11 15:56:19
目录:false
文件:true
E:\$RECYCLE.BIN
E:\Adobe
E:\demo - 快捷方式.lnk
E:\demo.txt
E:\System Volume Information
E:\前端
E:\后端

Process finished with exit code 0

二,字节流与字符流

在这里插入图片描述

demo_OutputStream类

package cn.io.demo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class OutputStream{
	public static void main(String[] args)throws Exception {
		File file=new File("E:"+File.separator+"demo.txt");
		if(!file.getParentFile().exists()){
			file.getParentFile().mkdirs();
		}
		try (OutputStream output=new FileOutputStream(file);){
			String str="hello\r\nhello";
			output.write(str.getBytes());
		} catch (Exception e) {
			e.printStackTrace();
		} 		
	}
}

demo_InputStream类

package cn.io.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class InputStream{

	public static void main(String[] args) throws Exception{
		File file=new File("E:"+File.separator+"demo.txt");
		if(file.exists()){
			InputStream input=new FileInputStream(file);
			byte data[]=new byte[1024];
			int len=input.read(data);
			System.out.println("["+new String(data,0,len)+"]");
			input.close();
		}
	}

}

demo_Writer类

package cn.io.demo;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class Writer{

	public static void main(String[] args)throws Exception {
		File file=new File("E:"+File.separator+"demo.txt");
		if(!file.getParentFile().exists()){
			file.getParentFile().mkdirs();
		}
		Writer out=new FileWriter(file);
		out.write("hello world");
		out.append("!");
		out.close();
		
	}

}

demo_Reader类

package cn.io.demo;

import java.io.File;
import java.io.FileReader;
import java.io.Reader;

public class Reader{

	public static void main(String[] args) throws Exception{
		File file=new File("E:"+File.separator+"demo.txt");
		if(file.exists()){
			Reader read=new FileReader(file);
			char data[]=new char[1024];
			read.skip(2);
			int len=read.read(data);
			System.out.println(new String(data,0,len));
		}
	}

}

demo_转换流

package cn.io.demo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class 转换流 {

	public static void main(String[] args) throws Exception{
		File file =new File("E:"+File.separator+"demo.txt");
		if(file.exists()){
			OutputStream output=new FileOutputStream(file);
			Writer out=new OutputStreamWriter(output);
			out.write("hello!!");
			out.close();
			output.close();
		}
	}

}

demo_文件拷贝

package cn.io.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

class FileUtil{
	private File srcFile;//源文件
	private File desFile;//目标文件
	public FileUtil(File srcFile, File desFile) {
		this.srcFile = srcFile;
		this.desFile = desFile;
	}
	public FileUtil(String srcFile, String desFile) {
		this(new File(srcFile),new File(desFile));//构造调用
	}
	
	public boolean copy() throws Exception{//文件复制前的基本判断
		if(!this.srcFile.exists()){
			System.out.println("复制源文件不存在!");
			return false;
		}
		try{
			this.copyImple(this.srcFile);
			return true;
		}catch(Exception e){
			return false;
		}
	}
	private void copyImple(File file)throws Exception{
		if(file.isDirectory()){
			File result[]=file.listFiles();
			for (int i = 0; i < result.length; i++) {
				copyImple(result[i]);
			}
		}else{
			if(file.isFile()){
				String newFilePath=file.getPath().replace(this.srcFile.getPath()+File.separator, "");
				File newFile = new File(this.desFile,newFilePath);
				this.copyFileImple(file,newFile);
			}
		}
	}
	private void copyFileImple(File srcFileImp,File desFileImp)throws Exception{
		if(!this.desFile.exists()){
			this.desFile.mkdirs();
		}
		byte data[]=new byte[1024];
		InputStream input=null;
		OutputStream output=null;
		
		try{
			input=new FileInputStream(srcFileImp);
			output=new FileOutputStream(desFileImp);
			int len=0;
			while((len = input.read(data))!=-1){
				output.write(data, 0, len);
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(input!=null){
				input.close();
			}
			if(output!=null){
				output.close();
			}
		}
	}
	
	
}
public class 案例_文件拷贝 {
	public static void main(String[] args) throws Exception{
		if(args.length!=2){
			System.out.println("命令参数设置错误");
			System.exit(1);
		}
		long start=System.currentTimeMillis();
		FileUtil fu=new FileUtil(args[0],args[1]);
		System.out.println(fu.copy()?"文件复制成功":"文件复制失败");
		long end=System.currentTimeMillis();
		System.out.println("复制花费时间为"+(end-start));
	}
}

三,I/O操作深入

在这里插入图片描述
【扩展】RandomAccessFile简介与使用

demo_内存操作流

package cn.io.demo;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class 内存操作流 {

	public static void main(String[] args)throws Exception {
		String str="hello";
		InputStream input=new ByteArrayInputStream(str.getBytes());
		ByteArrayOutputStream output=new ByteArrayOutputStream();//不向上转型,要使用ByteArrayOutput的toByteArray方法
		int data=0;
		while((data=input.read())!=-1){
			output.write(Character.toUpperCase(data));//将输入流的内容保存至输出流
		}
		byte result[]=output.toByteArray();
		System.out.println(new String(result));
		input.close();
		output.close();
	}

}

demo_管道流

package cn.io.demo;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class 管道流 {
	public static void main(String[] args)throws Exception {
		SendThread send=new SendThread();
		ReceiveThread receive=new ReceiveThread();
		send.getOutput().connect(receive.getInput());
		new Thread(send,"发送端").start();
		new Thread(receive,"接收端").start();
		
	}
}

class SendThread implements Runnable{
	private PipedOutputStream output;
	public SendThread(){
		this.output=new PipedOutputStream();
	}
	public PipedOutputStream getOutput(){
		return this.output;
	}
	@Override
	public void run() {
		try {
			this.output.write((Thread.currentThread().getName()+"发送信息:hello").getBytes());
			this.output.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}
class ReceiveThread implements Runnable{
	private PipedInputStream input;
	public ReceiveThread(){
		this.input=new PipedInputStream();
	}
	public PipedInputStream getInput(){
		return this.input;
	}
	@Override
	public void run() {
		byte data[]=new byte[1024];
		int len=0;
		ByteArrayOutputStream bos=new ByteArrayOutputStream();
		try {
			while((len=input.read(data))!=-1){
				bos.write(data,0,len);
			}
			System.out.println(new String(bos.toByteArray()));
			this.input.close();
			bos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}

demo_RandomAccessFile_Read

package cn.io.demo;
import java.io.File;
import java.io.RandomAccessFile;
public class RandomAccessFile_Read {
	public static void main(String[] args) throws Exception{
		File file=new File("E:"+File.separator+"demo.txt");
		RandomAccessFile raf=new RandomAccessFile(file,"rw");
		{//读取王五 跳过24位
			raf.skipBytes(24);
			byte[] data=new byte[8];
			int len=raf.read(data);
			System.out.println("姓名:"+new String(data,0,len).trim()+"\t年龄:"+raf.readInt());
		}
		{//读取李四 回跳12位
			raf.seek(12);;
			byte[] data=new byte[8];
			int len=raf.read(data);
			System.out.println("姓名:"+new String(data,0,len).trim()+"\t年龄:"+raf.readInt());
		}
		{//读取张三 跳回开始点
			raf.seek(0);;
			byte[] data=new byte[8];
			int len=raf.read(data);
			System.out.println("姓名:"+new String(data,0,len).trim()+"\t年龄:"+raf.readInt());
		}
		raf.close();
	}

}

demo_RandomAccessFile_Write

package cn.io.demo;
import java.io.File;
import java.io.RandomAccessFile;
class Writer_RA {
	public static void Run(RandomAccessFile raf,String names[],int ages[])throws Exception{
		for(int i=0;i<names.length;i++){
			raf.write(names[i].getBytes());
			raf.writeInt(ages[i]);
		}
		raf.close();
	}
}
public class RandomAccessFile_Writer {
	public static void main(String[] args) throws Exception{
		RandomAccessFile raf=new RandomAccessFile(new File("E:"+File.separator+"demo.txt"),"rw");
		Writer_RA.Run(raf, new String[]{"zhangsan","lisi    ","wangwu  "}, new int[]{10,20,30});
	}
}

四,输入与输出支持

在这里插入图片描述

demo_打印流

package cn.io.demo;
import java.io.File;
import java.io.PrintWriter;
public class 打印流 {
	public static void main(String[] args) throws Exception{
		File file=new File("E:"+File.separator+"demo.txt");
		PrintWriter pri=new PrintWriter(file);
		int age=18;
		pri.print("姓名:");
		pri.println("张三");
		pri.printf("年龄:%d\r\n", age);
		pri.close();
	}
}

demo_System的IO

package cn.io.demo;

import java.io.InputStream;

public class System的IO {

	public static void main(String[] args) throws Exception{
		InputStream input=System.in;
		System.out.print("请输入内容:");
		byte [] data=new byte[1024];
		int len=input.read(data);
		System.out.println("输入的内容为:"+new String(data,0,len));
		try{
			Integer.parseInt("a");
		}catch(Exception e){
			System.out.println(e);
			System.err.print(e);
		}
	}
}

运行结果

请输入内容:1
输入的内容为:1

java.lang.NumberFormatException: For input string: "a"
java.lang.NumberFormatException: For input string: "a"(此行红色)
Process finished with exit code 0

demo_BufferedReader类

package cn.io.demo;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BufferedReader{

	public static void main(String[] args) throws Exception{
		BufferedReader buff=new BufferedReader(new InputStreamReader(System.in));
		System.out.println("请输入你的年龄:");
		String age=buff.readLine();
		if(age.matches("\\d{1,3}")){
			int ages=Integer.parseInt(age);
			System.out.println("你的年龄为"+ages+"岁");
		}else{
			System.out.println("你绝对是来捣乱的!");
		}
	}

}

demo_Scanner类

package cn.io.demo;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class Scanner{
	public static void main(String[] args)throws Exception {
		Scanner scan=new Scanner(System.in);
		System.out.println("请输入你的生日:");
		if(scan.hasNext("\\d{4}-\\d{2}-\\d{2}")){
			String str=scan.next("\\d{4}-\\d{2}-\\d{2}");
			System.out.println("生日为:"+new SimpleDateFormat("yyyy-MM-dd").parse(str));
		}
		scan.close();
		
		Scanner scann=new Scanner(new File("E:"+File.separator+"demo.txt"));
		scann.useDelimiter("\n");
		while(scann.hasNext()){
			System.out.println(scann.next());
		}
		scann.close();
	}

}

五,对象序列化

在这里插入图片描述

demo_对象序列化

package cn.io.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

@SuppressWarnings(value = { "" })
class Person implements Serializable{
	private String name;
	private int age;
	private transient int mark;
	public Person(String name,int age,int mark){
		this.name=name;
		this.age=age;
		this.mark=mark;
	}
	@Override
	public String toString(){
		return "姓名:"+this.name+",年龄:"+this.age+",不需要序列化的值:"+this.mark;
	}
}
public class 对象序列化 {
	private static final File SAVE_FILE=new File("E:"+File.separator+"demo.txt");
	public static void main(String[] args) throws Exception {
		saveObject(new Person("张三",18,1));
		System.out.println(loadObject());
	}
	public static void saveObject(Object obj)throws Exception{
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
		oos.writeObject(obj);
		oos.close();
	} 
	public static Object loadObject()throws Exception{
		ObjectInputStream ois=new ObjectInputStream(new FileInputStream(SAVE_FILE));
		Object obj=ois.readObject();
		ois.close();
		return obj;
	}

}

本文完,欢迎访问或关注我的【Java SE】专栏。
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值