`
Luob.
  • 浏览: 1589842 次
  • 来自: 上海
社区版块
存档分类
最新评论

java之18天 IO 字符流(二)

    博客分类:
  • Java
阅读更多
FileWriter

/**
 * IO(Input Output)流
 * 作用:
 *   1)IO流用来处理设备之间的数据传递
 *   2)Java对数据的操作是通过流的方式
 *   3)Java用于操作流的兑现个都在IO包中
 *   4)流按操作的数据分为两种:字节流 (通用) 和 字符流(基于字节流)
 *   5)流按流向来分:输出流  和 输入流
 *   
 * IO流常用的基类
 *  字节流的抽象基类
 *  	InputStream,OutputStream.
 *  字符流的抽象基类
 *      Reader,Writer.
 *  注:由这四个类派生出来的子类名称都是一其父类名称作为子类的后缀
 *     如:InputStream的子类,FileInputStream
 *        Reader的子类,FileReader
 *  
 * 既然IO流是用户操作数据的
 * 那么数据的最长体现形式是:文件
 * 
 * 那么先以操作文件为主来演示:
 * 需求:在硬盘上,创建一个文件并写入一些文字数据.
 * 
 * 找到一个专门用于操作文件的Writer子类对象,FileWriter ,后缀名是父类名,前缀名是该流对象的功能.
 */
import java.io.FileWriter;
import java.io.IOException;
public class IODemo {

	public static void main(String[] args) throws IOException {
		//字符编码 
		//ASCII--中国(gbk)--国际组织(uncode(无论什么字符都用两个字节表示))-->UTF-8(优化uncode)
		
		//创建一个FileWriter对象,该对象一被初始化必须要明确被操作的文件.
		//而且该文件会被创建到指定的目录下,如果该目录下已有同名文件,则被覆盖.
		//其实该步骤就是在明确数据要存放的目的地.
		FileWriter fw=new FileWriter("demo.txt");
		
		//调用write方法,将字符串写入到流中
		fw.write("我想写入到文件中.");
		
		//刷行流对象中的缓冲的数据
		//将数据刷到目的地中.
		//发现写的时候不是换行写,是接着在后面写
		fw.flush();  //不刷新 ,上面流中的数据是不保存到文件中.
		
		fw.write("没关闭我就继续写,哈哈哈1.");
		fw.flush();
		
		//关闭资源,但是在关闭之前会刷行一次内存中缓冲的数据.
		//然后将数据刷到目的地中.
		//和flush的区别:flush刷新后,流还可继续使用,close刷新后,会将流关闭,流不能用了.
		fw.write("没关闭我就继续写,哈哈哈2.");
		fw.close();
		
		//fw.write("没关闭我就继续写,哈哈哈3.");  //发现挂了,说java.io.IOException: Stream closed
		
		//demo.txt最后的结果
		//我想写入到文件中.没关闭我就继续写,哈哈哈1.没关闭我就继续写,哈哈哈2.
	}

}


IO异常的处理方式
对已有文件的续写
window下的换行


/**
 * IO异常的处理方式
 * 
 * 对已有文件的续写
 */
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo2 {

	public static void main(String[] args) throws IOException {
		
		method_1();
	}
	//对已有的文件的数据的续写 (没有处理异常,注意)
	public static void method_1() throws IOException{
		//传递一个true 擦恕,代表不覆盖已有的文件,并在已有文具店 末尾处进行续写.
		FileWriter fw=new FileWriter("demo.txt",true);
		
		fw.write("nihao\r\n哈哈");//换行: window: \r\n  linux:\n
		fw.close();
		
	}
	
	//IO异常的标准处理方式
	public static void method(){
		FileWriter fw=null;
		try{
			fw=new FileWriter("k:\\demo.txt");//系统找不到指定的路径
			
			fw.write("开课写数据到流缓冲中!");
			//fw.close();  //异常后也需要处理 所以要放到 finally 里面
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			//fw.close(); //直接放到这里还不行,因为这句还会出异常.
			try {
				if(fw!=null)//系统找不到指定的路径
					fw.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

FileReader
当个字符读取
字符数组读取


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

public class FileReaderDemo {

	public static void main(String[] args) throws IOException {

		method_2();
		//method_1();
		
	}
	//第二种方式的变形 
	public static void method_2() throws IOException{
		FileReader fr=new FileReader("demo.txt");
		
		char[] buf=new char[1024];  //1024*2=2k 
		
		int num=0;
		while((num=fr.read(buf))!=-1){
			System.out.print(new String(buf,0,num));
		}
	}
	
	//第二种方式:通过字符数组进行读取  (没有做异常处理)
	public static void method_1() throws IOException{
		
		//demo.txt里面文本是: 我爱中华人民共和国我爱人民
		FileReader fr=new FileReader("demo.txt");
		char[] chs=new char[3];
		int num=fr.read(chs);
		System.out.println("num="+num+"...."+new String(chs));//num=3....我爱中
		int num1=fr.read(chs);
		System.out.println("num="+num1+"...."+new String(chs));//num=3....华人民
		int num2=fr.read(chs);
		System.out.println("num="+num2+"...."+new String(chs));//num=3....共和国
		int num3=fr.read(chs);
		System.out.println("num="+num3+"...."+new String(chs)); //num=3....我爱人
		
		//为什么会出现 "民爱人"
		//是将上一次的chs['我','爱','人']-->中的 "我"-->替换成 读取到的"民"
		int num4=fr.read(chs);
		System.out.println("num="+num4+"...."+new String(chs,0,1)); //num=1....民爱人
		System.out.println("num="+num4+"...."+new String(chs)); //num=1....民爱人
		
		
		//打印的还是上一次 保存的在数组中的数据
		int num5=fr.read(chs);
		System.out.println("num="+num5+"...."+new String(chs)); //num=-1....民爱人
		
		fr.close();
	}
	
	
	
	
	//第一种方式:  使用 read()每次读取一个 字符 
	public static void method() throws IOException{
		//创建一个文件读取流对象,和指定名称的文件相关联.
		//要保证该文件是已经存在的,如果不粗壮奶,会发生异常. FileNotFoundException
		FileReader fr=new FileReader("demo.txt");
	
		//调用读取流对象的read方法
		//read():一次读一个字符,而且会自动往下读,如果没有读取完了就返回 -1
		
		/*int ch=fr.read(); 
		System.out.println("ch="+(char)ch);
		int ch2=fr.read();
		System.out.println("ch2="+(char)ch2);*/
		
		//方式一
		/*while(true){
			int ch=fr.read(); 
			if(ch==-1)
				break;
			System.out.println("ch="+(char)ch);
		}*/
		//方式二 高效点
		int ch=0;
		while((ch=fr.read())!=-1){
			System.out.print((char)ch);
		}
		
		
		//关闭资源
		fr.close();
	}

}

练习:读取一个java文件,并打印在控制台上.

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

/**
 * 练习:读取一个java文件,并打印在控制台上.
 */
public class FileReaderTest {
	
	public static void main(String[] args) throws IOException {
		FileReader fr=new FileReader("E:\\workspace4\\exam\\src\\com\\itheima\\day18\\p1\\FileReaderDemo.java");
		char [] buf=new char[1024];
		int num=0;
		while((num=fr.read(buf))!=-1){
			System.out.println(new String(buf,0,num));
		}
		
	}

}


复制

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

/**
 * 需求:将CC盘的一个文本复制到D盘
 * 复制原理:
 *  其实就是将C盘下的文件数据存储到D盘的一个文件中.
 *  
 * 步骤:
 * 1) 在D盘中创建一个文件,用户存储C盘文件中的数据 
 * 2)定义读取流和C盘文件关联.
 * 3)通过不断的读写完成数据的存储.
 * 4)关闭资源
 */

public class CopyText {

	
	public static void main(String[] args) throws IOException {
		copy_2();
		//copy_1();
	}
	//使用 字符数组进行copy 提高效率 
	public static void copy_2(){
		
		FileWriter fw=null;
		FileReader fr=null;
		try {
			fw=new FileWriter("SystemDemo_copy.txt");
			
			fr=new FileReader("E:\\workspace4\\exam\\src\\com\\itheima\\day18\\SystemDemo.java");
			
			char[] cbuf=new char[1024];

			int len=0;
			while((len=fr.read(cbuf))!=-1){
				fw.write(cbuf, 0, len);
				fw.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();//读写失败
		}finally{
			if(fw!=null)
				try{
					fw.close();
				}catch(IOException e){
					e.printStackTrace();
				}
			
			if(fr!=null)
				try{
					fr.close();
				}catch(IOException e){
					e.printStackTrace();
				}
		}
		
	}
	
	
	//从C盘读取一个字符 ,就往D盘写一个字符
	public static void copy_1() throws IOException{
		//创建 目的地.
		FileWriter fw=new FileWriter("FileReaderDemo_copy.txt");
		
		//与已有文件关联
		FileReader fr=new FileReader("E:\\workspace4\\exam\\src\\com\\itheima\\day18\\p1\\FileReaderDemo.java");
		
		int ch=0;
		while((ch=fr.read())!=-1){
			fw.write(ch);
			//fw.flush();
		}
		fw.close();
		fr.close();  //数据不多可以直接关闭
	}
}



  • 大小: 28.5 KB
0
1
分享到:
评论

相关推荐

    黑马程序员_毕向东_Java基础视频教程第18天-13-IO流(拷贝文本文件).zip

    本教程《黑马程序员_毕向东_Java基础视频教程第18天-13-IO流(拷贝文本文件)》专注于讲解如何利用IO流来实现文本文件的复制操作。这个过程涉及到了对文件读取、数据缓冲以及写入等基础知识,对于初学者来说是理解和...

    黑马程序员_毕向东_Java基础视频教程第18天-11-IO流(文本文件读取方式二).zip

    在本教程“黑马程序员_毕向东_Java基础视频教程第18天-11-IO流(文本文件读取方式二)”中,主讲人毕向东将深入讲解如何使用Java有效地读取文本文件,特别是第二种常用的方法。以下是关于Java IO流和文本文件读取的...

    黑马程序员_毕向东_Java基础视频教程第18天-12-IO流(文本文件读取练习).zip

    在这个“黑马程序员_毕向东_Java基础视频教程第18天-12-IO流(文本文件读取练习)”中,毕向东老师将深入讲解如何使用Java IO流来读取文本文件。Java IO流提供了多种类和方法,使得开发者可以灵活高效地处理输入和输出...

    java基础18天Typora笔记

    Java基础18天 Typora笔记概述 这是一份专为Java初学者准备的学习资源,由魔乐科技提供,旨在帮助用户在18天内建立起坚实的Java编程基础。Typora是一款简洁而高效的Markdown编辑器,使得笔记整理和阅读更加便捷。...

    java教程-每日一课,27天java从入门到进阶

    精品java学习教程,原理讲解+...第15-18天:数组到集合 第19天:文件操作IO 第20、21天:IO流文件操作类图 第22天:其他流 第23天:多线程 第24天:多线程深入 第25天:GUI 第26天:网络变成 第27天:反射和设计模式

    java基础18天学习内容源码

    8. **IO流**:理解输入输出流的概念,包括文件操作、字符流和字节流的使用,以及缓冲区的概念。 9. **多线程**:学习如何创建和管理线程,理解同步机制(如synchronized关键字,wait(),notify()和notifyAll()方法...

    18天java学习之经典笔记

    "18天Java学习之经典笔记"是一份专为快速掌握Java基础知识而设计的学习资料,适用于那些希望在短时间内复习、备考或者准备面试的人员。这份笔记涵盖了Java的核心概念,通过18天的学习计划,帮助读者逐步理解并熟练...

    java18天笔记资料(推荐)

    本资源“java18天笔记资料(推荐)”显然是一份全面且深入的学习指南,旨在帮助初学者或有经验的开发者在18天内系统地掌握Java的核心概念和技术。这份笔记可能涵盖了从基础语法到高级特性的全方位讲解,是提升Java...

    达内core java 18天课程全代码

    在"达内core java 18天课程全代码"这个课程中,我们可以期待深入学习Java这门强大的编程语言的核心概念和技术。Java作为一款面向对象的编程语言,广泛应用于企业级应用、Android开发、大数据处理等多个领域。以下是...

    Java2 编程21天自学通

    9. **输入/输出流**:学习文件操作,包括字节流和字符流,以及缓冲流、对象序列化和文件复制。 10. **异常处理**:理解如何使用try-catch-finally语句块来捕获和处理异常,以及自定义异常。 11. **多线程**:掌握...

    java 15天教程下载,可供java初学者学习使用

    16 第16天IO流.docx 17 第17天字节流.docx 18 线程.docx 19 网络编程.docx 2 拓薪教育-java基础语法.docx 3 J2SE程序的流程控制.docx 5 第5天面向对象.docx 6 static静态关键字和单例模式.docx 7 第七天类的继承....

    Core java自学笔记(18天)

    - **Java之父**: James Gosling,被尊称为“Java之父”。 - **诞生日期**: 1995年5月23日。 - **重要版本**: - 1998年12月发布的1.2版本标志着Java 2的开始。 - 2004年12月发布的1.5版本被称为Java 5.0。 - **三大...

    Java_day18上课资料.zip

    5. **IO流**:Java的输入输出流系统用于读写文件、网络通信等,包括字符流和字节流,以及缓冲流、转换流等高级用法。 6. **线程与并发**:Java提供了强大的多线程支持,学习如何创建和管理线程,理解同步、互斥和...

    达内java基础培训课程

    Java的IO流系统支持对文件、网络等的数据读写,分为字节流和字符流两大类。 9. **集合框架** 包括List(如ArrayList、LinkedList)、Set(如HashSet、TreeSet)和Map(如HashMap、TreeMap)接口及其实现类,用于...

    Java学习资料.zip

    14. **IO流**:Java的输入/输出流系统支持读写文件、网络通信等,分为字节流和字符流。 15. **多线程**:Java内置对多线程的支持,理解线程同步和互斥的概念,如synchronized关键字和wait/notify机制。 16. **反射...

    毕向东_Java 25天基础源代码

    在Java的25天学习之旅中,你可以期待涵盖以下关键知识点: 1. **Java环境搭建**:首先,你需要了解如何安装JDK(Java Development Kit),设置环境变量,并通过`javac`和`java`命令进行编译和运行程序。 2. **基本...

    27天java训练*(详细到每一天训练目标和内容)

    在这一阶段,学习者将学习输入/输出流的概念,包括文件I/O、字节流和字符流,以及如何使用缓冲区进行高效的数据传输。 **第16-17天:多线程** Java支持多线程编程,学习者会学习如何创建和管理线程,理解同步和互斥...

    java 入门 21天 ppt

    "Java 入门 21天 ppt" 是一套专为初学者设计的学习资源,旨在帮助新接触Java的人在21天内掌握基础概念并建立起编程思维。 在21天的学习计划中,通常会涵盖以下关键知识点: 1. **Java简介**:介绍Java的历史、特点...

    21 天 学通 Java

    15. **输入输出流**:Java的I/O流系统支持读写文件、网络通信等功能,包括字节流、字符流和对象流。 16. **线程**:Java内置对多线程的支持,线程是程序执行的独立路径,学习如何创建和管理线程至关重要。 17. **...

    21天学通java(pdf格式)

    8. **输入/输出流**:理解I/O流的概念,包括文件读写、字节流和字符流的操作。 9. **集合框架**:包括List、Set和Map接口,以及ArrayList、LinkedList、HashSet、HashMap等具体实现类的使用。 10. **泛型**:学习...

Global site tag (gtag.js) - Google Analytics