JAVA学习第四十七课 — IO流(一):文件的读写

JAVA学习第四十七课 — IO流(一):文件的读写

大家好,又见面了,我是全栈君。

输入流和输出流相对于内存

将外部设备的数据读取到内存中:输入

将内存中的数据写入外部设备中:输出

IO流经常使用基类

字节流的抽象基类:InputStream,OutputStream

字符的抽象基类:Reader。Writer

PS:由这四个流派生出的子类都是以父类名作为后缀名

如:InputStream的派生类FileInputStream,Reader的派生类FileReader

PS:假设是文字形式的数据应该优先考虑字符流,且将数据从内存写到硬盘上应该是Writer

FileWriter类

演示:将文字储存到硬盘上(FileWriter)

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

public class Main 
{
	public static void main(String[] args) throws IOException{
//假设文件不存在。会自己主动创建,存在。会覆盖
		FileWriter fw = new FileWriter("Demo.txt");//抛异常
		
//调用Writer中的write方法,写入数据,但实际上数据写入的是暂时储存缓冲区中
		fw.write("你好");
	
//用flush方法刷新该流的缓冲。

假设该流已保存缓冲区中各种 write() 方法的全部字符,则马上将它们写入预期目标。 fw.flush();//能够用多次//关闭资源//关闭流,关闭资源,在关闭前会先调用flush刷新缓冲中的数据到目的地//API文档:关闭此流,但要先刷新它。

//在关闭该流之后。再调用 write() 或 flush() 将导致抛出 IOException。关闭曾经关闭的流无效。 fw.close();//仅仅能用一次 }}

PS:FileWriter的构造函数 FileWriter(“damo.txt”,true);续写数据,不写,默认是false,会覆盖原有数据

细节

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

public class Main 
{
	private static final String LINE_SEPARATOR = System.getProperty("line.separator");
	public static void main(String[] args) throws IOException{

		FileWriter fw = new FileWriter("Demo.txt",true);
		//构造函数,中加个true能够实现对文件的续写

		fw.write("你好"+LINE_SEPARATOR+"世界");//Windows下换行是\r\n,Linus下是\n
		fw.write(LINE_SEPARATOR+"ads");
		fw.flush();
		fw.close();
	}
}

关于流异常的基本处理

在try的外面创建引用。在里面创建对象,关闭时要推断是是否是空指针

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

public class Main 
{
	private static final String LINE_SEPARATOR = System.getProperty("line.separator");
	public static void main(String[] args){

		FileWriter fw = null;
		try {
			fw = new FileWriter("z:\\Demo.txt",true);//假设传入一个找不到的地址会抛出两个异常
						//找不到文件异常、空指针异常。所以finally部分。加一句推断是否是空指针
		fw.write("你好"+LINE_SEPARATOR+"世界");
		fw.flush();
		
		} catch (Exception e) {
			System.out.println(e.toString());
		}finally{
			//最后再try一次,单独处理
			if(fw!=null){
				try {
				fw.close();
				} catch (IOException e) {
				throw new RuntimeException("关闭失败");
				}
			}
		}	
	}
}


FileReader类

读取一个文本文件,并将读取出来的数据打印到控制台

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

public class Main 
{
	public static void main(String[] args) throws IOException {
		
		//一定要确保文件是存在的
		FileReader fr = new FileReader("g:\\java\\Main\\Demo.txt");//文件内容是ab
		
		//read方法,作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),假设已到达流的末尾,则返回 -1 

//		int c = fr.read();
//		System.out.println((char)c);
//		int c1 = fr.read();
//		System.out.println((char)c1);
//		int c2 = fr.read();
//		System.out.println(c2);//-1
		
		int temp;
		while((temp = fr.read())!=-1){
			System.out.println(temp);
		}
		fr.close();
	}
}

read();读取一个一个字符。相比之下,read()方法还有读取数组的重载形式:效率高

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

public class Main 
{
	public static void main(String[] args) throws IOException {
		
		FileReader fr = new FileReader("g:\\java\\Main\\Demo.txt");//文件内容是abcdef
		//使用read(char[] a)读取文本文件数据
		/*
		 * 先创建字符数组。 
		 */
//		char ch[] = new char[5];
//		int num = fr.read(ch);//将读取到的字符存储到数组中,num是字符的个数
//		System.out.println(num+":"+new String(ch));//5:abcde
//		
//		int num1 = fr.read(ch);//将读取到的字符存储到数组中
//		System.out.println(num1+":"+new String(ch));//1:fbcde
//		//这里相当于。f把原来数组里的a替换了。而txt里无数据了,所以剩余的数组元素还在
//
//		int num2 = fr.read(ch);//再读也没有数据了。所以返回-1,char数组无覆盖
//		System.out.println(num2+":"+new String(ch));//-1:fbcde
		
		//正规写法
		int num = 0; 
		
		char[] ch = new char[5];//数组的长度最好是1024*n
		
		while((num = fr.read(ch))!=-1){
			System.out.println(new String(ch,0,num));
		}
		
		fr.close();
	}
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115573.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sap 获取计划订单bapi_PP 常用bapi

    sap 获取计划订单bapi_PP 常用bapiBAPI:在SAP中可以允许使用BAPI访问标准功能,这些接口可以由外部应用程序开发的客户和配套软件的合作伙伴以及其他SAP应用程序使用。定义SAP业务对象类型的API方法,这些对象类型范围内的业务框架,用于基于对象的组件之间的通信。业务对象和他们的BAPI使面向对象是公司在中央信息处理。例如,现有的功能和数据可重复使用,无故障的技术可以实现的互操作性和非SAP组件可以实现。应用程序可以使用BAP…

    2022年7月24日
    19
  • 单片机控制步进电机程序c语言正反转停止,51单片机控制步进电机正反转并实现调速的程序设计…

    单片机控制步进电机程序c语言正反转停止,51单片机控制步进电机正反转并实现调速的程序设计…这是一款51单片机控制步进电机正反转的程序,同时还能实现调速。#include”reg51.h“#include“intrins.h”#defineucharunsignedchar#defineuintunsignedint#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};unsignedcharcodeFFW[8]…

    2022年5月15日
    44
  • python中yield的用法详解——最简单,最清晰的解释

    python中yield的用法详解——最简单,最清晰的解释首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受。接下来是正题:首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的retur…

    2022年7月23日
    8
  • Qt5.14.2下载与安装(保姆级图文教程)[通俗易懂]

    Qt5.14.2下载与安装(保姆级图文教程)[通俗易懂]本文详细介绍了Qt5.14.2的安装步骤,每一步都有详细说明,明确各个组件的含义,让安装组件不再纠结。教给你怎么获取、如何安装,如何卸载Qt等操作

    2022年5月16日
    54
  • matlab中fprintf函数的用法举例_matlabfopen函数的用法

    matlab中fprintf函数的用法举例_matlabfopen函数的用法fprintf函数在matlab具体应用clcclearage=18;name=’小飞’;fprintf(‘%s的年龄是%d。\n’,name,age)说明:\n表示换行示例clcclearsymsabna=5;b=4;n=30;D(1)=a+b;D(2)=(a+b).^2-a*b;fori=3:nD(i)=D(i-1)*(a+b)-a*b*D(i-2);fprint.

    2022年10月19日
    0
  • GoLand 2021.12.12激活[最新免费获取]

    (GoLand 2021.12.12激活)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0BXA05X8YC-eyJsa…

    2022年3月30日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号