Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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 Fileoutputstream和UTF-8文件下载_Java_File_Utf 8_Fileoutputstream_Utf - Fatal编程技术网

Java Fileoutputstream和UTF-8文件下载

Java Fileoutputstream和UTF-8文件下载,java,file,utf-8,fileoutputstream,utf,Java,File,Utf 8,Fileoutputstream,Utf,我想使用InputStream和FileOutputStream下载文件。我的代码如下所示: URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // optional default is GET con.setRequestMethod("GET"); con.setRequestProperty("Cache-Control", "no-cache");

我想使用
InputStream
FileOutputStream
下载文件。我的代码如下所示:

URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();

// optional default is GET
con.setRequestMethod("GET");

con.setRequestProperty("Cache-Control", "no-cache");


int responseCode = con.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
try {
    InputStream inputStream = con.getInputStream();
    FileOutputStream outputStream = new FileOutputStream("C:\\programs\\TRYFILE.csv");

    int bytesRead = -1;
    byte[] buffer = new byte[4096];
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, bytesRead);
    }

} catch(Exception e) {
    //
} finally {
    outputStream.close(); 
    inputStream.close();
}  
代码运行良好,可以下载文件。但是我想知道,如果一个文件包含土耳其语字符(ş、Ğ、İ、Ö等),那么这段代码会下载包含这些字符的文件吗?因此,我想下载包含这些字符的文件(如果包括这些字符),并在我的文件中看到这些字符


那么,这段代码与UTF-8配合得好吗?

如果您正在阅读的文件是用utf8编码的,那么您的代码就可以正常工作。如果不是,则可以使用将其转换为utf8,然后运行代码。这应该行得通


编辑:当您想在utf-8中写入数据时,必须将FileOutputStream包装在OutputStreamWriter中,并在创建时传递编码

没有代码试图转换为字符;您通过未更改的方式传递字节,因此无需担心编码问题。你的代码可以正常工作


只有当您使用
Reader
s和
Writer
s时,您才需要担心编码。

假设
con
URLConnection
的一个实例,它的
getInputStream()
将为您提供一个直接的网络流,读取服务器发送的字节。不会进行任何转换。由于将字节直接传输到文件中,因此它们将存储在文件中,无需任何修改

假设服务器使用
UTF-8
编码发送文件,并且您随后用来打开文件的工具也使用
UTF-8
编码,您将正确看到所有字符。这同样适用于任何其他编码,只要服务器和工具使用相同的编码。您的程序不会添加任何内容,因为它只是传输字节,而不是字符

顺便说一句,使用最新的API可以简化这种传输:

try(ReadableByteChannel in=Channels.newChannel(con.getInputStream());
    FileChannel out=FileChannel.open(Paths.get("C:\\programs\\TRYFILE.csv"),
        StandardOpenOption.CREATE, StandardOpenOption.WRITE,
        StandardOpenOption.TRUNCATE_EXISTING)) {
    out.transferFrom(in, 0, Long.MAX_VALUE);
}
当您使用
import static java.nio.file.StandardOpenOption.*时,它的可读性更高

try(ReadableByteChannel in=Channels.newChannel(con.getInputStream());
    FileChannel out=FileChannel.open(Paths.get("C:\\programs\\TRYFILE.csv"),
                                     CREATE, WRITE, TRUNCATE_EXISTING) {
    out.transferFrom(in, 0, Long.MAX_VALUE);
}

您传输的字节不变,因此,结果将是源代码使用的任何编码。如果连接使用
UTF-8
,结果将是
UTF-8
。我不使用任何不同的工具,只是HttpURLConnection。我编辑了我的代码并添加了完整的代码。我不知道我的一方在以后打开文件时是否使用了UTF-8编码。你能看看我的完整代码并再次回答我的问题吗?@javauser35:答案仍然有效。您没有在代码中使用任何工具,但是您正在存储一个文件,所以我想您总有一天会打开它,不是吗?因此,用于打开文件的工具必须采用与服务器相同的编码。如上所述,您的程序不会更改编码。