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();
	}
}


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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • PFX 证书转 JKS

    PFX 证书转 JKS在阿里云上申请了一个SSL证书(Symantec免费版SSL),下载下来的是pfx格式的证书。使用的是jetty服务器,需要转换为jks格式。下载的压缩包:PFX证书转JKSkeytool-importkeystore-srckeystoremycert.pfx-srcstoretypepkcs12-destkeystoremycert.jks-d…

  • 二叉树层序遍历(C语言)[通俗易懂]

    二叉树层序遍历(C语言)[通俗易懂]二叉树的层序遍历即从上到下,在每一层从左到右依次打印数据。如下:层序遍历结果:ABCDEFG基本思路即将根节点入队后,之后每次都将队首元素出队,打印队首元素数据,并将队首元素左右子树入队,一直重复上述过程。自然,本题还可以用数组来实现。代码:#include<stdio.h>#include<stdlib.h>#defineQueueMax100typedefstructNode{chardata;structNode*

  • Ubuntu卸载软件_ubuntu软件卸载

    Ubuntu卸载软件_ubuntu软件卸载之前安装teamviewer的时候,强制进行安装,结果安装失败,并且,之后无论运行任何apt-getintsll命令都会报错:解决办法是:直接将这个软件删除掉就行了,运行以下命令:sudoapt-getremove–purgeteamviewer:i386

  • python读取图片名称_照片文件名怎么改jpg

    python读取图片名称_照片文件名怎么改jpgPython读取文件夹下的.jpg图片,提取图片的文件名。最近做的图像处理,需要读取文件夹下所有图片和对应的文件名,进行相关处理,最后保存的图片要求文件的名称与原图名称一致。百度找了好多例子也没找到,最后零零碎碎的搜索,通过一些个人的思考把相关的知识点和程序结合,总算做出来了。举个简单的功能:读取文件夹下的图片和对应的图片名,先处理成灰度图像,再进行保存,要求保存的图片的名称与原图名称一致。效果如下:读取F:\image下的000~004.jpg,最后处理的灰度图片保存在F:\image\sa

  • Android面试题(四大组件篇)[通俗易懂]

    Android面试题(四大组件篇)[通俗易懂]Android面试题(四大组件篇)window、进程、线程篇Android面试题(数据存储、view篇)ActivityQ:说下Activity的生命周期?Q:onStart()和onResume()/onPause()和onStop()的区别?是否位于前台,对用户是否可见的区别Q:ActivityA启动另一个ActivityB会回调哪些方法?如果A…

  • 无刷直流电动机驱动控制系统_直流无刷电机驱动电路

    无刷直流电动机驱动控制系统_直流无刷电机驱动电路无刷直流电动机利用电子开关线路和位置传感器来代替有刷直流电机电刷和换向器,使其同时具有直流电动机和交流电动机的优良特性。无刷直流电机(驱动系统)主要由电动机本体、位置传感器、电子开关线路三部分组成。

    2022年10月21日

发表回复

您的电子邮箱地址不会被公开。

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