Java 文件编码:保存的内容与读取时不同
我在用java保存文件时遇到了一个小问题。 由于某些原因,我保存文件后得到的内容与我阅读文件时得到的内容不同 我想这与文件编码有关,但不确定 下面是我编写的测试代码。其基本思想是读取文件,然后再次保存。 当我打开这两个文件时,它们是不同的Java 文件编码:保存的内容与读取时不同,java,character-encoding,fileinputstream,Java,Character Encoding,Fileinputstream,我在用java保存文件时遇到了一个小问题。 由于某些原因,我保存文件后得到的内容与我阅读文件时得到的内容不同 我想这与文件编码有关,但不确定 下面是我编写的测试代码。其基本思想是读取文件,然后再次保存。 当我打开这两个文件时,它们是不同的 package workspaceFun; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOExce
package workspaceFun;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.commons.codec.DecoderException;
public class FileSaveTest {
public static void main(String[] args) throws IOException, DecoderException{
String location = "test.location";
File locationFile = new File(location);
FileInputStream fis = new FileInputStream(locationFile);
InputStreamReader r = new InputStreamReader(fis, Charset.forName("UTF-8"));
System.out.println(r.getEncoding());
StringBuilder builder = new StringBuilder();
int ch;
while((ch = fis.read()) != -1){
builder.append((char)ch);
}
String fullLocationString = builder.toString();
//Now we want to save back
FileOutputStream fos = new FileOutputStream("C:/Users/me/Desktop/test");
byte[] b = fullLocationString.getBytes();
fos.write(b);
fos.close();
r.close();
}
}
输入文件的摘录(使用升华2以纯文本形式打开):
并从输出文件:
40c2 b1c2 8bc2 8123 c2bc 0014 1a25 c296
getEncoding方法返回“UTF8”。尝试使用相同的字符集保存输出文件似乎无法解决问题
让我困惑的是,当我尝试使用十六进制读取输入文件时,如下所示:
String hexLocationString2 = Hex.encodeHexString(fullLocationString.getBytes("UTF-8"));
字符串看起来已经像我的输出文件,而不是输入文件
你知道会出什么问题吗?
谢谢
对于那些感兴趣的人,我正在尝试阅读一个eclipse.location文件
编辑:以便您可以测试代码我相信这就是您读取流的方式 您正在使用
FileInputStream
直接读取内容,而不是将其包装在InputStreamReader
通过使用InputStreamReader
可以确定要使用的Charset
考虑到InputStream中定义的字符集必须与您期望的相同,因为InputStream不检测字符集,它只是以特定的格式读取它们
尝试以下更改:
InputStreamReader r = new InputStreamReader(new FileInputStream(locationFile), StandardCharsets.UTF_8);
然后使用r.read()
最后,在写入字符串时,获取与读取器相同的Charset
中的字节
FileOutputStream fos = new FileOutputStream("C:/Users/me/Desktop/test");
fos.write(fullLocationString.getBytes(StandardCharsets.UTF_8));
fos.close()
尝试按如下方式读写:
public class FileSaveTest {
public static void main(String[] args) throws IOException {
String location = "D:\\test.txt";
BufferedReader br = new BufferedReader(new FileReader(location));
StringBuilder sb = new StringBuilder();
try {
String line = br.readLine();
while (line != null) {
sb.append(line);
line = br.readLine();
if (line != null)
sb.append(System.lineSeparator());
}
} finally {
br.close();
}
FileOutputStream fos = new FileOutputStream("D:\\text_created.txt");
byte[] b = sb.toString().getBytes();
fos.write(b);
fos.close();
}
}
测试文件包含循环字符和拉丁字符
SDFASDF
XXFsd1
12312
іва
SDFASDF
XXFsd1
12312
іва
我相信如果没有设置任何字符集,它将默认为您的默认字符集(在您的情况下,
UTF-8
)尝试添加一个字符集作为InputStreamReader
中的第二个参数InputStreamReader仅用于查看编码。我不做任何处理。好的。嗯,我也尝试过UTF-8:)。问题没有改变,可能需要一个OutputStreamWriter来设置文件OutputStream的字符集刚刚尝试过,也没有改变任何东西:嗯,当我直接使用inputstreamreader而不是FileInputStream时,确实有一些改变。但是结果仍然不一样:s40ef bfbd efbf bdef bfbd 23ef bfbd 0014您能检测出哪个编码是原始文件吗?inputstreamreader告诉我它是utf8。这就是为什么我感到困惑。我在帖子中添加了一个链接,这样你就可以下载我想要的文件了。谢谢你的帮助这里有误解。。。InputStreamReader不“检测”编码,它只读取指定编码中的字节。。。尝试将编码从UTF_8更改为ISO_8859_1btw。。。使用ISO_8859_1,然后在您的文件和我的输出(Windows命令行中的fc命令)之间进行文件比较,结果是:fc:未遇到任何差异..请,请不要使用FileReader
和.getBytes()
,而不进行编码!当然,编码是非常重要的。我这样做是作为一个例子(首先是编码),然后我删除了编码,它也起了作用。(按照这个问题的创建者提出的方法,我的文件无法读取,正如您可能看到的,他使用了编码)
SDFASDF
XXFsd1
12312
іва