DataOutputStream 设置utf-8

在Java中,DataOutputStream 本身并不直接支持字符编码(如UTF-8)的设置,因为它主要用于写入基本数据类型(如intlongfloat等)以及字节数据。但是,如果你需要写入UTF-8编码的字符串,你可以使用OutputStreamWriterBufferedWriterDataOutputStream一起工作,或者更简单地,直接使用OutputStreamWriterBufferedWriter

以下是一个使用OutputStreamWriterBufferedWriter将UTF-8编码的字符串写入到OutputStream的示例:


import java.io.*;  
  
public class UTF8WriterExample {  
    public static void main(String[] args) {  
        String textToWrite = "你好,世界!";  
  
        try (  
            OutputStream outputStream = new FileOutputStream("output.txt");  
            Writer writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))  
        ) {  
            writer.write(textToWrite);  
            System.out.println("String has been written to the file.");  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

在这个示例中,我们创建了一个FileOutputStream来写入到一个文件。然后,我们使用OutputStreamWriterOutputStream包装起来,并指定了字符编码为StandardCharsets.UTF_8。接着,我们进一步使用BufferedWriter来缓冲写入操作,以提高性能。最后,我们使用writer.write(textToWrite);将UTF-8编码的字符串写入到文件中。

如果你确实需要在同一OutputStream上使用DataOutputStream来写入基本数据类型和UTF-8编码的字符串,你可能需要在这两种写入方式之间做额外的协调。通常,你可能会首先写入一些元数据(如字符串的长度),然后使用OutputStreamWriter来写入字符串本身。但是,请注意,这样做可能会使你的代码更加复杂,并需要确保在读取数据时也能正确地处理这种混合写入方式。

HttpsURLConnection 传递utf-8 

在使用 HttpsURLConnection 发送请求时,如果你需要传递 UTF-8 编码的字符串作为请求体(例如在 POST 请求中),你需要确保在创建请求体时使用了正确的字符编码。下面是一个使用 HttpsURLConnection 发送 POST 请求并传递 UTF-8 编码字符串的示例:


import java.io.OutputStream;  
import java.net.HttpURLConnection;  
import java.net.URL;  
import java.nio.charset.StandardCharsets;  
  
public class HttpsURLConnectionExample {  
    public static void main(String[] args) {  
        String urlString = "https://example.com/api/endpoint";  
        String postData = "param1=value1&param2=value2"; // 假设这是你的POST数据  
  
        try {  
            URL url = new URL(urlString);  
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
            connection.setRequestMethod("POST");  
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");  
            connection.setRequestProperty("Content-Length", Integer.toString(postData.getBytes(StandardCharsets.UTF_8).length));  
            connection.setDoOutput(true);  
  
            try (OutputStream os = connection.getOutputStream()) {  
                byte[] input = postData.getBytes("UTF-8");  
                os.write(input, 0, input.length);  
            }  
  
            // 读取响应...  
            // int responseCode = connection.getResponseCode();  
            // ...  
  
            connection.disconnect();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}

在上面的示例中,我们设置了几个关键的请求属性:

  • Content-Type: 这告诉服务器请求体的媒体类型。在这种情况下,我们使用 application/x-www-form-urlencoded 并指定了字符集为 UTF-8。
  • Content-Length: 这告诉服务器请求体的长度。我们使用 postData.getBytes(StandardCharsets.UTF_8).length 来获取 UTF-8 编码后的字节长度。

然后,我们使用 OutputStream 将 UTF-8 编码的字符串作为字节写入到请求体中。请注意,我们在 try-with-resources 语句中使用了 OutputStream,以确保在完成后关闭它。但是,对于 HttpsURLConnection 本身,我们通常使用 connection.disconnect() 来确保连接被正确关闭。

如果你需要发送 JSON 或其他格式的请求体,你可能需要使用如 Jackson 或 Gson 这样的库来序列化对象,并确保在创建请求体时指定了正确的字符编码。在这种情况下,你仍然需要设置 Content-Type 头来反映你正在发送的数据类型(例如 application/json; charset=UTF-8)。

public static String HttpPostString(String url, Map<String, String> headers, String requestStr) { String responseStr = ""; HttpClient httpClient = null; HttpPost httpPost = null; try { if (org.springframework.util.StringUtils.hasLength(url) && url.startsWith("http://")) { httpClient = HttpClients.custom().build(); httpPost = new HttpPost(url); //组装http header httpPost.setHeader("Content-type", "text/xml;charset=UTF-8"); if (headers != null && headers.size() > 0) { for (Map.Entry<String, String> entry : headers.entrySet()) { httpPost.setHeader(entry.getKey(), entry.getValue()); } } //组装http entity if (org.springframework.util.StringUtils.hasLength(String.valueOf(requestStr))) { StringEntity entity = new StringEntity(String.valueOf(requestStr), Charset.forName("UTF-8")); entity.setContentEncoding("UTF-8"); entity.setContentType("text/xml"); if (headers != null && headers.size() > 0) { if (headers.containsKey("Content-Encoding")) { entity.setContentEncoding(headers.get("Content-Encoding")); } if (headers.containsKey("Content-Type")) { entity.setContentType(headers.get("Content-Type")); } } httpPost.setEntity(entity); } HttpResponse response = httpClient.execute(httpPost); int statusCode = response.getStatusLine().getStatusCode(); HttpEntity responseEntity = response.getEntity(); responseStr = EntityUtils.toString(responseEntity); System.out.println(statusCode + " | " + responseStr); } } catch (IOException e) { e.printStackTrace(); System.out.println("error:" + e.getMessage()); } finally { if (httpPost != null) httpPost.releaseConnection(); } return responseStr; }这是一段发送http请求代码,现在要改为json格式的
最新发布
11-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值