字符流和字节流:
字节流两个基类:InputStream OutputStream
字符流两个基类:字符流在内部融合编码表,字符指定编码格式,gbk,unicode,utf-8。
Reader Writer
先学习一下字符流的特点。
既然IO流是用于操作数据的,那么数据的最常见体现形式是:文件。
那么先以操作文件为主来演示。
需求:在硬盘上,创建一个文件并写入一些文字数据。
找到一个专门用于操作文件的Writer子类对象。FileWriter。后缀名是父类名。前缀名是该流对象的功能。
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
//其实该步就是在明确数据要存放的目的地。
FileWriter fw = new FileWriter("demo.txt");
//调用write方法,将字符串写入到流中。
fw.write("abcde");
//刷新流对象中的缓冲区中的数据。
//将数据刷到目的地中。
//fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
//将数据刷到目的地中。
//和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
fw.close();;
}
}
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
//其实该步就是在明确数据要存放的目的地。
FileWriter fw = new FileWriter("demo.txt");
//调用write方法,将字符串写入到流中。
fw.write("abcde");
//刷新流对象中的缓冲区中的数据。
//将数据刷到目的地中。
//fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
//将数据刷到目的地中。
//和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
fw.close();;
fw.write("haha");
}
}
//输出 编译报错流资源已关闭不可写入。
Exception in thread "main" java.io.IOException: Stream closed
at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:118)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:135)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:220)
at java.io.Writer.write(Writer.java:157)
at FileWriterDemo.main(FileWriterDemo.java:21)
IO异常的处理方式
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo0 {
public static void main(String[] args) {
FileWriter fw = null;
try{
fw = new FileWriter("demo.txt");
fw.write("abcdefg");
}catch (IOException e)
{
System.out.println("catch:"+e.toString());
}finally {
try
{
if (fw!=null)
fw.close();
}catch (IOException e)
{
System.out.println(e.toString());
}
}
}
}
对已有文件的数据续写
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo1 {
public static void main(String[] args) throws IOException
{
//传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
FileWriter fw = new FileWriter("demo.txt",true);
fw.write("nihao\nxiexie");//windows系统换行是加\r\n
fw.close();
}
}
IO流文本文件读取方式一
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException
{
//创建一个文件读取流对象,和指定名称的文件相关联。
//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
FileReader fr = new FileReader("demo.txt");
//调用读取流对象的read方法。
//read():一次读一个字符。而且会自动往下读。
while (true)
{
int chr = fr.read();
if (chr == -1)
break;;
System.out.println("chr="+(char)chr);
}
}
}
//输出
chr=a
chr=b
chr=c
chr=d
chr=e
chr=f
chr=g
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException
{
//创建一个文件读取流对象,和指定名称的文件相关联。
//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
FileReader fr = new FileReader("demo.txt");
//调用读取流对象的read方法。
//read():一次读一个字符。而且会自动往下读。
int ch = 0;
while ((ch=fr.read())!=-1)
{
System.out.println((char) ch);
}
}
}
//输出
a
b
c
d
e
f
g
IO流文本文件读取方式二
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo0 {
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("demo.txt");
//定义一个字符数组。用于存储读到字符。
//该read(char[])返回的是读到的字符个数。
//num表示读到的字符个数
char[] buf = new char[1024];
int num = 0;
while ((num=fr.read(buf))!=-1)
{
System.out.println(new String(buf,0,num));
}
fr.close();
}
}
//输出
abcdefg
读取一个.java文件,并打印在控制台上。
import java.io.FileReader;
import java.io.IOException;
public class FileReaderTest {
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("DateDemo.java");
char[] buf = new char[1024];
int num = 0;
while ((num = fr.read(buf))!= -1)
{
System.out.println(new String(buf,0,num));
}
fr.close();
}
}
//输出
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
Date d = new Date();
System.out.println(d);//打印的时间看不懂,希望有些格式
//将模式封装到SimpleDateformat对象中
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日E hh:mm:ss");
//调用format方法让模式格式化指定Date对象
String time = sdf.format(d);
System.out.println("time="+time);
}
}
将C盘一个文本文件复制到D盘
复制的原理:
其实就是将C盘下的文件数据存储到D盘的一个文件中。
步骤:
1.在D盘创建一个文件。用于存储C盘文件中的数据。
2.定义读取流和C盘文件关联。
3.通过不断的读写完成数据存储。
4.关闭资源。
复制方式一
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyText {
public static void main(String[] args) throws IOException
{
copy_1();
}
//从C盘读一个字符,就往D盘写一个字符。
public static void copy_1() throws IOException
{
//创建目的地。
FileWriter fw = new FileWriter("DateDemo_copy.txt");
//与已有文件关联
FileReader fr = new FileReader("DateDemo.java");
int ch = 0;
while ((ch=fr.read())!=-1)
{
fw.write(ch);
}
fw.close();
fr.close();
}
}
复制方式二
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyText {
public static void main(String[] args) throws IOException {
// copy_1();
copy_2();
}
public static void copy_2() throws IOException {
FileWriter fw = null;
FileReader fr = null;
try {
fw = new FileWriter("SystemDemo_copy.txt");
fr = new FileReader("SystemDemo.java");
char[] buf = new char[1024];
int len = 0;
while ((len = fr.read(buf)) != -1) {
fw.write(buf, 0, len);
}
} catch (IOException e) {
throw new RuntimeException("读写失败");
} finally {
try {
if (fr != null)
fr.close();
;
} catch (IOException e) {
throw new RuntimeException("读写失败");
} finally {
if (fw != null)
try {
fw.close();
} catch (IOException e) {
throw new RuntimeException("读写失败");
}
}
}
}
//从C盘读一个字符,就往D盘写一个字符。
public static void copy_1() throws IOException {
//创建目的地。
FileWriter fw = new FileWriter("DateDemo_copy.txt");
//与已有文件关联
FileReader fr = new FileReader("DateDemo.java");
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
fw.close();
fr.close();
}
}
另一种写法,两个if分别判断fw和fr是否为空。
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyText {
public static void main(String[] args) throws IOException {
// copy_1();
copy_2();
}
public static void copy_2() throws IOException {
FileWriter fw = null;
FileReader fr = null;
try {
fw = new FileWriter("SystemDemo_copy.txt");
fr = new FileReader("SystemDemo.java");
char[] buf = new char[1024];
int len = 0;
while ((len = fr.read(buf)) != -1) {
fw.write(buf, 0, len);
}
} catch (IOException e) {
throw new RuntimeException("读写失败");
} finally {
if (fr!=null)
try {
fr.close();
}catch (IOException e)
{
throw new RuntimeException("读写失败");
}
if (fw!=null)
try {
fw.close();
}catch (IOException e)
{
throw new RuntimeException("读写失败");
}
}
}
//从C盘读一个字符,就往D盘写一个字符。
public static void copy_1() throws IOException {
//创建目的地。
FileWriter fw = new FileWriter("DateDemo_copy.txt");
//与已有文件关联
FileReader fr = new FileReader("DateDemo.java");
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
fw.close();
fr.close();
}
}