import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象。
FileWriter fw = new FileWriter("demo.txt");
fw.write("abcde");//调用write方法,将字符串写入到流中。
fw.flush();//将数据刷到目的地中。
fw.close();//关闭资源
}
}
2)IO异常处理方式
import java.io.*;
class FileWriterDemo2
{
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());
}
}
}
}
3)对已有文件续写
2、读取字符流步骤
1)创建一个文件读取流对象,和指定名称的文件相关联。要保证该文件已经存在,若不存在,将会发生异常FileNotFoundException。
2)调用读取流对象的read()方法。read():一次读一个字符,且会继续往下读。
第一种方式:读取单个字符。第二种方式:通过字符数组进行读取。
3)读取后要调用close方法将流资源关闭。
示例:
import java.io.*;
class FileReaderDemo {
public static void main(String[] args){
singleCharReader();
arrayCharReader();
}
// 第一种读取方式,单个字符读取
public static void singleCharReader() {
FileReader fr = null;
try {
fr = new FileReader("demo.txt");
int ch = 0;
while ((ch = fr.read()) != -1) {
System.out.println(ch);
}
} catch (IOException e) {
throw new RuntimeException("读取失败");
} finally {
if (fr != null)
try {
fr.close();
} catch (IOException e) {
throw new RuntimeException("关闭资源失败");
}
}
}
//第二种读取方式
public static void arrayCharReader() {
FileReader fr = null;
try {
fr = new FileReader("FileWriterDemo.java");
// 定义一个字符数组。用于存储读到字符。。
char[] buf = new char[1024];
int len = 0;
while ((len = fr.read(buf)) != -1) {
System.out.println(new String(buf, 0, len));
}
} catch (Exception e) {
throw new RuntimeException("读取失败");
} finally {
if (fr != null)
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注意:
//将C盘一个文本文件复制到D盘。
/*
复制的原理:
其实就是将C盘下的文件数据存储到D盘的一个文件中。
步骤:
1,在D盘创建一个文件。用于存储C盘文件中的数据。
2,定义读取流和C盘文件关联。
3,通过不断的读写完成数据存储。
4,关闭资源。
*/
import java.io.*;
public class CopyTest {
public static void main(String[] args) {
copy_2();
}
//第一种方式
public static void copy_1() throws IOException{
//创建目的地
FileWriter fw = new FileWriter("D:\\FileWriterDemo.java");
//与已有文件关联
FileReader fr = new FileReader("C:\\FileWriterDemo.java");
int ch = 0;
while((ch=fr.read())!=-1){
fw.write(ch);
}
//关闭流资源
fw.close();
fr.close();
}
public static void copy_2(){
FileWriter fw = null;
FileReader fr = null;
try {
fw = new FileWriter("D:\\FileWriterDemo.java");
fr = new FileReader("C:\\FileWriterDemo.java");
char[] buf = new char[1024];
int len = 0;
while((len=fr.read(buf))!=-1){
fw.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fr!=null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fw!=null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public class CopyFile {
public static void main(String[] args) {
BufferedReader bufr = null;//创建读缓冲对象
//创建写缓冲对象
BufferedWriter bufw = null;
try {
bufr = new BufferedReader(new FileReader("BufreredReaderDemo.java"));
bufw = new BufferedWriter(new FileWriter("bufWriter.txt"));
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);//写入指定文件中
bufw.newLine();//换行
bufw.flush();//将缓冲区数据刷到指定文件中
}
} catch (IOException e) {
throw new RuntimeException("文件复制失败");
}finally{//关闭资源
if(bufw!=null){
try {
bufw.close();
} catch (IOException e) {
throw new RuntimeException("写入流关闭失败");
}
}
if(bufr!=null){
try {
bufr.close();
} catch (IOException e) {
throw new RuntimeException("读取流关闭失败");
}
}
}
}
}
5、自定义BufferedReader
import java.io.*;
class MyBufferedReader extends Reader
{
private Reader r;
MyBufferedReader(Reader r)
{
this.r = r;
}
//可以一次读一行数据的方法。
public String myReadLine()throws IOException
{
//定义一个临时容器。原BufferReader封装的是字符数组。
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=r.read())!=-1)
{
if(ch=='\r')
continue;//如果遇到换行符\r则继续
if(ch=='\n')
return sb.toString();//如果遇到\n则读取完
else
sb.append((char)ch);//将数据添加到容器
}
if(sb.length()!=0)
return sb.toString();
return null;//如果读取完,还有字符,则返回字符
}
/*
覆盖Reader类中的抽象方法。
*/
public int read(char[] cbuf, int off, int len) throws IOException
{
return r.read(cbuf,off,len) ;
}
public void close()throws IOException
{
r.close();
}
public void myClose()throws IOException
{
r.close();
}
}
class MyBufferedReaderDemo
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("buf.txt");
MyBufferedReader myBuf = new MyBufferedReader(fr);
String line = null;
while((line=myBuf.myReadLine())!=null)
{
System.out.println(line);
}
myBuf.myClose();
}
}
6、LineNumberReader
/*需求:
利用LineNumberReader的特有方法去设置和获取文件中数据的行号 */
import java.io.*;
public class LineNumberReaderDemo {
public static void main(String[] args){
LineNumberReader lnr = null;
try {
lnr = new LineNumberReader(new FileReader("RuntimeDemo.java"));
lnr.setLineNumber(100);//设置行号
String line = null;
while((line=lnr.readLine())!=null){
System.out.println(lnr.getLineNumber()+":"+line);
}
} catch (IOException e) {
throw new RuntimeException("读取数据失败");
}finally{
if(lnr!=null)
try {
lnr.close();
} catch (IOException e) {
throw new RuntimeException("读取流关闭失败");
}
}
}
}
class Person
{
public void chifan()
{
System.out.println("吃饭");
}
}
class SuperPerson
{
private Person p ;
SuperPerson(Person p)
{
this.p = p;
}
public void superChifan()
{
System.out.println("开胃酒");
p.chifan();
System.out.println("甜点");
System.out.println("来一根");
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
//p.chifan();
SuperPerson sp = new SuperPerson(p);
sp.superChifan();
}
}
import java.io.*;
class copyPic
{
public static void main(String[] args)throws IOException
{
FileInputStream fis = new FileInputStream("fos.txt");
// int num = fis.available();
byte[] buf = new byte[fis.available()];//定义一个刚刚好的缓冲区。不用在循环了。
fis.read(buf);
System.out.println(new String(buf));
fis.close();
}
}
使用字节数据方式复制
import java.io.*;
class CopyPic
{
public static void main(String[] args)
{
FileOutputStream fos = null;
FileInputStream fis = null;
try
{ //关联复制的文件
fos = new FileOutputStream("d:\\2.jpg");
//指定复制的路径
fis = new FileInputStream("d:\\1.jpg");
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1)
{//复制文件的全部数据
fos.write(buf,0,len);
}
}
catch (IOException e)
{
throw new RuntimeException("复制文件失败");
}
finally
{
try
{
if(fis!=null)
fis.close();//关闭字节输入流
}
catch (IOException e)
{
throw new RuntimeException("读取关闭失败");
}
try
{
if(fos!=null)
fos.close();//关闭字节输出流
}
catch (IOException e)
{
throw new RuntimeException("写入关闭失败");
}
}
}
}
/*
自定义字节流读取缓冲区
*/
import java.io.*;
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf = new byte[1024*4];
private int pos = 0,count = 0;
MyBufferedInputStream(InputStream in)
{
this.in = in;
}
//一次读一个字节,从缓冲区(字节数组)获取。
public int myRead()throws IOException
{
//通过in对象读取硬盘上数据,并存储buf中。
if(count==0)
{
count = in.read(buf);
if(count<0)//当文件数据全部被读取完
return -1;
pos = 0;//初始化指针
byte b = buf[pos];
count--;//每读一个字节,数组中的字节个数就少一
pos++;
return b&255;
}
else if(count>0)//如果数组中的数据没读取完,则继续读取
{
byte b = buf[pos];
count--;
pos++;
return b&0xff;
}
return -1;
}
//自定义关闭资源方法
public void myClose()throws IOException
{
in.close();
}
}
//测试自定义输入字节流缓冲区
class CopyMp3
{
public static void main(String[] args) throws IOException
{
long start = System.currentTimeMillis();
copy();
long end = System.currentTimeMillis();
System.out.println((end-start)+"毫秒");
}
//使用缓冲区字节流进行复制
public static void copy_2()throws IOException
{
MyBufferedInputStream bufis = new MyBufferedInputStream(new FileInputStream("D:\\告别的时代.mp3"));
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("D:\\告别的时代_副本.mp3"));
int by = 0;
while((by=bufis.myRead())!=-1)
{
bufos.write(by);
}
bufos.close();
bufis.myClose();
}
}
import java.io.*;
class TransStreamDemo
{
public static void main(String[] args) throws IOException
{
//获取键盘录入对象。
//InputStream in = System.in;
//将字节流对象转成字符流对象,使用转换流。InputStreamReader
//InputStreamReader isr = new InputStreamReader(in);
//为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader
//BufferedReader bufr = new BufferedReader(isr);
//键盘的最常见写法。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
// OutputStream out = System.out;
// OutputStreamWriter osw = new OutputStreamWriter(out);
// BufferedWriter bufw = new BufferedWriter(osw);
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
}
}
/*需求:
将键盘录入的数据存储到一个文件中
源:键盘
目的:文件*/
import java.io.*;
class TransStreamDemo2
{
public static void main(String[] args) throws IOException
{
System.setIn(new FileInputStream("PersonDemo.java"));
System.setOut(new PrintStream("zzz.txt"));
//键盘的最常见写法。
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileInputStream("buf.txt","UTF-8")));
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
}
}
附:
import java.io.*;
import java.util.*;
import java.text.*;
class ExceptionInfo
{
public static void main(String[] args)throws IOException
{
try
{
int[] arr = new int[2];
System.out.println(arr[3]);
}
catch (Exception e)
{
try
{
Date d = new Date();//创建时间对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//更改时间格式
String s = sdf.format(d);
PrintStream ps = new PrintStream("exeception.log");//创建打印流对象
ps.println(s);
System.setOut(ps);//输出时间
}
catch (IOException ex)
{
throw new RuntimeException("日志文件创建失败");
}
e.printStackTrace(System.out);
}
}
}
2、系统属性信息存入文本
/*将系统信息打印到指定文本中*/
import java.util.*;
import java.io.*;
class SystemInfo
{
public static void main(String[] args) throws IOException
{
Properties prop = System.getProperties();
prop.list(new PrintStream("sysinfo.txt"));
}
}
3、通过System类的setIn,setOut方法可以对默认设备进行改变