Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文件编码:保存的内容与读取时不同_Java_Character Encoding_Fileinputstream - Fatal编程技术网

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

我在用java保存文件时遇到了一个小问题。 由于某些原因,我保存文件后得到的内容与我阅读文件时得到的内容不同

我想这与文件编码有关,但不确定

下面是我编写的测试代码。其基本思想是读取文件,然后再次保存。 当我打开这两个文件时,它们是不同的

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 іва