//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件
//而且该文件会被创建到指定的目录下,如果该目录下已有同名文件,将被覆盖
//其实该步骤就是在明确数据要存放的具体位置
FileWriter fw=new FileWriter("D://demo.txt");
//调用write方法,将数据写入到流中
fw.write("abcdef");
//刷新流对象中的缓冲区中的数据
// fw.flush();
// fw.write("bbbbbbbbbb");
// fw.flush();
//关闭流资源,但是关闭之前会进行刷新一次内部的缓冲中的数据
fw.close();
}
//声明文件对象
FileWriter fw=null;
try {
//创建文件夹
fw = new FileWriter("D://demo.txt");
//写入内容
fw.write("abcdef");
} catch (IOException e) {
System.out.println(e.toString());
}finally{
try {
//判断文件对象是否为空
if(fw!=null)
fw.close();//关闭流
} catch (IOException e) {
System.out.println(e.toString());
}
}
}
//创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件是已经存在,如果不存在,会发生FileNotFoundException
FileReader fr=new FileReader("Demo.txt");
int ch=0;
while((ch=fr.read())!=-1){
System.out.println((char)ch);
}
fr.close();
}
FileReader fr=new FileReader("demo.txt");
//定义一个字符数组,用于存储读到字符
//该read(cahr[])返回的是读到的字符的个数
char[] buf=new char[1024];
int num=0;
while((num=fr.read(buf))!=-1){
System.out.print(new String(buf,0,num));
}
fr.close();
}
FileWriter fw=null;
FileReader fr=null;
try {
fw=new FileWriter("拷贝的目的路径");
fr=new FileReader("读取文件的路径");
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("写入关闭失败");
}
}
作用:缓冲区的出现提高了对数据的读写效率
对应类:BufferedWriter和BufferedReader
缓冲区的特点:要结合流才能使用,在流的基础上对流的功能进行了增强
所以在创建缓冲区之前,必须先要有流对象。
BufferedWriter类(字符写入缓冲区)
newLine():该缓冲区中提供了一个跨平台的换行符,只有在缓冲区中才有。
public static void main(String[] args) throws IOException {
//创建了一个文件写入流对象
FileWriter fw=new FileWriter("demo.txt");
//为了提高字符写入流效率,加入了缓冲区技术
//只要将需要被提高的流对象作为参数传递给缓冲区的构造函数即可
BufferedWriter bufw=new BufferedWriter(fw);
for (int i = 1; i <= 3; i++) {
bufw.write("abc"+i);
bufw.newLine();
bufw.flush();//只要用到缓冲区就要记得刷新
}
bufw.close(); //其实关闭缓冲区就是在关闭缓冲区中的流对象,所以不需要fw.close().
}
输出结果为:
abc 1
abc 2
abc 3
BufferedReader类(字符读取缓冲区)
readLine():该缓冲区提供了一个一次读取一行的方法,方便于对文本数据的获取
当返回null时,表示读到文件末尾,该方法返回的时候只返回回车符
之前的数据内容,并不返回回车符。
public static void main(String[] args) throws IOException {
//创建一个读取流对象和文件相关联
FileReader fr=new FileReader("demo.txt");
//为了提高效率,加入缓冲技术,将字符读取流对象作为参数传递给缓冲对象的构造函数
BufferedReader bufr=new BufferedReader(fr);
String line=null;
while((line=bufr.readLine())!=null){
System.out.println(line);
}
bufr.close();
}
通过缓冲区复制一个java文件
public static void main(String[] args) {
BufferedReader bufr=null;
BufferedWriter bufw=null;
try {
bufr=new BufferedReader(new FileReader("要复制的文件路径"));
bufw=new BufferedWriter(new FileWriter("复制到指定的路径"));
String line=null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();
}
} catch (Exception e) {
throw new RuntimeException("读取失败");
}
finally{
try {
if(bufr!=null)
bufr.close();
} catch (IOException e) {
throw new RuntimeException("读取关闭失败");
}
try {
if(bufw!=null)
bufw.close();
} catch (IOException e) {
throw new RuntimeException("写入关闭失败");
}
}
}
private FileReader fr;
MyBufferedReader(FileReader fr){
this.fr=fr;
}
public String myReaderLine() throws IOException{
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=fr.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
public void myClose() throws IOException{
fr.close();
}
}
class Test{
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("读取的文件路径");
MyBufferedReader myBuf=new MyBufferedReader(fr);
String line=null;
while((line=myBuf.myReaderLine())!=null){
System.out.println(line);
}
myBuf.myClose();
}
}
FileReader fr=new FileReader("读取文件的路径");
LineNumberReader Inr=new LineNumberReader(fr);
}
//private Reader r;
private int lineNumber;
MyLineNumberReader(Reader r){
//this.r=r;
super(r);
}
public String myReaderLine() throws IOException{
lineNumber++;
return super.myReaderLine();
/*StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=r.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;*/
}
public void serLineNumber(int lineNumber){
this.lineNumber=lineNumber;
}
public int getLineNumber(){
return lineNumber;
}
/*public void myClose() throws IOException{
r.close();
}*/
}
class Tset{
public static void main(String[] args) {
FileReader fr=new FileReader("读取的文件路径");
MyLineNumberReader myInr=new MyLineNumberReader(fr);
String line=null;
while((line=myInr.myReaderLine())!=null){
System.out.println(myInr.getLineNumber()+"-----"+line);
}
myInr.myClose();
}
}
* 写入操作
*/
public static void writeFile() throws IOException{
FileOutputStream fos=new FileOutputStream("写入存放的路径");
fos.write("abcdef".getBytes());
fos.close();
}
/*
* 单个读取操作
*/
public static void readFile1() throws IOException{
FileInputStream fis=new FileInputStream("所要读取的路径");
int ch=0;
while((ch=fis.read())!=-1){
System.out.println((char)ch);
}
fis.close();
}
/*
* 多个读取操作
*/
public static void readFile2() throws IOException{
FileInputStream fis=new FileInputStream("所要读取的路径");
byte[] buf=new byte[1024];
int len=0;
while((len=fis.read(buf))!=-1){
System.out.println(new String(buf,0,len));
}
fis.close();
}
/*
* 此方法同样可以操作多个,但是要慎用,因为当操作的数据过大时内存容易溢出
*/
public static void readFile3() throws IOException{
FileInputStream fis=new FileInputStream("所要读取的路径");
byte[] buf=new byte[fis.available()]; //定义了一个刚刚好的缓冲区,不用在循环了。
fis.read(buf);
System.out.println(new String(buf));
fis.close();
}
/*
* 测试操作
*/
public static void main(String[] args) throws IOException {
writeFile();
readFile2();
}
复制一个图片的例子
思路:
1.用字节读取流对象和图片关联
2.用字节写入流对象创建一个图片文件,用于存储获取到的图片数据
3.通过循环读写,完成数据的存储
4关闭资源
public static void main(String[] args) {
FileOutputStream fos = null;
FileInputStream fis = null;
try {
fos = new FileOutputStream("复制到指定的路径");
fis = new FileInputStream("读取文件所在的路径");
byte[] buf = new byte[1024];
int len = 0;
while ((len = fis.read(buf))!= -1) {
System.out.println(new String(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("写入文件失败");
}
}
字节流的缓冲区
BufferedInputStream
BufferedOutputStream
/*
* 通过字节流缓冲区完成复制
*/
public static void main(String[] args) throws IOException {
BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("读取文件所在的路径"));
BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("复制到指定的路径"));
int by=-0;
while((by=bufis.read())!=-1){
bufos.write(by);
}
bufis.close();
bufos.close();
}
自定义字节流的缓冲区---read和write的特点
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{
if(count==0){
count=in.read(buf);
if(count<0){
return -1;
}
pos=0;
byte b=buf[pos];
count--;
pos++;
return b&255;//255的16进制形式0xff.
}else if(count>0){
byte b=buf[pos];
count--;
pos++;
return b;
}
return -1;
}
public void myColse() throws IOException{
in.close();
}
}
读取键盘录入(读取转化流,字节流转换为字符流)
/*
* System.out:对应的是标准输出设备,控制台
* System.in:对应的是标准输入设备,键盘
*/
public static void main(String[] args) throws IOException {
//获取键盘录入对象
InputStream in=System.in;
//将字节流对象转成字符流对象,使用转换流,InputStreamReader
InputStreamReader isr=new InputStreamReader(in);
//为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader
BufferedReader bufr=new BufferedReader(isr);
String line=null;
while((line=bufr.readLine())!=null){
if("over".equals(line)){
break;
}
//把字符串转换为大写
System.out.println(line.toUpperCase());
}
bufr.close();
}
读取键盘录入(写入转化流,字符流转换为字节流)
/*
* System.out:对应的是标准输出设备,控制台
* System.in:对应的是标准输入设备,键盘
*/
public static void main(String[] args) throws IOException {
//获取键盘录入对象
InputStream in=System.in;
//将字节流对象转成字符流对象,使用转换流,InputStreamReader
InputStreamReader isr=new InputStreamReader(in);
//为了提高效率,将字符串进行缓冲区技术高效操作,使用BufferedReader
BufferedReader bufr=new BufferedReader(isr);
OutputStream out=System.out;
OutputStreamWriter osw=new OutputStreamWriter(out);
BufferedWriter bufw=new BufferedWriter(osw);
String line=null;
while((line=bufr.readLine())!=null){
if("over".equals(line)){
break;
}
//把字符串转换为大写
bufw.write(line.toUpperCase());
bufw.flush();
}
bufr.close();
}
转换时优化代码
//键盘录入的最常见写法
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));