前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java.Io 初步了解

Java.Io 初步了解

作者头像
Mirror王宇阳
发布2020-11-10 23:09:13
8200
发布2020-11-10 23:09:13
举报

java.io_总结

File:(文件操作类)

定义

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

设置路径

代码语言:javascript
复制
public File(String pathnamc);

设置文件的完整路径:pathnamc

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

文件创建和删除

代码语言:javascript
复制
public boolean createNewFile(); // 创建文件,返回boolean值
public boolean delete(); // 删除文件,返回boolean值

文件状态(是否存在)

代码语言:javascript
复制
public boolean exists();// 判断文件是否存在

路径分隔符常量

代码语言:javascript
复制
public static final String separator; // 根据系统环境判断路径分隔符

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

子目录的创建

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

我们首先判断我们需要的路径文件是否存在(是否有该文件或文件夹),如果没有我们就会根据父路径进行子目录的创建。 判断方法:我们可以利用 File.getparentFile()方法返回路径数据,然后引用File.exists()方法判断路径是否可寻(存在)

代码语言:javascript
复制
public boolean mkdir();  // 处理创建一级目录
public boolean mkdirs(); // 处理创建多级目录*

文件信息的操作

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

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

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

File:实例

实现文件的创建、删除
代码语言:javascript
复制
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("文件不存在");
		}
	}
}
文件最后修改时间
代码语言:javascript
复制
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
	}
}
判断是否为目录
代码语言:javascript
复制
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

类结构:
代码语言:javascript
复制
public abstract class OutputStream
extends Object 
implements Closeable,Flusable
  • Closeable接口:
代码语言:javascript
复制
public interface Closeable extends AutoCloseable {
    public void close() throws IOException; // 关闭流的方法
}
  • Flusable接口:
代码语言:javascript
复制
public interface Flushable {
    public void flush() throws IOException ;// 刷新缓冲区
}

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

输出方法
代码语言:javascript
复制
public abstract void write(int b); // 输出单个字节
public void write(byte [] b); // 输出全部字节数组b
public void write(byte [] b , int off , int len); // 输出部分数组
FileOutputStream子类
代码语言:javascript
复制
public FileOutputStream(File file);//创建或覆盖文件
public FIleOutputStream(File file,boolean append);
// 创建或对文件追加内容;append=> True:可追加,False:不可追加
  • 实例:输出文件内容
代码语言:javascript
复制
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

类结构
代码语言:javascript
复制
public abstract class InputStream
extends Object
implements Closeable
输入方法
代码语言:javascript
复制
public abstract int read; // 读取单个字节
// 当数据没有可读的内容,返回 -1
public int read(byte [] b); // 读取全部数据保存在byte数组中
// 返回读取的数据的长度,数据为空则返回 -1
public int read(byte[] b , int off , int len);
  • 实例:读取文件中的数据
代码语言:javascript
复制
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) + "]");
	}
}
  • 实例:单个字节读取文件中的数据
代码语言:javascript
复制
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

代码语言:javascript
复制
public abstract class Writer
extends Object
implements Appendable,Closeable,Flushable
Appendable 接口
代码语言:javascript
复制
public interface Appendable() {
    public Appendable append(char c);
        // 添加指定字符c
    public Appendable append(CharSequence csq);
    	// 添加指的字符序列 csq
    public Appendable append(CharSequence csq,int start,int end);
    	// 添加指定字符序列的子序列
}
输出方法
代码语言:javascript
复制
public void write(char[] cbuf);//输出全部字符数组
public void write(String str); //输出字符串
FIleWriter
代码语言:javascript
复制
public FileWriter(File file);
public FileWriter(File file,boolean append);

字符输入流:Reader

代码语言:javascript
复制
public abstract class Reader
extends Object
implements Readable,Closeable
输入方法
代码语言:javascript
复制
public int read(char[] cbuf);
字符流输出/输入实例:
代码语言:javascript
复制
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
代码语言:javascript
复制
public class InputStreamReader
extends Reader
  • 构造方法
代码语言:javascript
复制
public InputStreamRead(InputStream in);

将字节流转为字符流数据

OutputStreamWriter
代码语言:javascript
复制
public class OutputStreamWriter
extends Writer
  • 构造方法
代码语言:javascript
复制
public OutputStreamWriter(OutputSTream out)

内存操作流

字节内存流

代码语言:javascript
复制
public class ByteArrayInputStream
extends InputStream
public class ByteArrayOutputStream
extends OutputStream
ByteArrayInputStream
  • 构造方法
代码语言:javascript
复制
public ByteArrayInputStream(byte[] buf)

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

ByteArrayOutputStream
  • 构造方法
代码语言:javascript
复制
public ByteArrayOutputStream()

内存输出流(输出数据)

toByteArray()
代码语言:javascript
复制
public byte[] toByteArray()

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

案例:
  • 将两个文件在内存中合并输出
代码语言:javascript
复制
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));
	}
}
字符内存流:
代码语言:javascript
复制
public class CharArrayReader
extends Reader
代码语言:javascript
复制
public class CharArrayWriter
extends Writer

打印流

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

代码语言:javascript
复制
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

  • 继承结构
代码语言:javascript
复制
java.lang.Object
	java.io.OutputStream
		java.io.FileOutputStream
			java.io.PrintStream
  • 构造方法
代码语言:javascript
复制
PrintStream(OutputStream out)
  • 实现
代码语言:javascript
复制
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中专门支持屏幕输出信息的操作对象(对象由系统负责实例化

代码语言:javascript
复制
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

代码语言:javascript
复制
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构造
代码语言:javascript
复制
public BufferedReader(Reader in);
读取一行数据
代码语言:javascript
复制
public String readLine() thows IOException;

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

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

  • InputStream 和 Reader 类之间的转换

引用:InputStreamReader类

代码语言:javascript
复制
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缓冲输入流不仅仅可以可以从键盘中获得,也可以从文件中获得

代码语言:javascript
复制
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>

  • 构造方法:
代码语言:javascript
复制
public Scanner(File source)
public Scanner(InputStream source)
public Scanner(Readable source)
public Scanner(ReadableByteChannel source)
public Scanner(String source)
  • 类方法

判断是否有指定数据:

代码语言:javascript
复制
public boolean hasNextXxx();
// 举例:
public boolean hasNext();//表示有数据
public boolean hasNextDouble();//表述输入的是小数

取出数据:

代码语言:javascript
复制
public String nextXxx();
// 举例:
public String next();//默认返回字符串
public double nextDouble();//自动转型返回double数据

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

代码语言:javascript
复制
public boolean hasNext(regax);
public String next(regax);

总结:

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

  • InputStream类的功能不足问题被 Scanner 类解决
  • Reader类的功能不足问题被 BufferedReader 类解决
  • OutputStream类的功能不足问题被 PrintStream 类解决
  • Writer类的功能不足问题被 PrintWrite 类解决
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • java.io_总结
    • File:(文件操作类)
      • 定义
      • 设置路径
      • 文件创建和删除
      • 文件状态(是否存在)
      • 路径分隔符常量
      • 子目录的创建
      • 文件信息的操作
      • File:实例
    • 字节流和字符流
      • 字节流
        • 字节输出流:OutputStream
        • 字节输入流:InputStream
        • 字符输出流:Writer
        • 字符输入流:Reader
        • 字节流 与 字符流两种的区别
        • 转换流
      • 内存操作流
        • 字节内存流
      • 打印流
        • 字节打印流:PrintStream
      • System.IO的支持
        • 信息输出
        • 系统输入
        • 缓冲操作流
        • 字符缓冲输入流
      • Scanner类:扫描流
        • 总结:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档