Java中的I/O操作

文件对象常用方法
File file = new File("e:/xx.txt");//文件对象

file.getAbsolutePath() //文件绝对路径

file.exists()//文件是否存在

file.isDirectory()//是否是文件夹

file.isFile()//是否是文件

file.length()//文件长度

file.lastModified()//文件最后修改时间

file.setLastModified(0)//设置文件最后修改时间

file.renameTo(file2)//文件重命名

file.list()//以字符串数组的形式,返回当前文件夹下的所有文件(不包含子文件及子文件夹),file对象需是文件夹

file.listFiles()//以文件数组的形式,返回当前文件夹下的所有文件(不包含子文件及子文件夹),file对象需是文件夹

file.getParent()//以字符串的形式返回获取所在文件夹

file.getParentFile();//以文件形式返回获取所在文件夹

file.mkdir()//创建文件夹,如果父文件夹不存在则创建无效

file.midirs()//创建文件夹,如果父文件夹不存在则创建父文件夹

file.createnewFile();//创建一个空文件,如果父文件夹不存在则抛出异常

file.getParentFile().mkdirs()//可以先创建父目录

File.listRoots()//列出所有盘符,静态方法

file.delete()//删除文件

file.createTempFile();//创建临时文件

file.deleteOnExit()//JVM结束的时候,删除文件,常用  于临时文件删除
字节流
  • 文件读取
File f = new File("d:/xx.txt");
//创建基于文件的输入流,通过这个输入流,可以把数据从硬盘,读到内存中。
FileInputStream fis = new FileInputStream(f);

byte[] all = new byte[(int)f.length()];
//以字节流的形式读取文件删除线格式 内容
fis.read(all);
//输出ASCII码
System.out.printLn(all[0]);
//使用完需要关闭
fis.close();
  • 文件写入
//文件为空
File f = new File("d:/xx.txt");
//X,Y的ASCII码
byte data[] = {88,89};
//创建基于文件的输出流
FileOutPutStream fos = new FileOutPutStream(f);
fos.write(data);//写入
fos.close();
字符流
//读取
FileReader fr = new FileReder(f);
char[] all = new char[(int) f.length()];
fr.read(all);

//写入
FileWrite fr = new FileWrite(f);
String data = "abcdefg";
char[] cs = data.toCharArray();
fr.write(cs);
缓存流
  • 缓存流在写入数据时,会先把数据写入到缓存区,直到缓存区达到一定的量,才将数据写入硬盘中。这种操作不会像字节流和字符流那样每写一个字节都访问硬盘,从而减少了IO操作。·
  • 读取数据
   	File f = new File("F:/有感.txt");
   	// 创建文件字符流
   	//缓存流必须建立在一个存在的流上
   	try(
   			FileReader fr = new FileReader(f);
   			BufferedReader br = new BufferedReader(fr);)
   	{
   		while(true)
   		{
   			String line = br.readLine();
   			if(line == null)
   				break;
   			System.out.println(line);
   		}
   	}catch(IOException e) {
   		e.printStackTrace();
   	}
  • 写入数据
	File f = new File("F:/xx.txt");
	try(
		// 创建文件字符流
		FileWriter fw = new FileWriter(f);
		//缓存流必须建立在一个存在的流上
		PrintWriter pw = new PrintWriter(fw);)
	{
		pw.println("xxxxxxx");
		pw.println("xxxxxxx");
	}catch(IOException e) {
		e.printStackTrace();
	}
  • flush可以将数据立即写入硬盘,而不是等缓存满了之后才写进去。
...
	pw.println("xxxxxxx");
	pw.flush();//强制将缓存中的数据写入硬盘,无论缓存是否已满
	pw.println("xxxxxxx");
...
数据流
  • 数据输入流(DataInputStream)、数据输出流(DataOutputStream)。
  • 使用数据流的writeUTF()和readUTF()可以进行数据的格式化顺序读写。
  • 要用DatainputStream读取一个文件,这个文件必须是由DataOutputStream写入的,否则会出现EOFException.
   public static void main(String[] args)
   {
   	write();
   	read();
   }
   
   private static void read() {
   	File f = new File("F:/xx.txt");
   	try(
   			FileInputStream fis = new FileInputStream(f);
   			DataInputStream dis = new DataInputStream(fis);)
   	{
   		boolean b = dis.readBoolean();
   		int i = dis.readInt();
   		String str = dis.readUTF();
   		
   		System.out.print("布尔值:"+b);
   		System.out.print("整数:"+i);
   		System.out.print("字符串:"+str);

   	}catch(IOException e) {
   		e.printStackTrace();
   	}
   }
   
   private static void write() {
   	File f = new File("F:/xx.txt");
   	try(
   			FileOutputStream fos = new FileOutputStream(f);
   			DataOutputStream dos = new DataOutputStream(fos);)
   	{
   		dos.writeBoolean(true);
   		dos.writeInt(300);
   		dos.writeUTF("123 this is gareen");
   	}catch(IOException e)
   	{
   		e.printStackTrace();
   	}
   }
对象流
  • 对象流指的是可以直接吧一个对象以流的形式传输给其他的介质,比如硬盘。
  • 一个对象以流的形式传输,叫做序列化。该对象所对应的类,必须是实现Serializable接口。
	public static void main(String[] args)
	{
		//要保存对象,Hero类必须实现Serializable接口
		Hero h = new Hero();
		h.setName("英雄");
		//准备一个文件用于保存对象
		File f= new File("f:/hero.lol");
		try (
				//创建对象输出流
				FileOutputStream fos = new FileOutputStream(f);
				ObjectOutputStream oos = new ObjectOutputStream(fos);
				//创建对象输入流
				FileInputStream fis = new FileInputStream(f);
				ObjectInputStream ois = new ObjectInputStream(fis);
				){
			oos.writeObject(h);
			Hero h2 = (Hero) ois.readObject();
			System.out.println(h2.getname());
			
		}catch(IOException e) {
			e.printStackTrace();
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
System.in
  • System.out是常用的在控制台输出数据。
  • System.in可以从控制台输入数据。
	try (InputStream is = System.in;){
   		while(true) {
   			// 敲入a,然后敲回车可以看到
               // 97 13 10
               // 97是a的ASCII码
               // 13 10分别对应回车换行
   			int i = is.read();
   			System.out.println(i);
   		}
   	}catch(IOException e)
   	{
   		e.printStackTrace();
   	}
  • 使用Scanner可以实现逐行读取
		Scanner s = new Scanner(System.in);
		while(true)
		{
			//使用s.nextInt()可以读取整数
			String line = s.nextLine();
			System.out.println(line);
		}

在这里插入图片描述

  1. 流分为字节流和字符流
  2. 字节流下面常用的又有数据流和对象流
  3. 字符流下面常用的又有缓存流
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值