我想使用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?
答案 0 :(得分:1)
您的所有代码都没有尝试转换为字符;你传递字节不变,所以不必担心编码。您的代码可以正常工作。
只有当您使用Reader
和Writer
时才需要担心编码问题。
答案 1 :(得分:1)
假设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);
}
答案 2 :(得分:0)
如果您正在阅读的文件是以utf8编码的,那么您的代码将正常运行。如果不是,那么您可以使用GNU iconv将其转换为utf8,然后运行您的代码。这应该有用。
编辑:当你想在utf-8中写入数据时,你必须将FileOutputStream包装在OutputStreamWriter中并在创建时传递编码。