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();//只能用一次
	}
}

细节

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()方法还有读取数组的重载形式:效率高

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

时间: 2024-12-26 00:28:49

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

JAVA学习第五十七课 — IO流(十一)

一.管道流 PipedInputStream 和 PipedOutPutStream 输入和输出能够直接进行连接.结合线程使用 管道流,顾名思义,写一个读一个.连成一个管子 API文档:管道输入流应该连接到管道输出流:管道输入流提供要写入管道输出流的全部数据字节.通常,数据由某个线程从 PipedInputStream 对象读取,并由其它线程将其写入到对应的 PipedOutputStream. 不建议对这两个对象尝试使用单个线程.由于这样可能死锁线程. 管道输入流包括一个缓冲区.可在缓冲区限定

JAVA学习第五十课 — IO流(四)转换流

一.键盘录入 System.out:标准输出设备,控制台 System.in:标准输入设备,键盘 输入演示 输入字符串遇到回车,打印,输入over,输入结束 PS:键盘的录入只读取一个字节,先将字节拼一个字符串,所以需要一个容器,再参与over的判断 import java.io.*; public class Main { public static void main(String[] args) throws IOException { InputStream in = System.in

JAVA学习第五十三课 — IO流(七)File对象练习 & Properties集合

一.练习 深度遍历文件夹 深度遍历很自然而然想到递归,而递归就很自然的想到其实现的底层算法是栈 对指定目录下列出所有内容(包含子目录的内容) PS:建议不要遍历C盘 import java.io.*; public class Main { public static void main(String[] args) throws IOException { File dir = new File("D:\\ACM集训"); ListAllDemo(dir,0); } public s

JAVA学习第五十一课 — IO流(五)流的操作基本规律

转换流: InputStreamReader:字节到字符的桥梁.解码 OutputStreamWriter:字符到字节的桥梁.编码 流的基本规律 1.明确源和汇 源:InputStream.Reader 汇:OutputStream.Writer 2.明确数据是否是纯文本数据 源:如果是,Reader,否,InputStream 汇:如果是,Writer,否,OutputStream 前两点明确后院,体系也就明确了 3.明确具体的设备 源设备: 硬盘:File 键盘:System.in 内存:

java学习第21天(IO流的使用)

IO流分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流 字节输出流 字符流 字符输入流 字符输出流 注意: a:如果我们没有明确说明按照什么分,默认按照数据类型分. b:除非文件用windows自带的记事本打开我们能够读懂,才采用字符流,否则建议使用字节流. 构造 FileOutputStream写出数据 FileOutputStream fos = new FileOutputStream("f.txt") fos.write("Hel

JAVA学习笔记(四十七)- 事件监听

定义ActionListener接口的实现类实现事件监听 import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; /* * 事件监听 */ public class Te

Java学习之路(十一):IO流<前戏>

File类的概述和构造方法 构造方法: File(String pathname):根据一个路径得到File对象 File(String parent,String child):根据一个目录和一个子文件/目录 得到File对象 File(File parent,String child):根据一个父File对象和一个子文件/目录得到File对象 File更应该叫做一个路径,文件 路径  或者  文件夹  路径 File是指文件或者目录路径名的抽象表示形式 创建功能: public boolea

JAVA学习第四十课(常用对象API)- Map集合练习

一.LinkedHashMap集合 import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; public class Main { public static void main(String[] args) { HashMap<Integer, String> hm = new LinkedHashMap<Integer,Stri

JAVA学习第四十三课 — 集合框架工具类(一)

一.Collections:集合框架的工具类 其中的方法都是静态的 排序方法演示 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; class ComparaByLeng implements Comparator<String>{ public int compare(String o1, String o2) { int