在这里,我正在尝试将一个文件的内容复制到另一个文件。内容必须完全相同,但是我有些异常。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
BufferedReader br = null;
BufferedWriter bw =null;
Scanner scan = new Scanner(System.in);
System.out.println("Enter the input file name");
String input = scan.nextLine();
System.out.println("Enter the output file name");
String output = scan.nextLine();
try {
br = new BufferedReader(new InputStreamReader(
new FileInputStream(input), "UTF-8"));
bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(output)));
int ch = 0;
while((ch = br.read()) != -1){
bw.write((char)ch);
}
} catch (IOException e) {
}
finally
{
try {
if(br != null && bw != null){
br.close();
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
scan.close();
}
}
用户必须输入输入文件名,输入文件的内容将被复制到输入的输出文件名中。
testInput.txt
我给了自己一年的时间在柏林创办一本新杂志来拍摄 时代精神,面对着城市的文化气息 筹集必要现金的预期挑战。
testOutput.txt
我给了自己一年的时间在柏林创办一本新杂志以捕捉 时代精神,在面对城市的同时享受城市的文化气息 筹集必要现金的预期挑战。
答案 0 :(得分:1)
评论“您用什么来查看输入,用什么来查看输出?”是您应该采取的行动。
是什么使您得出结论,输出的“内容”包括那些欧元和tm符号?文本文件中的字符串也具有编码,因此您首先要考虑的是确保用于查看的工具能够正确处理该编码。
奇怪的标记之前带有â,经常使用原始工具(如记事本)查看utf-8编码的文件,该文件假定每个字符一个字节的加密机制,通常为iso-8859-1。错误不在文件中,而是在查看工具中选择。
否则:文件仅包含字节。即使它们的后缀为“ .txt”。即使这些字节代表“只是字符串”,仍然仍然会发生编码/解码,并且从创建/写入字节到查看/读取字节的链中的每个工具都必须知道使用了哪种编码。工具经常盲目地采用机器的默认编码,而在当今utf-8绝对受到欢迎的今天,这种假设通常是错误的。 (尤其是在Windows计算机上。)
答案 1 :(得分:0)
尝试
bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(output), StandardCharsets.UTF_8)));
因为OutputStreamWriter文档说:
如果您不指定一个,它只会使用默认的文件编码 默认语言环境。
答案 2 :(得分:0)
您的问题是由于字符编码引起的。
您正在使用UTF-8
,但它似乎无法显示’
字符(即ASCII字符8217)。
因此,您可以:
CP1252
(br = new BufferedReader(new InputStreamReader(
new FileInputStream(input), "CP1252"));
)答案 3 :(得分:0)
如果要按原样查看内容,则应使用不带charset参数的方法。在这种情况下,它将选择默认样式。
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(input)));
...
}