【问题标题】:Fileoutputstream and UTF-8 File DownloadFileoutputstream 和 UTF-8 文件下载
【发布时间】:2015-07-16 17:20:47
【问题描述】:

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

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?

【问题讨论】:

  • 您正在传输字节不变,因此,结果将是源使用的任何编码。如果连接使用UTF-8,则结果将为UTF-8

标签: java file utf-8 fileoutputstream utf


【解决方案1】:

您的任何代码都不会尝试转换为字符;您通过不变地传递字节,因此无需担心编码。您的代码可以正常工作。

只有在使用Readers 和Writers 时才需要担心编码问题。

【讨论】:

    【解决方案2】:

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

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

    顺便说一句,使用最新的 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);
    }
    

    【讨论】:

    • 我没有使用任何其他工具,只是使用了HttpURLConnection。我编辑了我的代码并添加了完整的代码。我不知道我方使用之后打开文件是否使用UTF-8编码。能否请您查看我的完整代码并再次回答我的问题?
    • @javauser35:答案仍然成立。你没有在你的代码中使用任何工具,但是你正在存储一个文件,所以我想你有一天会打开它,不是吗?因此,您用来打开文件的工具必须采用与服务器相同的编码。如前所述,您的程序不会更改编码。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 2010-12-14
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多