Java.Io 初步了解

java.io_总结

File:(文件操作类)

定义

File类是对文件/文件夹本身进行:创建、删除、路径等操作,对文件的具体内容不会操作。

设置路径

public File(String pathnamc);

设置文件的完整路径:pathnamc

  • 路径的设置采用String格式的 + 文件分级

文件创建和删除

public boolean createNewFile(); // 创建文件,返回boolean值
public boolean delete(); // 删除文件,返回boolean值

文件状态(是否存在)

public boolean exists();// 判断文件是否存在

路径分隔符常量

public static final String separator; // 根据系统环境判断路径分隔符

separator是File类中的成员,会根据系统环境判断返回的路径分隔符

子目录的创建

  • 获取父路径(当前file文件的父路径)
public File getParentFile();// 返回File型路径,便于File类的引用操作
public String getParent();// 返回String型路径数据
  • 创建子目录(一级/多级)

我们首先判断我们需要的路径文件是否存在(是否有该文件或文件夹),如果没有我们就会根据父路径进行子目录的创建。

判断方法:我们可以利用 File.getparentFile()方法返回路径数据,然后引用File.exists()方法判断路径是否可寻(存在)

public boolean mkdir();  // 处理创建一级目录
public boolean mkdirs(); // 处理创建多级目录*

文件信息的操作

  • 获取文件大小
public long length(); // 返回文件的大小(单位:b)
  • 判断目标File是否为文件
public boolean isFile(); // 文件返回True,文件夹返回False
  • 判断目标File是否为文件夹
public boolean isDirectory(); // 文件夹返回True
  • 返回最后的修改时间
public long lastModified(); // 返回时间数字串

由于程序中都是采用时间数字串,所以可以利用时间格式化改变样式

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") //格式化
  • 列出目录子文件/夹信息
public String [] list();
  • 列出所有目录的子文件/夹信息
public File [] listFiles();

File:实例

实现文件的创建、删除

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

public class TestDemo {
	public static void main(String [] args) throws IOException {
		// 路径设置:F:\demo\demo.txt
		File file = new File("F:" + File.separator + "demo" + File.separator + "demo.txt");

		if (file.getParentFile().exists()) {
			System.out.println(file.getParent() + "\t" + "路径已存在");
		} else if (!file.getParentFile().exists()) {
			// 查看父路径不存在则创建路径目录
			file.getParentFile().mkdirs(); // 不存在则创建目录
			System.out.println(file.getParent() + "\t" + "路径创建成功");
		} 
		
		if (file.exists()) {
			System.out.println("文件已存在");
		} else if (file.createNewFile()) { // 创建文件
			System.out.println("文件创建成功");
		} else {
			System.out.println("文件穿件失败");
		}
		
		if (file.exists()) {
			if (file.delete()) {
				System.out.println("文件删除成功");
			} else {
				System.out.println("文件删除失败");
			}
		} else {
			System.out.println("文件不存在");
		}
	}
}

文件最后修改时间

public class TestDemo {
	public static void main(String [] args) throws IOException {
		File file = new File("F:" + File.separator + 
				"demo" + File.separator + 
				"txt" + File.separator +
				"demo.txt");
		// SimpleDateFormat 将日期格式化输入
        // new Date()构造转换为标准日期格式
		System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified())));
		// 返回结果:2019-07-06 21:21:12
	}
}

判断是否为目录

public class TestDemo {
	public static void main(String [] args) throws IOException {
		File file = new File("F:" + File.separator + 
				"demo" + File.separator + 
				"txt" + File.separator +
				"demo.txt");
		System.out.println("是否是文件" + file.isFile());
		System.out.println("是否是目录" + file.isDirectory());
		System.out.println(file.length());
	}
}

字节流和字符流

字节流

字节输出流:OutputStream

类结构:

public abstract class OutputStream
extends Object 
implements Closeable,Flusable
  • Closeable接口:
public interface Closeable extends AutoCloseable {
    public void close() throws IOException; // 关闭流的方法
}
  • Flusable接口:
public interface Flushable {
    public void flush() throws IOException ;// 刷新缓冲区
}

OutputStream 类中已经实现了(提供)close() 和 flush() 两个方法。

输出方法

public abstract void write(int b); // 输出单个字节
public void write(byte [] b); // 输出全部字节数组b
public void write(byte [] b , int off , int len); // 输出部分数组

FileOutputStream子类

public FileOutputStream(File file);//创建或覆盖文件
public FIleOutputStream(File file,boolean append);
// 创建或对文件追加内容;append=> True:可追加,False:不可追加
  • 实例:输出文件内容
public class TestDemo {
	public static void main(String [] args) throws IOException {
		// 路径设置:F:\demo\demo.txt
		File file = new File("F:" + File.separator + "demo" + File.separator + "demo.txt");
		if(!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();//创建目录
		}
		// 使用OutputStream和FileOutputStream实例化
		OutputStream out = new FileOutputStream(file);
        /****** 核心区域 *********/
		String str = "Hello,world!";
		byte [] data = str.getBytes();//getBytes():String类 => Byte[]
		out.write(data);
		out.close();	
        /****** END ******/
	}
}

字节输入流:InputStream

类结构

public abstract class InputStream
extends Object
implements Closeable

输入方法

public abstract int read; // 读取单个字节
// 当数据没有可读的内容,返回 -1
public int read(byte [] b); // 读取全部数据保存在byte数组中
// 返回读取的数据的长度,数据为空则返回 -1
public int read(byte[] b , int off , int len);
  • 实例:读取文件中的数据
public class TestDemo {
	public static void main(String [] args) throws IOException {
		// 路径设置:F:\demo\demo.txt
		File file = new File("F:" + File.separator + "demo" + File.separator + "demo.txt");
		InputStream in = new FileInputStream(file);
		byte [] data = new byte[1024];
		int len = in.read(data);
		in.close();
		System.out.println("[" + new String(data,0,len) + "]");
	}
}
  • 实例:单个字节读取文件中的数据
public class TestDemo {
	public static void main(String [] args) throws IOException {
		// 路径设置:F:\demo\demo.txt
		File file = new File("F:" + File.separator + "demo" + File.separator + "demo.txt");
		InputStream in = new FileInputStream(file);
		byte [] data = new byte[1024];
		int foot = 0 ;
		int temp = 0 ;
		while((temp = in.read()) != -1) {
			data[foot ++] = (byte) temp;
		}
		in.close();
		System.out.println("[" + new String(data,0,foot) + "]");
	}
}

字符输出流:Writer

public abstract class Writer
extends Object
implements Appendable,Closeable,Flushable

Appendable 接口

public interface Appendable() {
    public Appendable append(char c);
        // 添加指定字符c
    public Appendable append(CharSequence csq);
    	// 添加指的字符序列 csq
    public Appendable append(CharSequence csq,int start,int end);
    	// 添加指定字符序列的子序列
}

输出方法

public void write(char[] cbuf);//输出全部字符数组
public void write(String str); //输出字符串

FIleWriter

public FileWriter(File file);
public FileWriter(File file,boolean append);

字符输入流:Reader

public abstract class Reader
extends Object
implements Readable,Closeable

输入方法

public int read(char[] cbuf);

字符流输出/输入实例:

public class TestDemo {
	public static void main(String [] args) throws IOException {
		// 路径设置:F:\demo\demo.txt
		File file = new File("F:" + File.separator + "demo" + File.separator + "demo.txt");
		out(file);
		in(file);
	}
	public static void out(File file) throws IOException {
		Writer out = new FileWriter(file);
		String str = "Hello,World!";
		out.write(str);
		out.close();
	}
	public static void in(File file) throws IOException {
		Reader in = new FileReader(file);
		char[] data = new char[1024];
		// 由于FileReader.read(char[] cbuf)接收的数据是char字符,所以要定义char数组接收数据
		int len = in.read(data);
		in.close();
		System.out.println(new String(data,0,len));
	}
}

字节流 与 字符流两种的区别

最大的区别

  • 字节流:直接与终端进行数据交互
  • 字符流:需要经过缓冲进行数据交互

字符流数据在交互中,数据操作的过程中是存放在 缓冲区 之中,在执行close()关闭字符流时候,会自动清空缓冲区;另外可以使用flush()在不执行close()关闭字符流时可以强制清空缓冲区。

我们通过字符流的方法方法:字符流可以直接传输String字符串数据,非常便利于中文信息的处理;而字节流可以处理更多的数据类型。

转换流

InputStreamReader

public class InputStreamReader
extends Reader
  • 构造方法
public InputStreamRead(InputStream in);

将字节流转为字符流数据

OutputStreamWriter

public class OutputStreamWriter
extends Writer
  • 构造方法
public OutputStreamWriter(OutputSTream out)

内存操作流

字节内存流

public class ByteArrayInputStream
extends InputStream
public class ByteArrayOutputStream
extends OutputStream

ByteArrayInputStream

  • 构造方法
public ByteArrayInputStream(byte[] buf)

将需要操作的数据设置到 内存输入流 当中

ByteArrayOutputStream

  • 构造方法
public ByteArrayOutputStream()

内存输出流(输出数据)

toByteArray()

public byte[] toByteArray()

将所有保存在内存中的字节数据转为字节数组

案例:

  • 将两个文件在内存中合并输出
public class TestDemo {
	public static void main(String [] args) throws IOException {
		File fileA = new File("F:" + File.separator + "demo" + File.separator + "demo.txt");
		File fileB = new File("F:" + File.separator + "demo" + File.separator + "data.txt");
		InputStream inA = new FileInputStream(fileA);
		InputStream inB = new FileInputStream(fileB);
		ByteArrayOutputStream output = new ByteArrayOutputStream();// 在内存中开辟一个(内存流)空间
		int temp = 0 ;
		while((temp = inA.read()) != -1) { //读取A数据
			output.write(temp);
		}
		while((temp = inB.read()) != -1) { //读取B数据
			output.write(temp);
		}
		// 读取A,B文件结束后,将内存中的所有字节数据转为字节数组
		byte [] data = output.toByteArray();
		inA.close();
		inB.close();
		output.close();
		System.out.println(new String(data));
	}
}

字符内存流:

public class CharArrayReader
extends Reader
public class CharArrayWriter
extends Writer

打印流

如果使用OutputStream,输出String字符串数据,就需要将String变为字节数组输出getBytes(),同理boolean也需要变为Byte数据输出……

package helloworld;

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

class PrintUtil {
	private OutputStream out; // 输出依靠 OutputSteam类
	public PrintUtil(OutputStream out) {
		this.out = out ; //确定OutputStream的对象是File……或者ByteArray……
	}
	public void print(int x) throws IOException {
		this.print(String.valueOf(x));//将x转为String型
	}
	public void print(String x) throws IOException {
		this.out.write(x.getBytes());
	}
	public void print(double x) throws IOException {
		this.print(String.valueOf(x));//将x转为String型
	}
	public void println(int x) throws IOException {
		this.println(String.valueOf(x));
	}
	public void println(String x) throws IOException {
		this.print(x.concat("\r\n"));
		//在String字符串结尾添加字符[concat()]
	}
	public void println(double x) throws IOException {
		this.println(String.valueOf(x));
	}
	public void close() throws IOException {//关闭输出流
		this.out.close();
	}
}

public class TestDemo {
	public static void main(String [] args) throws IOException {
		// 调用PrintUtil类的构造方法,实例化对象
		PrintUtil pu = new PrintUtil(
				new FileOutputStream(
						new File("F:" 
									+ File.separator + "demo" 
									+ File.separator + "demo.txt")));
		pu.print("Hello,");
		pu.println("World!");
		pu.println(1+1);
		pu.println(1.1+1.1);
		pu.close();
	}
}

PrintUtil类,则是为了方便打印而设计的一个工具类,在类中,我们通过调用print方法,可以将当前的数据转为String后在转为Byte型数据,可以方便我们的数据输出;避免我们在代码编写过程中浪费时间来设计数据类型转换为Byte字节输出。

字节打印流:PrintStream

  • 继承结构
java.lang.Object
	java.io.OutputStream
		java.io.FileOutputStream
			java.io.PrintStream
  • 构造方法
PrintStream(OutputStream out)
  • 实现
public class TestDemo {
	public static void main(String [] args) throws IOException {
		// 调用PrintStream类的构造方法,实例化对象
		PrintStream pu = new PrintStream(
				new FileOutputStream(
						new File("F:" 
									+ File.separator + "demo" 
									+ File.separator + "demo.txt")));
		pu.print("Hello,");
		pu.println("World!");
		pu.println(1+1);
		pu.println(1.1+1.1);
		pu.close();
	}
}

System.IO的支持

信息输出

System.out 是在Java中专门支持屏幕输出信息的操作对象(对象由系统负责实例化

public class TestDemo {
	public static void main(String [] args) throws IOException {
		OutputStream out = System.out;
		out.write("Hello,World!".getBytes());
	}
}

上述程序:通过System.out实例对象,OutputStream out 转为了向屏幕输出

系统输入

System.in:键盘输入操作。Java并没有直接提供键盘输入功能;而System类中提供了 in 对象,此对象类型是 IntputStream

public class TestDemo {
	public static void main(String [] args) throws IOException {
		//InputStream in = System.in ; // System.in对象是系统实例化,
		byte [] data = new byte[1024];
		int len = System.in.read(data); // 输入数据
		System.out.println(new String(data,0,len));
	}
}

System.out 和 System.in 都是系统实例化的对象,在程序中均是向上转型。

缓冲操作流

字符缓冲区流:

  • BufferedReader:字符缓冲输入流
  • BufferedWriter:字符缓冲输出流

字节缓冲区流:

  • BufferedInputStream:字节缓冲输入流
  • BufferedOutputStream:字节缓冲输出流

字符缓冲输入流

BufferedReader构造

public BufferedReader(Reader in);

读取一行数据

public String readLine() thows IOException;

可以利用循环,读取多行数据。

若是利用BufferedReader类来处理System.in操作,是不可直接的;因为System.in是InputStream的类型。

  • InputStream 和 Reader 类之间的转换

引用:InputStreamReader类

public class TestDemo {
	public static void main(String [] args) throws IOException {
		// System.in 是InputStream的类对象
		// BufferedReader的构造方法接收的是Reader类对象
		// 利用InputStreamReader将字节流变为字符流
		BufferedReader buf = 
				new BufferedReader
					(new InputStreamReader(System.in));
		// 调用readLine()方法接收一行数据,以String数据返回,并且以 \n 作为分隔
		String str = buf.readLine();
		System.out.println(str);
	}
}

BufferedReader类构造接收的数据是 Reader字符流对象;

利用InputStreamReader类将字节流类对象的Systen.in转为字符流的类对象Reader。

文件读取

BufferedReader缓冲输入流不仅仅可以可以从键盘中获得,也可以从文件中获得

public class TestDemo {
	public static void main(String [] args) throws IOException {
		File file = new File("F:" + File.separator + "demo" + File.separator + "demo.txt");
		if (!file.exists()) {
			file.mkdirs();
		}
		BufferedReader buf = 
				new BufferedReader
				// FileReader():实例的为字符流数据,而BufferedReader接收Reader字符流
					(new FileReader(file));
		String str = null;
		while ((str = buf.readLine()) != null) {
			System.out.println(str);
		}
		buf.close();
	}
} 

Scanner类:扫描流

  • java.util.Scanner:(JDK 1.5

    • 专门负责解决输入流的操作问题
    public final class Scanner
    extends Object
    implements Iterator<String>
    
  • 构造方法:

public Scanner(File source)
public Scanner(InputStream source)
public Scanner(Readable source)
public Scanner(ReadableByteChannel source)
public Scanner(String source)
  • 类方法

判断是否有指定数据:

public boolean hasNextXxx();
// 举例:
public boolean hasNext();//表示有数据
public boolean hasNextDouble();//表述输入的是小数

取出数据:

public String nextXxx();
// 举例:
public String next();//默认返回字符串
public double nextDouble();//自动转型返回double数据

除了利用hasNextXxx() 和 nextXxx() 方法判断数据以外,在hasNext() 和 next() 方法中支持使用正则表达式对数据进判断

public boolean hasNext(regax);
public String next(regax);

总结:

在读取数据的时候,综合角度:Scanner类 比 BufferedReader 简单;在发现Scanner无法实现的时候再使用BufferedReader

  • InputStream类的功能不足问题被 Scanner 类解决
  • Reader类的功能不足问题被 BufferedReader 类解决
  • OutputStream类的功能不足问题被 PrintStream 类解决
  • Writer类的功能不足问题被 PrintWrite 类解决
posted @ 2019-07-15 17:16  Mirror王宇阳  阅读(193)  评论(0编辑  收藏  举报