java.io.IOException: Stream closed这个问题怎么解决啊~新人求助啊~

W_fat 2017-10-08 11:14:26
package cn.java;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

public class fferedDemo3 {

//@SuppressWarnings("null")
public static void main(String[] args) {
//创建输入流
Reader rd = null;
BufferedReader reader = null;

//创建输出流
Writer wr = null;
BufferedWriter writer = null;


try{
//创建一个对象


rd = new FileReader("d:/pet.template");
reader = new BufferedReader(rd);

String line;
StringBuffer sbf = new StringBuffer();
while((line=reader.readLine())!=null){
sbf.append(line);
}
System.out.println("替换前:"+sbf);
String newString = sbf.toString().replace("{name}","噢噢");
newString = newString.replace("{type}","小狗");
newString = newString.replace("{master}","小明");

wr = new FileWriter("e:/pet.txt");
writer = new BufferedWriter(wr);
writer.flush();
writer.write(newString);
System.out.println("替换后:"+newString);
}catch(IOException e){
e.printStackTrace();
}finally{
if(wr!=null){
try{
wr.close();
}catch(IOException e){
e.printStackTrace();
}
}
if(writer!=null){
try{
writer.close();
}catch(IOException e){
e.printStackTrace();
}
}
if(rd!=null){
try{
rd.close();
}catch(IOException e){
e.printStackTrace();
}
}
if(reader!=null){
try{
reader.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}

}
运行后会原本在d盘创建的pet文件会在这里输出时出现乱码,还会报:
java.io.IOException: Stream closed
at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:26)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:99)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
at java.io.BufferedWriter.close(BufferedWriter.java:246)
at cn.java.fferedDemo3.main(fferedDemo3.java:58)

求各位大神帮助解决
...全文
2611 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wellven_chen 2017-10-09
  • 打赏
  • 举报
回复
Windows上的编码默认已经改是GBK吧。 File f = new File(路径); FileInputStream Fis = new FileInputStream(f); InputStreamReader Isr = new InputStreamReader(Fis,"GBK"); BufferedReader Br = new BufferedReader(Isr); 用这个读试试
qq_39912309 2017-10-09
  • 打赏
  • 举报
回复
设置eclipse的编码了吗?
W_fat 2017-10-09
  • 打赏
  • 举报
回复
设置了 UTF-8 而且其他编码我也试过了 都不行
W_fat 2017-10-09
  • 打赏
  • 举报
回复
W_fat 2017-10-09
  • 打赏
  • 举报
回复
可是为什么还是会出现乱码呢?是不是因为我在pet.template这个文件中没有转码?还是说需要在代码中对pet.template这个文件内容进行转码?
偏安zzcoder 2017-10-09
  • 打赏
  • 举报
回复
不用了,看了下代码,你的writer这个对象是基于wr这个对象创建的,而你先close掉了wr再close的writer,这就会导致writer进行close操作时无法 close掉wr在writer中的副本,所以close的顺序应该与创建对象时的顺序相反,即先colse掉writer再close掉wr。

			if(writer!=null){
				try{
					writer.close();
				}catch(IOException e){
					e.printStackTrace();
				}
			}
			if(wr!=null){
				try{
					wr.close();
				}catch(IOException e){
					e.printStackTrace();
				}
			}
偏安zzcoder 2017-10-09
  • 打赏
  • 举报
回复
楼主能不能把你的pet.template内容发一下
W_fat 2017-10-09
  • 打赏
  • 举报
回复
哦~~谢谢大神啦
偏安zzcoder 2017-10-09
  • 打赏
  • 举报
回复
引用 9 楼 W_fat 的回复:
可以了 谢谢大神啦 能不能解释一下这是为啥呢?
windows的默认编码是GBK,而Java运行时的编码是Unicode,也就是说Java虚拟机会默认认为读取得字符流是Unicode编码的,这就导致了乱码 如有纰漏还请指正
W_fat 2017-10-09
  • 打赏
  • 举报
回复
可以了 谢谢大神啦 能不能解释一下这是为啥呢?
W_fat 2017-10-08
  • 打赏
  • 举报
回复
在线等挺急的~

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧