萌新求教 Java 转码问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
w11ya
V2EX    问与答

萌新求教 Java 转码问题

  •  
  •   w11ya 2023-01-05 11:09:57 +08:00 1859 次点击
    这是一个创建于 1097 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有一个导出文本文件后,文本文件能用 GBK 编码打开的需求,但是原来的代码是这样的

    InputStream inputStream = minioUtil.getObject(minioConfig.getBucketName(), fileVersion.getFsId()); 

    然后设置响应体的文件类型和响应头

    response.setContentType(contentType); response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); response.setHeader("Content-Length", "" + length); response.setHeader("fileName", "" + fileName); 

    然后通过这个工具类去把 inputstream 流到 outputstream

    IOUtils.copy(inputStream, outputStream); 

    我的想法一开始是用

    Reader r = new InputStreamReader(inputStream,"utf-8"); BufferedReader br = new BufferedReader(r); Writer w = new OutputStreamWriter(outputStream,"GBK"); BufferedWriter bw = new BufferedWriter(w); String s = null; while((s= br.readLine())!=null){ bw.write(s); } br.close(); bw.close(); 

    发现导出不了,发送的请求是 pending ,然后过了两分钟响应 200 ,弹不出文件保存框。 然后尝试用这个

    byte[] buffer = new byte[8192]; int n; byte[] dest = new byte[8192]; while(-1 != (n = inputStream.read(buffer))) { dest=new String(buffer,0,n,"UTF-8").getBytes("GBK"); outputStream.write(dest); } 

    也失败,发送请求 pending ,响应是 504 Gateway Time-out nginx ,弹不出文件保存框。

    10 条回复    2023-01-05 17:04:58 +08:00
    temp178
        1
    temp178  
       2023-01-05 11:23:52 +08:00
    第三段代码:
    1 、是不是卡在 br.readLine() 了?建议 加日志看看具体 pending 到哪个位置
    2 、浏览器下载文件,需要设置相关的响应头里的,可以查下相关资料
    3 、bw 是服务端对浏览器的输出流,应该不用关闭,可以 flush 一下
    w11ya
        2
    w11ya  
    OP
       2023-01-05 11:45:23 +08:00
    我在代码的最后加了个日志,日志内容输出了。浏览器下载文件我直接写 streamresponse.setContentType(application/octet-stream),也没用。txt 文件下载不了,但是可以下载 rar 文件,就是下到 99%就停了。已经 flush 了
    sparklee
        3
    sparklee  
       2023-01-05 12:05:57 +08:00
    文件写完直接 redirect 一个 文件下载地址,
    OctopusGO
        4
    OctopusGO  
       2023-01-05 13:30:04 +08:00
    编码转换的有错误,先转换成 UTF-8,然后再用 GBK 读取还原成字符串,再写出
    String s = new String(buffer,"UTF-8");
    String s2 = new String(s.getBytes("GBK"), "GBK");
    outputStream.write(s2.getBytes(),0,n);
    OpenSea
        5
    OpenSea  
       2023-01-05 13:31:02 +08:00
    bw.close()后再 br.close()
    OpenJdk
        6
    OpenJdk  
       2023-01-05 13:46:08 +08:00
    @OctopusGO
    String s = new String(buffer, "UTF-8");
    outputStream.write(s.geyBytes("GBK", 0, n)
    OpenJdk
        7
    OpenJdk  
       2023-01-05 13:46:30 +08:00
    OpenJdk
        8
    OpenJdk  
       2023-01-05 13:49:20 +08:00
    @OctopusGO
    你这样拿不到该字符串的 GBK 编码字节流。得这样
    String s = new String(buffer, "UTF-8");
    outputStream.write(s.geyBytes("GBK"), 0, n)
    w11ya
        9
    w11ya  
    OP
       2023-01-05 13:59:10 +08:00
    @OpenJdk 这个就是我尝试的那个吧
    w11ya
        10
    w11ya  
    OP
       2023-01-05 17:04:58 +08:00
    谢谢大佬们的回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3424 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 11:14 PVG 19:14 LAX 03:14 JFK 06:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86